Flask是Django之外用Python实现的另一优秀Web框架。相对于功能全面的Django,Flask以自由、灵活著称。在开发一些小应用的时候使用Flask就非常合适。本文将使用Flask开发一个微博用户画像的生成器。

开发步骤如下:

  • 抓取微博用户数据;
  • 分析数据,生成用户画像;
  • 网站实现,美化界面。

一、微博抓取

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

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

开始分析请求报文, 右击打开调试窗口,选择调试窗口的"网络(network)“标签;

选择"Preserve Log”,刷新页面;

分析各条请求过程可以发现博文的数据是从https://m.weibo.cn/api/container/getIndex?XXX 类似的地址中得到的。其主要参数为type(固定值)、value(博主ID)、containerid(标识,请求中返回)、page(页码)

下面开始实现爬取博文的代码。

导入相关库

import requests
from time import sleep# 定义获取博主信息的函数
# 参数uid为博主的iddef get_user_info(uid):# 发送请求result = requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value={}'.format(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'], # 获取头像'verified_reason': json_data['userInfo']['verified_reason'],     # 认证信息'containerid': json_data['tabsInfo']['tabs'][1]['containerid']   # 此字段在获取博文中需要}# 获取性别,微博中m表示男性,f表示女性if json_data['userInfo']['gender'] == 'm':gender = '男'elif json_data['userInfo']['gender'] == 'f':gender = '女'else:gender = '未知'userinfo['gender'] = genderreturn userinfo
# 获取古力娜扎信息
userinfo = get_user_info('1350995007')
# 信息如下
userinfo
{'containerid': '1076031350995007','description': '工作请联系:nazhagongzuo@163.com','follow_count': 529,'followers_count': 12042995,'name': '我是娜扎','profile_image_url': 'https://tvax2.sinaimg.cn/crop.0.0.1242.1242.180/50868c3fly8fevjzsp2j4j20yi0yi419.jpg','verified_reason': '演员,代表作《择天记》'}# 循环获取所有博文def get_all_post(uid, containerid):# 从第一页开始page = 0# 这个用来存放博文列表posts = []while True:# 请求博文列表result = requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value={}&containerid={}&page={}'.format(uid, containerid, page))json_data = result.json()# 当博文获取完毕,退出循环if not json_data['cards']:break# 循环将新的博文加入列表for i in json_data['cards']:posts.append(i['mblog']['text'])# 停顿半秒,避免被反爬虫sleep(0.5)# 跳转至下一页page += 1# 返回所有博文return posts
posts = get_all_post('1350995007', '1076031350995007')
# 查看博文条数
len(posts)
1279
# 显示前3个
posts[:3]

至此,用户的数据已准备就绪,接下来开始生成用户画像。

二、生成用户画像

1.提取关键词

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

import jieba.analyse
from html2text import html2textcontent = '\n'.join([html2text(i) for i in posts])# 这里使用jieba的textrank提取出1000个关键词及其比重
result = jieba.analyse.textrank(content, topK=1000, withWeight=True)# 生成关键词比重字典
keywords = dict()
for i in result:keywords[i[0]] = i[1]

2.生成词云图

from PIL import Image, ImageSequence
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import 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)
wc.generate_from_frequencies(keywords)
image_color = ImageColorGenerator(graph)
# 显示图片
plt.imshow(wc)
plt.imshow(wc.recolor(color_func=image_color))
plt.axis("off") # 关闭图像坐标系
plt.show()

三、实现Flask应用

开发Flask不像Django那么复杂,小应用几个文件就可以完成。步骤如下:

  1. 安装

使用pip安装flask,命令如下:

pip install flask

2.实现应用逻辑

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

