通过关键词采集文章采集api(Flask开发一个微博用户画像的*敏*感*词*开发步骤及步骤)
优采云 发布时间: 2021-08-29 09:11通过关键词采集文章采集api(Flask开发一个微博用户画像的*敏*感*词*开发步骤及步骤)
Flask 是另一个在 Django 之外用 Python 实现的优秀 Web 框架。相对于功能齐全的 Django,Flask 以自由灵活着称。在开发一些小应用的时候,使用Django会“熟练”,使用Flask就很适合了。本文将使用Flask开发一个微博用户画像*敏*感*词*,最终效果如下:
开发步骤如下:
获取微博用户数据;
分析数据,生成用户画像;
网站Realize,美化界面。
一、微博Grab
这里我们以移动端的微博()为例。本教程使用chrome浏览器进行调试。
在“发现”中搜索“古丽娜扎”,点击进入她的主页;
开始分析请求报文,右键打开调试窗口,选择调试窗口的“网络”选项卡;
选择“保留日志”刷新页面;
分析每个请求过程,可以发现博文的数据是从一个类似的地址获取的。主要参数有type(固定值)、value(博主ID)、containerid(标识,请求中返回)、page(页码)
以下是抓取博客文章的代码。
# 导入相关库<br />import requests<br />from time import sleep
# 定义获取博主信息的函数<br /># 参数uid为博主的id<br /><br />def get_user_info(uid):<br /> # 发送请求<br /> result = requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value={}'<br /> .format(uid))<br /> json_data = result.json() # 获取繁华信息中json内容<br /> userinfo = {<br /> 'name': json_data['userInfo']['screen_name'], # 获取用户头像<br /> 'description': json_data['userInfo']['description'], # 获取用户描述<br /> 'follow_count': json_data['userInfo']['follow_count'], # 获取关注数<br /> 'followers_count': json_data['userInfo']['followers_count'], # 获取粉丝数<br /> 'profile_image_url': json_data['userInfo']['profile_image_url'], # 获取头像<br /> 'verified_reason': json_data['userInfo']['verified_reason'], # 认证信息<br /> 'containerid': json_data['tabsInfo']['tabs'][1]['containerid'] # 此字段在获取博文中需要<br /> }<br /><br /> # 获取性别,微博中m表示男性,f表示女性<br /> if json_data['userInfo']['gender'] == 'm':<br /> gender = '男'<br /> elif json_data['userInfo']['gender'] == 'f':<br /> gender = '女'<br /> else:<br /> gender = '未知'<br /> userinfo['gender'] = gender<br /> return userinfo
# 获取古力娜扎信息<br />userinfo = get_user_info('1350995007')
# 信息如下<br />userinfo
{'containerid': '1076031350995007',<br />'description': '工作请联系:nazhagongzuo@163.com',<br />'follow_count': 529,<br />'followers_count': 12042995,<br />'name': '我是娜扎',<br />'profile_image_url': 'https://tvax2.sinaimg.cn/crop.0.0.1242.1242.180/50868c3fly8fevjzsp2j4j20yi0yi419.jpg',<br />'verified_reason': '演员,代表作《择天记》'}
在[33]:
# 循环获取所有博文<br /><br />def get_all_post(uid, containerid):<br /> # 从第一页开始<br /> page = 0<br /> # 这个用来存放博文列表<br /> posts = []<br /> while True:<br /> # 请求博文列表<br /> result = requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value={}&containerid={}&page={}'<br /> .format(uid, containerid, page))<br /> json_data = result.json()<br /><br /> # 当博文获取完毕,退出循环<br /> if not json_data['cards']:<br /> break<br /><br /> # 循环将新的博文加入列表<br /> for i in json_data['cards']:<br /> posts.append(i['mblog']['text'])<br /><br /> # 停顿半秒,避免被反爬虫<br /> sleep(0.5)<br /><br /> # 跳转至下一页<br /> page += 1<br /><br /> # 返回所有博文<br /> return posts
posts = get_all_post('1350995007', '1076031350995007')
# 查看博文条数<br />len(posts)
1279
# 显示前3个<br />posts[:3]
到此,用户的数据就准备好了,接下来开始生成用户画像。
二、生成用户画像
1.extraction关键词
这里从博文列表中提取关键词,分析博主发布的热词
import jieba.analyse<br />from html2text import html2text<br /><br />content = '\n'.join([html2text(i) for i in posts])<br /><br /># 这里使用jieba的textrank提取出1000个关键词及其比重<br />result = jieba.analyse.textrank(content, topK=1000, withWeight=True)<br /><br /># 生成关键词比重字典<br />keywords = dict()<br />for i in result:<br /> keywords[i[0]] = i[1]
2.生成词云图
from PIL import Image, ImageSequence<br />import numpy as np<br />import matplotlib.pyplot as plt<br />from wordcloud import WordCloud, ImageColorGenerator<br /><br /># 初始化图片<br />image = Image.open('./static/images/personas.png')<br />graph = np.array(image)<br /><br /># 生成云图,这里需要注意的是WordCloud默认不支持中文,所以这里需要加载中文黑体字库<br />wc = WordCloud(font_path='./fonts/simhei.ttf',<br /> background_color='white', max_words=300, mask=graph)<br />wc.generate_from_frequencies(keywords)<br />image_color = ImageColorGenerator(graph)
# 显示图片<br />plt.imshow(wc)<br />plt.imshow(wc.recolor(color_func=image_color))<br />plt.axis("off") # 关闭图像坐标系<br />plt.show()
三、Realize Flask 应用
开发 Flask 不像 Django 那样复杂,在一个小应用中用几个文件就可以完成。步骤如下:
1.安装
使用pip安装flask,命令如下:
$ pip install flask<br />
2.实现应用逻辑
简单来说,一个 Flask 应用就是一个 Flask 类,它的 url 请求是由 route 函数控制的。代码实现如下:
# app.py<br /><br /><br />from flask import Flask<br />import requests<br />from PIL import Image, ImageSequence<br />import numpy as np<br />import matplotlib.pyplot as plt<br />from wordcloud import WordCloud, ImageColorGenerator<br />import jieba.analyse<br />from html2text import html2text<br />from time import sleep<br />from collections import OrderedDict<br />from flask import render_template, request<br /><br /># 创建一个Flask应用<br />app = Flask(__name__)<br /><br /><br />##################################<br /># 微博相关函数 #<br /><br /># 定义获取博主信息的函数<br /># 参数uid为博主的id<br /><br />def get_user_info(uid):<br /> # 发送请求<br /> result = requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value={}'<br /> .format(uid))<br /> json_data = result.json() # 获取繁华信息中json内容<br /> # 获取性别,微博中m表示男性,f表示女性<br /> if json_data['userInfo']['gender'] == 'm':<br /> gender = '男'<br /> elif json_data['userInfo']['gender'] == 'f':<br /> gender = '女'<br /> else:<br /> gender = '未知'<br /><br /> userinfo = OrderedDict()<br /> userinfo['昵称'] = json_data['userInfo']['screen_name'] # 获取用户头像<br /> userinfo['性别'] = gender # 性别<br /> userinfo['关注数'] = json_data['userInfo']['follow_count'] # 获取关注数<br /> userinfo['粉丝数'] = json_data['userInfo']['followers_count'] # 获取粉丝数<br /> userinfo['认证信息'] = json_data['userInfo']['verified_reason'] # 获取粉丝数<br /> userinfo['描述'] = json_data['userInfo']['description'] # 获取粉丝数<br /> data = {<br /> 'profile_image_url': json_data['userInfo']['profile_image_url'], # 获取头像<br /> 'containerid': json_data['tabsInfo']['tabs'][1]['containerid'], # 此字段在获取博文中需要<br /> 'userinfo': '<br />'.join(['{}:{}'.format(k, v) for (k,v) in userinfo.items()])<br /> }<br /><br /> return data<br /><br /><br /># 循环获取所有博文<br /><br />def get_all_post(uid, containerid):<br /> # 从第一页开始<br /> page = 0<br /> # 这个用来存放博文列表<br /> posts = []<br /> while True:<br /> # 请求博文列表<br /> result = requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value={}&containerid={}&page={}'<br /> .format(uid, containerid, page))<br /> json_data = result.json()<br /><br /> # 当博文获取完毕,退出循环<br /> if not json_data['cards']:<br /> break<br /><br /> # 循环将新的博文加入列表<br /> for i in json_data['cards']:<br /> posts.append(i['mblog']['text'])<br /><br /> # 停顿半秒,避免被反爬虫<br /> sleep(0.5)<br /><br /> # 跳转至下一页<br /> page += 1<br /><br /> # 返回所有博文<br /> return posts<br /><br /><br />##############################<br />## 云图相关函数<br /><br /># 生成云图<br />def generate_personas(uid, data_list):<br /> content = '<br />'.join([html2text(i) for i in data_list])<br /><br /> # 这里使用jieba的textrank提取出1000个关键词及其比重<br /> result = jieba.analyse.textrank(content, topK=1000, withWeight=True)<br /><br /> # 生成关键词比重字典<br /> keywords = dict()<br /> for i in result:<br /> keywords[i[0]] = i[1]<br /><br /> # 初始化图片<br /> image = Image.open('./static/images/personas.png')<br /> graph = np.array(image)<br /><br /> # 生成云图,这里需要注意的是WordCloud默认不支持中文,所以这里需要加载中文黑体字库<br /> wc = WordCloud(font_path='./static/fonts/simhei.ttf',<br /> background_color='white', max_words=300, mask=graph)<br /> wc.generate_from_frequencies(keywords)<br /> image_color = ImageColorGenerator(graph)<br /> plt.imshow(wc)<br /> plt.imshow(wc.recolor(color_func=image_color))<br /> plt.axis("off") # 关闭图像坐标系<br /> dest_img = './static/personas/{}.png'.format(uid)<br /> plt.savefig(dest_img)<br /> return dest_img<br /><br /><br />#######################################<br /># 定义路由<br /># 指定根路径请求的响应函数<br />@app.route('/', methods=['GET', 'POST'])<br />def index():<br /> # 初始化模版数据为空<br /> userinfo = {}<br /> # 如果是一个Post请求,并且有微博用户id,则获取微博数据并生成相应云图<br /> # request.method的值为请求方法<br /> # request.form既为提交的表单<br /> if request.method == 'POST' and request.form.get('uid'):<br /> uid = request.form.get('uid')<br /> userinfo = get_user_info(uid)<br /> posts = get_all_post(uid, userinfo['containerid'])<br /> dest_img = generate_personas(uid, posts)<br /> userinfo['personas'] = dest_img<br /> return render_template('index.html', **userinfo)<br /><br /><br />if __name__ == '__main__':<br /> app.run()<br />
以上就是全部代码了,简单吗?当然,单文件结构只适合小型应用。随着功能和代码量的增加,仍然需要将代码分离到不同的文件结构中进行开发和维护。最后,还剩下一个页面模板文件。
3.模板开发
模板需要有输入表单和用户信息显示,基于Jinja2模板引擎。熟悉Django模板的应该可以快速上手。过程也和Django一样。在项目根目录下创建一个名为templates的文件夹,并新建一个名为index.html的文件。代码如下:
Flask之微博单用户画像*敏*感*词*title>head>form>div>body>html>
这样就完成了申请,项目结构如下:
$ tree .<br />weibo_personas<br />├── app.py<br />├── static<br />│ ├── css<br />│ │ └── style.css<br />│ ├── fonts<br />│ │ └── simhei.ttf<br />│ └── images<br />│ └── personas.png<br />└── templates<br /> └── index.html
进入项目文件夹,启动项目:
$ python app.py<br />* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
然后打开浏览器:5000地址,就可以看到本教程的置顶效果了。
以上只是初步实现,还有很多地方需要改进。比如发布的博文很多,获取时间较长,可以考虑添加缓存来存储获取的用户,避免重复请求,前端也可以添加加载效果。本教程仅显示一个用户。也可以批量获取用户信息,生成一组用户画像。
往期热门文章:
菜鸟学Python连续7天年度抽奖
优秀程序员必读的9本书