通过关键词采集文章采集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(&#39;https://m.weibo.cn/api/container/getIndex?type=uid&value={}&#39;<br />                          .format(uid))<br />    json_data = result.json()  # 获取繁华信息中json内容<br />    userinfo = {<br />        &#39;name&#39;: json_data[&#39;userInfo&#39;][&#39;screen_name&#39;],                    # 获取用户头像<br />        &#39;description&#39;: json_data[&#39;userInfo&#39;][&#39;description&#39;],             # 获取用户描述<br />        &#39;follow_count&#39;: json_data[&#39;userInfo&#39;][&#39;follow_count&#39;],           # 获取关注数<br />        &#39;followers_count&#39;: json_data[&#39;userInfo&#39;][&#39;followers_count&#39;],     # 获取粉丝数<br />        &#39;profile_image_url&#39;: json_data[&#39;userInfo&#39;][&#39;profile_image_url&#39;], # 获取头像<br />        &#39;verified_reason&#39;: json_data[&#39;userInfo&#39;][&#39;verified_reason&#39;],     # 认证信息<br />        &#39;containerid&#39;: json_data[&#39;tabsInfo&#39;][&#39;tabs&#39;][1][&#39;containerid&#39;]   # 此字段在获取博文中需要<br />    }<br /><br />    # 获取性别,微博中m表示男性,f表示女性<br />    if json_data[&#39;userInfo&#39;][&#39;gender&#39;] == &#39;m&#39;:<br />        gender = &#39;男&#39;<br />    elif json_data[&#39;userInfo&#39;][&#39;gender&#39;] == &#39;f&#39;:<br />        gender = &#39;女&#39;<br />    else:<br />        gender = &#39;未知&#39;<br />    userinfo[&#39;gender&#39;] = gender<br />    return userinfo

  # 获取古力娜扎信息<br />userinfo = get_user_info(&#39;1350995007&#39;)

  # 信息如下<br />userinfo

  {&#39;containerid&#39;: &#39;1076031350995007&#39;,<br />&#39;description&#39;: &#39;工作请联系:nazhagongzuo@163.com&#39;,<br />&#39;follow_count&#39;: 529,<br />&#39;followers_count&#39;: 12042995,<br />&#39;name&#39;: &#39;我是娜扎&#39;,<br />&#39;profile_image_url&#39;: &#39;https://tvax2.sinaimg.cn/crop.0.0.1242.1242.180/50868c3fly8fevjzsp2j4j20yi0yi419.jpg&#39;,<br />&#39;verified_reason&#39;: &#39;演员,代表作《择天记》&#39;}

  在[33]:

  # 循环获取所有博文<br /><br />def get_all_post(uid, containerid):<br />    # 从第一页开始<br />    page = 0<br />    # 这个用来存放博文列表<br />    posts = []<br />    while True:<br />        # 请求博文列表<br />        result = requests.get(&#39;https://m.weibo.cn/api/container/getIndex?type=uid&value={}&containerid={}&page={}&#39;<br />                              .format(uid, containerid, page))<br />        json_data = result.json()<br /><br />        # 当博文获取完毕,退出循环<br />        if not json_data[&#39;cards&#39;]:<br />            break<br /><br />        # 循环将新的博文加入列表<br />        for i in json_data[&#39;cards&#39;]:<br />            posts.append(i[&#39;mblog&#39;][&#39;text&#39;])<br /><br />        # 停顿半秒,避免被反爬虫<br />        sleep(0.5)<br /><br />        # 跳转至下一页<br />        page += 1<br /><br />    # 返回所有博文<br />    return posts

  posts = get_all_post(&#39;1350995007&#39;, &#39;1076031350995007&#39;)

  # 查看博文条数<br />len(posts)

  1279

  # 显示前3个<br />posts[:3]

  

  到此,用户的数据就准备好了,接下来开始生成用户画像。

  二、生成用户画像

  1.extraction关键词

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

  import jieba.analyse<br />from html2text import html2text<br /><br />content = &#39;\n&#39;.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(&#39;./static/images/personas.png&#39;)<br />graph = np.array(image)<br /><br /># 生成云图,这里需要注意的是WordCloud默认不支持中文,所以这里需要加载中文黑体字库<br />wc = WordCloud(font_path=&#39;./fonts/simhei.ttf&#39;,<br />    background_color=&#39;white&#39;, 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(&#39;https://m.weibo.cn/api/container/getIndex?type=uid&value={}&#39;<br />                          .format(uid))<br />    json_data = result.json()  # 获取繁华信息中json内容<br />    # 获取性别,微博中m表示男性,f表示女性<br />    if json_data[&#39;userInfo&#39;][&#39;gender&#39;] == &#39;m&#39;:<br />        gender = &#39;男&#39;<br />    elif json_data[&#39;userInfo&#39;][&#39;gender&#39;] == &#39;f&#39;:<br />        gender = &#39;女&#39;<br />    else:<br />        gender = &#39;未知&#39;<br /><br />    userinfo = OrderedDict()<br />    userinfo[&#39;昵称&#39;] = json_data[&#39;userInfo&#39;][&#39;screen_name&#39;]           # 获取用户头像<br />    userinfo[&#39;性别&#39;] = gender                                         # 性别<br />    userinfo[&#39;关注数&#39;] = json_data[&#39;userInfo&#39;][&#39;follow_count&#39;]        # 获取关注数<br />    userinfo[&#39;粉丝数&#39;] = json_data[&#39;userInfo&#39;][&#39;followers_count&#39;]     # 获取粉丝数<br />    userinfo[&#39;认证信息&#39;] = json_data[&#39;userInfo&#39;][&#39;verified_reason&#39;]   # 获取粉丝数<br />    userinfo[&#39;描述&#39;] = json_data[&#39;userInfo&#39;][&#39;description&#39;]           # 获取粉丝数<br />    data = {<br />        &#39;profile_image_url&#39;: json_data[&#39;userInfo&#39;][&#39;profile_image_url&#39;], # 获取头像<br />        &#39;containerid&#39;: json_data[&#39;tabsInfo&#39;][&#39;tabs&#39;][1][&#39;containerid&#39;],  # 此字段在获取博文中需要<br />        &#39;userinfo&#39;: &#39;<br />&#39;.join([&#39;{}:{}&#39;.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(&#39;https://m.weibo.cn/api/container/getIndex?type=uid&value={}&containerid={}&page={}&#39;<br />                              .format(uid, containerid, page))<br />        json_data = result.json()<br /><br />        # 当博文获取完毕,退出循环<br />        if not json_data[&#39;cards&#39;]:<br />            break<br /><br />        # 循环将新的博文加入列表<br />        for i in json_data[&#39;cards&#39;]:<br />            posts.append(i[&#39;mblog&#39;][&#39;text&#39;])<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 = &#39;<br />&#39;.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(&#39;./static/images/personas.png&#39;)<br />    graph = np.array(image)<br /><br />    # 生成云图,这里需要注意的是WordCloud默认不支持中文,所以这里需要加载中文黑体字库<br />    wc = WordCloud(font_path=&#39;./static/fonts/simhei.ttf&#39;,<br />        background_color=&#39;white&#39;, 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 = &#39;./static/personas/{}.png&#39;.format(uid)<br />    plt.savefig(dest_img)<br />    return dest_img<br /><br /><br />#######################################<br /># 定义路由<br /># 指定根路径请求的响应函数<br />@app.route(&#39;/&#39;, methods=[&#39;GET&#39;, &#39;POST&#39;])<br />def index():<br />    # 初始化模版数据为空<br />    userinfo = {}<br />    # 如果是一个Post请求,并且有微博用户id,则获取微博数据并生成相应云图<br />    # request.method的值为请求方法<br />    # request.form既为提交的表单<br />    if request.method == &#39;POST&#39; and request.form.get(&#39;uid&#39;):<br />        uid = request.form.get(&#39;uid&#39;)<br />        userinfo = get_user_info(uid)<br />        posts = get_all_post(uid, userinfo[&#39;containerid&#39;])<br />        dest_img = generate_personas(uid, posts)<br />        userinfo[&#39;personas&#39;] = dest_img<br />    return render_template(&#39;index.html&#39;, **userinfo)<br /><br /><br />if __name__ == &#39;__main__&#39;:<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本书

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线