# app.pyfrom flask import Flask
import requests
from PIL import Image, ImageSequence
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator
import jieba.analyse
from html2text import html2text
from time import sleep
from collections import OrderedDict
from flask import render_template, request# 创建一个Flask应用
app = Flask(__name__)# 微博相关函数 ## 定义获取博主信息的函数
# 参数uid为博主的iddef get_user_info(uid):# 发送请求result = requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value={}'.format(uid))json_data = result.json()  # 获取繁华信息中json内容# 获取性别,微博中m表示男性,f表示女性if json_data['userInfo']['gender'] == 'm':gender = '男'elif json_data['userInfo']['gender'] == 'f':gender = '女'else:gender = '未知'userinfo = OrderedDict()userinfo['昵称'] = json_data['userInfo']['screen_name']           # 获取用户头像userinfo['性别'] = gender                                         # 性别userinfo['关注数'] = json_data['userInfo']['follow_count']        # 获取关注数userinfo['粉丝数'] = json_data['userInfo']['followers_count']     # 获取粉丝数userinfo['认证信息'] = json_data['userInfo']['verified_reason']   # 获取粉丝数userinfo['描述'] = json_data['userInfo']['description']           # 获取粉丝数data = {'profile_image_url': json_data['userInfo']['profile_image_url'], # 获取头像'containerid': json_data['tabsInfo']['tabs'][1]['containerid'],  # 此字段在获取博文中需要'userinfo': '<br>'.join(['{}:{}'.format(k, v) for (k,v) in userinfo.items()])}return data# 循环获取所有博文def get_all_post(uid, containerid):# 从第一页开始page = 0# 这个用来存放博文列表posts = []while True:# 请求博文列表result = requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value={}&containerid={}&page={}'.format(uid, containerid, page))json_data = result.json()# 当博文获取完毕,退出循环if not json_data['cards']:break# 循环将新的博文加入列表for i in json_data['cards']:posts.append(i['mblog']['text'])# 停顿半秒,避免被反爬虫sleep(0.5)# 跳转至下一页page += 1# 返回所有博文return posts##############################
## 云图相关函数# 生成云图
def generate_personas(uid, data_list):content = '<br>'.join([html2text(i) for i in data_list])# 这里使用jieba的textrank提取出1000个关键词及其比重result = jieba.analyse.textrank(content, topK=1000, withWeight=True)# 生成关键词比重字典keywords = dict()for i in result:keywords[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)wc.generate_from_frequencies(keywords)image_color = ImageColorGenerator(graph)plt.imshow(wc)plt.imshow(wc.recolor(color_func=image_color))plt.axis("off") # 关闭图像坐标系dest_img = './static/personas/{}.png'.format(uid)plt.savefig(dest_img)return dest_img#######################################
# 定义路由
# 指定根路径请求的响应函数
@app.route('/', methods=['GET', 'POST'])
def index():# 初始化模版数据为空userinfo = {}# 如果是一个Post请求,并且有微博用户id,则获取微博数据并生成相应云图# request.method的值为请求方法# request.form既为提交的表单if request.method == 'POST' and request.form.get('uid'):uid = request.form.get('uid')userinfo = get_user_info(uid)posts = get_all_post(uid, userinfo['containerid'])dest_img = generate_personas(uid, posts)userinfo['personas'] = dest_imgreturn render_template('index.html', **userinfo)if __name__ == '__main__':app.run()

以上就是全部的代码,简单吧?当然,单文件结构只适合小的应用,随着功能和代码量的增加,还是需要把代码分离中不同的文件结构中以便开发和维护。最后,还差一个页面的模版文件。

3.模版开发

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

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><link rel="stylesheet" type="text/css" href="./static/css/style.css"><title>Flask之微博单用户画像生成器</title>
</head>
<body>
<!--提交微博id的表单-->
<div><form action="/" method="post" id="search-form"><input type="text" name="uid" class="search" placeholder="微博用户ID"><input type="submit" class="submit" value="生成画像"></form>
</div><!--下面是用户的展示信息-->
<!--使用了模版的if语法,如果有才展示这块内容--></body>
</html>

这样,应用实现完毕,项目结构如下:

$ tree .
weibo_personas
├── app.py
├── static
│   ├── css
│   │   └── style.css
│   ├── fonts
│   │   └── simhei.ttf
│   └── images
│       └── personas.png
└── templates└── index.html

进入项目文件夹,启动项目:

 python app.pyRunning on http://127.0.0.1:5000/ (Press CTRL+C to quit)

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

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

