用户画像生成器(人物画像生成软件)

Flask是Django之外用Python实现的另一个优秀的Web框架。今天就使用它。Flask以自由灵活著称。开发一些小应用的时候,用Django会牛刀杀鸡,

Flask是Django之外用Python实现的另一个优秀的Web框架。

今天就使用它。

Flask以自由灵活著称。开发一些小应用的时候,用Django会牛刀杀鸡,用Flask很合适。本文将使用Flask开发一个微博用户画像生成器,最终结果如下:

用户画像生成器(人物画像生成软件)

开发步骤如下:

抓取微博用户数据;

分析所述数据以生成用户画像;

实现和美化网站的界面。

第一,微博抢

这里以移动终端的微博(m.weibo.cn)为例。本教程使用chrome浏览器调试。

在“发现”中搜索“古力娜扎”,点击进入她的主页;

开始分析请求报文,右键打开调试窗口,选择调试窗口的“网络”选项卡;

选择“保留日志”以刷新页面;

对每个请求过程的分析显示,博客帖子的数据来自https://m.weibo.cn/api/container/getIndex?. XXX的一个类似的地址。主要参数是类型(固定值)、值(blogger ID)、containerid(标识,在请求中返回)和页面(页码)

用户画像生成器(人物画像生成软件)

下面是抓取博客文章的代码。

#导入相关的库导入请求

从时间进入睡眠

#定义获取blogger信息的函数#参数uid是blogger的id

defget_user_info(uid):

#发送请求

result = requests . get(' https://m . Weibo . cn/API/container/getIndex?type = uid & ampvalue={} '

。格式(uid))

Json_data = result.json() #获取熙熙攘攘信息中的Json内容

userinfo = {

' name ':JSON _ data[' userinfo '][' screen _ name '],#获取用户的头像

' description ':JSON _ data[' userinfo '][' description '],#获取用户描述

' follow _ count ':JSON _ data[' userinfo '][' follow _ count '],#获取关注者的数量

' followers _ count ':JSON _ data[' userinfo '][' followers _ count '],#获取粉丝数

' profile _ image _ URL ':JSON _ data[' userinfo '][' profile _ image _ URL '],#获取头像

'已验证原因':JSON _ data ['userinfo'] ['已验证原因'],#验证信息

' container id ':JSON _ data[' Tabs info '][' Tabs '][1][' container id ']#获取博客帖子时需要此字段。

}

#了解性别。在微博中,M代表男性,F代表女性。

if JSON _ data[' userInfo '][' gender ']= = ' m ':

性别= '男性'

elif JSON _ data[' userInfo '][' gender ']= = ' f ':

性别= '女性'

否则:

性别= '未知'

userinfo['gender'] =性别

返回用户信息

#获取古力娜扎信息userinfo = Get _ user _ info(' 1350995007 ')

#以下信息为userinfo

{ '容器ID':' 1076031350995007 ','描述':'工作请联系:nazhagongzuo @ 163.com ',

' follow_count': 529

followers_count': 12042995,

姓名:“我是娜扎”,

'profile_image_url': 'https://tvax2.sinaimg.cn/crop.0.0.1242.1242.180/50868c3fly8fevjzsp2j4j20yi0yi419.jpg',' profile _ image _ URL ':' https://tvax 2 . Sina img . cn/crop . 0 . 0 . 1242 . 1242 . 180/50868 C3 fly 8 fevjzsp 2j 4j 20 yi 0 yi 419 . jpg ',

已验证_原因':'演员,代表作《天道之选》}

在[33]中:

#循环获取所有博客文章defget _ all _ post (UID,containerID):

#从第一页开始

page = 0

#这用于存储博客文章列表

帖子= []

虽然正确:

#请求博客帖子列表

result = requests . get(' https://m . Weibo . cn/API/container/getIndex?type = uid & ampvalue = { } & ampcontainerid = { } & amppage={} '

。格式(uid,containerid,page))

json_data = result.json()

#获得博文后,退出循环。

如果不是json_data['cards']:

破裂

#循环将新的博客文章添加到列表中

对于json_data['cards']中的I:

posts . append(I[' mblog '][' text '])

#暂停半秒钟,以免成为反爬虫

睡眠(0.5)

#跳到下一页

页面+= 1

#退回所有博客帖子

返回帖子

posts = get _ all _ posts(' 1350995007 ',' 1076031350995007') #查看博文数量len(posts)

