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