Flask实现微博画像采集小工具相关推荐

  1. java微博图床小工具

    文章目录 介绍 为什么开源 准备环境 windows如何使用 介绍 webpic 是一个用java编写的图床工具,它能帮助你快速上传你的图片到微博云图床,并自动返回Markdown格式链接到剪贴板.配 ...

  2. 一个python+flask和SQLite的数字查找以及Dataload命令生成的小工具

    在日常工作中,我经常需要从excel中通过vlookup函数查询一些工单号,然后生成Dataload命令来进行工单结束的批量操作. 这些操作通常需要打开ecxcel,然后挨个输入户号.如果每次都要打开 ...

  3. 微博超话签到小工具v2.0 签到管理操作

    简介: 微博超话工具主要用于微博超话的签到管理操作,能一键完成全部微博超话的签到,获取签到奖励:微博超话工具最新版本适配新版微博客户端,能大幅节省您的时间精力:关注了多个微博超话的朋友们都可以下载使用 ...

  4. 打通高德、UC、微博,支付宝小程序组建“阿里联盟军”对抗微信小程序?| 技术头条...

    作者丨Suvi 责编 | 伍杏玲 本文经授权转载自晓程序速报(ID:xcxsubao) [CSDN 编者按]支付宝小程序虽起步时未占到先机,但其后劲十足,近期更是频频发力,大有后来者居上之势.例如阿里 ...

  5. Penetration_Testing_POC-About 渗透测试有关的POC、EXP、脚本、提权、小工具等

    Penetration_Testing_POC 搜集有关渗透测试中用到的POC.脚本.工具.文章等姿势分享,作为笔记吧,欢迎补充. Penetration_Testing_POC 请善用搜索[Ctrl ...

  6. python写图片爬取软件_python制作微博图片爬取工具

    有小半个月没有发博客了,因为一直在研究python的GUI,买了一本书学习了一些基础,用我所学做了我的第一款GUI--微博图片爬取工具.本软件源代码已经放在了博客中,另外软件已经打包好上传到网盘中以供 ...

  7. 最火Python3 玩转实用小工具

    课程目录: 第1章 课程介绍 介绍课程的主要内容,课程内容安排. 1-1 最火python3玩转实用小工具课程导学.  第2章 自主研发-购书比价工具 首先做好知识储备,讲解JSON.xpath.re ...

  8. 2000条你应知的WPF小姿势 基础篇45-50 Visual TreeLogic Tree 附带两个小工具

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C#  和 2, ...

  9. PowerToys,微软开源的超实用小工具合集

    不过现在,微软又重启了这个项目并在github上开源,新版的PowerToys增加了许多让人耳目一新的实用工具.下面阿刚带大家一起来了解一下. PowerRename,批量重命名! 文件重命名尤其是需 ...

最新文章

  1. 从另一服务器传输文件到本服务器(服务器间传输文件)
  2. android访问html页面
  3. pythonwin32api拖动图标_Python使用win32api,模拟鼠标移动并复制/粘贴到diskfi中
  4. 真安卓机皇!华为P30 Pro包揽《智能硬件质量报告》多项大奖
  5. opencvpython 段力辉是哪本书_OpenCV基础 | 1.python3.6+OpenCV4.0环境配置
  6. Ubuntu14.04搭建Oracle instantClient 11.2.0.4并配置cx_Oracle5.1.2
  7. CVPR 2020 | 几篇GAN在low-level vision中的应用论文
  8. 大学c语言基础知识必备大全,大学 C语言基础知识.ppt
  9. 亿格瑞A5-hdmi故障了
  10. MSDN2015下载与安装
  11. word中套用表格样式在哪里_在Word中,关于“套用表格样式”的用法,下列说法正确的是()...
  12. vscode怎么对选定的代码格式化?ctrl+k,ctrl+f(格式化代码)
  13. java中for break的用法_java break语句的使用方法
  14. Sailfish应用开发入门(一)Windows 安装Sailfish,创建第一个Sailfish APP
  15. 基于 node.js 的校园交流平台的设计与实现(word文档)
  16. 实战-H3C交换机之Web界面
  17. MTK如何修改usb驱动能力
  18. 选择1KG轻簿的笔记本
  19. FineReport公式函数
  20. 大数据面试问题,大数据面试技巧都有哪些呢?

热门文章

  1. iOS-系统相关参数(版本、机型设备等)
  2. 计算机网络在教学上的应用,浅谈计算机网络在教学中的应用.doc
  3. 【架构实战day1】京东开放平台的架构与演进
  4. 清华大学计算机科学与技术专业本科生课程设置
  5. can总线的示波器检测方法
  6. 智能票据识别OCR系统
  7. valgrind 简介(内存检查工具)
  8. (转)智能金融起锚:文因、数库、通联瞄准的kensho革命
  9. 树莓派4B安装联想LJ2605D打印机驱动
  10. 输入三角形三边边长,求三角形的面积