279 #显示前3篇文章[:3]

用户画像生成器(人物画像生成软件)

此时,用户的数据已经准备好了,接下来就是用户画像的生成。

第二,生成用户画像

1.提取关键词

这里从博客列表中提取关键词,分析博主发布的热词。

从html2text导入html2text

content = '\n '。join([html 2 text(I)for I in post])

#在这里,我们用jieba的textrank提取1000个关键词及其比例。

result = jieba . analyze . text rank(content,topK=1000,withWeight=True)

#生成关键字比例字典

关键字=字典()

因为我的结果是:

关键词[i[0]] = i[1]

2.生成单词云图

从PIL导入图像,图像序列将numpy作为np导入

将matplotlib.pyplot作为plt导入

从wordcloud导入WordCloud,ImageColorGenerator

#初始化图片

image = Image.open('。/static/images/personas . png’)

graph = np.array(image)

#生成云图。这里需要注意的是,WordCloud默认不支持中文,需要在这里加载中文粗体字库。

wc = WordCloud(font_path= '。/fonts/simhei.ttf ',

background_color='white ',max_words=300,mask=graph)

生成频率(关键词)

image _ color = ImageColorGenerator(图形)

#显示图片plt.imshow(wc)

PLT . im show(WC . re color(color _ func = image _ color))

Plt.axis("off") #关闭图像坐标系

plt.show()

用户画像生成器(人物画像生成软件)

第三,实现烧瓶的应用。

开发Flask不像Django那么复杂,几个文件就能搞定。步骤如下:

1.装置

使用pip安装烧瓶。该命令如下所示:

$ pip安装框架2。实现应用程序逻辑

简单来说,Flask应用就是一个Flask类,它的url请求由route函数控制。代码实现如下:

# app . py从烧瓶导入烧瓶

导入请求

从PIL导入图像,图像序列

将numpy作为np导入

将matplotlib.pyplot作为plt导入

从wordcloud导入WordCloud,ImageColorGenerator

进口解霸

从html2text导入html2text

从时间进入睡眠

从集合导入订单直接

从烧瓶导入render_template,请求

#创建一个烧瓶应用程序

app = Flask(__name__)

##################################

#微博关联功能#

#定义获取blogger信息的函数

#参数uid是博客作者的id

def获取用户信息(uid):

#发送请求

result = requests . get(' https://m . Weibo . cn/API/container/getIndex?type = uid & ampvalue={} '

。格式(uid))

Json_data = result.json() #获取熙熙攘攘信息中的Json内容

#了解性别。在微博中,M代表男性,F代表女性。

if JSON _ data[' userInfo '][' gender ']= = ' m ':

性别= '男性'

elif JSON _ data[' userInfo '][' gender ']= = ' f ':

性别= '女性'

否则:

性别= '未知'

userinfo = OrderedDict()

Userinfo['昵称']= JSON _ data[' userinfo '][' screen _ name ']#获取用户的头像

Userinfo['性别'] =性别#性别

userinfo[' followers ']= JSON _ data[' userinfo '][' follow _ count ']#获取关注者

Userinfo['粉丝数']= JSON _ data[' userinfo '][' followers _ count ']#获取粉丝数

Userinfo['认证信息'] = JSON _ data ['userinfo'] ['验证_原因'] #获取粉丝数

userinfo[' description ']= JSON _ data[' userinfo '][' description ']#获取粉丝数

数据= {

' profile _ image _ URL ':JSON _ data[' userinfo '][' profile _ image _ URL '],#获取头像

' container id ':JSON _ data[' Tabs info '][' Tabs '][1][' container id '],#获取博客帖子时需要此字段

userinfo ':' & lt;' br & gt'。join(['{}:{} '。将userinfo.items()])中的(k,v)格式化为(k,v)

}

返回数据

#循环浏览所有博客文章

def get_all_post(uid,containerid):

#从第一页开始

page = 0

#这用于存储博客文章列表

帖子= []

虽然正确:

#请求博客帖子列表

result = requests . get(' https://m . Weibo . cn/API/container/getIndex?type = uid & ampvalue = { } & ampcontainerid = { } & amppage={} '

。格式(uid,containerid,page))

json_data = result.json()

#获得博文后,退出循环。

如果不是json_data['cards']:

破裂

#循环将新的博客文章添加到列表中

对于json_data['cards']中的I:

posts . append(I[' mblog '][' text '])

#暂停半秒钟,以免成为反爬虫

睡眠(0.5)

#跳到下一页

页面+= 1

#退回所有博客帖子

返回帖子

##############################

# #云图相关函数

#生成云图像

定义生成角色(uid,data_list):

content = ' & lt' br & gt'。join([html 2 text(I)for I in data _ list])

#在这里,我们用jieba的textrank提取1000个关键词及其比例。

result = jieba . analyze . text rank(content,topK=1000,withWeight=True)

#生成关键字比例字典

关键字=字典()

因为我的结果是:

关键词[i[0]] = i[1]

#初始化图片

image = Image.open('。/static/images/personas . png’)

graph = np.array(image)

#生成云图。这里需要注意的是,WordCloud默认不支持中文,需要在这里加载中文粗体字库。

wc = WordCloud(font_path= '。/static/fonts/simhei.ttf ',

background_color='white ',max_words=300,mask=graph)

生成频率(关键词)

image _ color = ImageColorGenerator(图形)

plt.imshow(wc)

PLT . im show(WC . re color(color _ func = image _ color))

Plt.axis("off") #关闭图像坐标系

dest_img = './static/personas/{}.png'.format(uid)dest_img = '。/static/personas/{}。巴布亚新几内亚。格式(uid)

plt.savefig(dest_img)plt.savefig(dest_img)

return dest_img返回dest_img

#######################################

#定义路线

#指定根路径请求的响应函数

@app.route('/',methods=['GET ',' POST'])

定义索引():

#将模板数据初始化为空

userinfo = {}

#如果是Post请求,并且有微博用户id,则获取微博数据,生成对应的云图。

# request.method的值是请求方法。

# request.form是提交的表单。

if request.method == 'POST '和request.form.get('uid '):

uid = request.form.get('uid ')

用户信息=获取用户信息(uid)

posts = get_all_post(uid,userinfo['containerid'])

dest_img = generate_personas(uid, posts)dest_img = generate_personas(uid,posts)

userinfo['personas'] = dest_imguserinfo['人物'] = dest_img

返回render_template('index.html ',**userinfo)

if __name__ == '__main__ ':

app.run()

代码就这么多,简单吗?当然,单文件结构只适合小型应用。随着功能和代码量的增加,仍然需要将代码分离到不同的文件结构中进行开发和维护。最后,只剩下一个页面模板文件。

3.模板开发

模板需要有一个输入表单和用户信息显示,基于Jinja2模板引擎。熟悉Django模板的人应该能很快上手,流程和Django类型一样。在项目的根目录下创建一个名为templates的文件夹,并创建一个名为index.html的新文件,代码如下:

& lt!DOCTYPE html & gt& lthtml & gt

& lthead & gt

& ltmeta charset="UTF-8 " >

& ltlink rel = " style sheet " type = " text/CSS " href =。/static/CSS/style . CSS " & gt;

& lttitle & gtFlask的微博单用户画像生成器

& lt/head & gt;

& ltbody & gt

& lt!-提交微博id的表格->:

& ltdiv & gt

& ltform action = "/" method = " post " id = " search-form " & gt;

& lttype = " text " name = " uid " class = " search " placeholder = "微博用户id " >:

& lttype = " submit " class = " submit " value = " generate portrait " >:

& lt/form & gt;

& lt/div & gt;

& lt!-以下是用户的显示信息->:

& lt!-使用模板的if语法,如果你有才能显示这段内容->:

& lt/body & gt;

& lt/html & gt;

这样,应用程序完成后,项目结构如下:

$树。微博_人物角色

├── app.py

├──静电

│ ├──

│ │ └── style.css

│ ├──字体

││└──·西姆黑. ttf

│ └──图片

│personas.png└──

└──模板

index.html└──

转到项目文件夹并启动项目:

$ python app.py*运行在http://127.0.0.1:5000/(按CTRL+C退出)

然后浏览器打开http://127.0.0.1:5000地址就可以看到本教程的置顶效果了。

以上只是初步实现,还有很多需要改进的地方。比如发布的博文很多,需要很长时间才能获取,可以考虑增加缓存来存储获取的用户,避免重复请求,前端也可以增加加载效果。本教程只展示单个用户,后面还可以批量获取用户信息,生成一组用户画像。

如果你遇到任何问题,或者想获得学习资源,欢迎加入学习交流群。

66062078,我们一起学Python!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/32743.html

发表回复

登录后才能评论