侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

利用Python爬取微博数据生成词云图片实例代码

Python  /  管理员 发布于 7年前   107

前言

在很早之前写过一篇怎么利用微博数据制作词云图片出来,之前的写得不完整,而且只能使用自己的数据,现在重新整理了一下,任何的微博数据都可以制作出来,一年一度的虐汪节,是继续蹲在角落默默吃狗粮还是主动出击告别单身汪加入散狗粮的行列就看你啦,七夕送什么才有心意,程序猿可以试试用一种特别的方式来表达你对女神的心意。有一个创意是把她过往发的微博整理后用词云展示出来。本文教你怎么用Python快速创建出有心意词云,即使是Python小白也能分分钟做出来。下面话不多说了,来一起看看详细的介绍吧。

准备工作

本环境基于Python3,理论上Python2.7也是可行的,先安装必要的第三方依赖包:

# requirement.txtjieba==0.38matplotlib==2.0.2numpy==1.13.1pyparsing==2.2.0requests==2.18.4scipy==0.19.1wordcloud==1.3.1

requirement.txt文件中包含上面的几个依赖包,如果用pip方式安装失败,推荐使用Anaconda安装

pip install -r requirement.txt

第一步:分析网址

打开微博移动端网址 https://m.weibo.cn/searchs ,找到女神的微博ID,进入她的微博主页,分析浏览器发送请求的过程

打开 Chrome 浏览器的调试功能,选择 Network 菜单,观察到获取微博数据的的接口是 https://m.weibo.cn/api/container/getIndex ,后面附带了一连串的参数,这里面有些参数是根据用户变化的,有些是固定的,先提取出来。

uid=1192515960&luicode=10000011&lfid=100103type%3D3%26q%3D%E6%9D%8E%E5%86%B0%E5%86%B0&featurecode=20000320&type=user&containerid=1076031192515960

再来分析接口的返回结果,返回数据是一个JSON字典结构,total 是微博总条数,每一条具体的微博内容封装在 cards 数组中,具体内容字段是里面的 text 字段。很多干扰信息已隐去。

{ "cardlistInfo": { "containerid": "1076031192515960", "total": 4754, "page": 2 }, "cards": [ { "card_type": 9, "mblog": { "created_at": "08-26", "idstr": "4145069944506080", "text": "瑞士一日游圆满结束...", } }]}

第二步:构建请求头和查询参数

分析完网页后,我们开始用 requests 模拟浏览器构造爬虫获取数据,因为这里获取用户的数据无需登录微博,所以我们不需要构造 cookie信息,只需要基本的请求头即可,具体需要哪些头信息也可以从浏览器中获取,首先构造必须要的请求参数,包括请求头和查询参数。

headers = { "Host": "m.weibo.cn", "Referer": "https://m.weibo.cn/u/1705822647", "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) "   "Version/9.0 Mobile/13B143 Safari/601.1",}params = {"uid": "{uid}",  "luicode": "20000174",  "featurecode": "20000320",  "type": "uid",  "value": "1705822647",  "containerid": "{containerid}",  "page": "{page}"}
  • uid是微博用户的id
  • containerid虽然不什么意思,但也是和具体某个用户相关的参数
  • page 分页参数

第三步:构造简单爬虫

通过返回的数据能查询到总微博条数 total,爬取数据直接利用 requests 提供的方法把 json 数据转换成 Python 字典对象,从中提取出所有的 text 字段的值并放到 blogs 列表中,提取文本之前进行简单过滤,去掉无用信息。顺便把数据写入文件,方便下次转换时不再重复爬取。

def fetch_data(uid=None, container_id=None): """ 抓取数据,并保存到CSV文件中 :return: """ page = 0 total = 4754 blogs = [] for i in range(0, total // 10): params['uid'] = uid params['page'] = str(page) params['containerid'] = container_id res = requests.get(url, params=params, headers=HEADERS) cards = res.json().get("cards") for card in cards:  # 每条微博的正文内容  if card.get("card_type") == 9:  text = card.get("mblog").get("text")  text = clean_html(text)  blogs.append(text) page += 1 print("抓取第{page}页,目前总共抓取了 {count} 条微博".format(page=page, count=len(blogs))) with codecs.open('weibo1.txt', 'w', encoding='utf-8') as f:  f.write("\n".join(blogs))

第四步:分词处理并构建词云

爬虫了所有数据之后,先进行分词,这里用的是结巴分词,按照中文语境将句子进行分词处理,分词过程中过滤掉停止词,处理完之后找一张参照图,然后根据参照图通过词语拼装成图。

def generate_image(): data = [] jieba.analyse.set_stop_words("./stopwords.txt") with codecs.open("weibo1.txt", 'r', encoding="utf-8") as f: for text in f.readlines():  data.extend(jieba.analyse.extract_tags(text, topK=20)) data = " ".join(data) mask_img = imread('./52f90c9a5131c.jpg', flatten=True) wordcloud = WordCloud(  font_path='msyh.ttc',  background_color='white',  mask=mask_img ).generate(data) plt.imshow(wordcloud.recolor(color_func=grey_color_func, random_state=3),   interpolation="bilinear") plt.axis('off') plt.savefig('./heart2.jpg', dpi=1600)

最终效果图:

完整示例代码如下:

# -*- coding:utf-8 -*-import codecsimport reimport jieba.analyseimport matplotlib.pyplot as pltimport requestsfrom scipy.misc import imreadfrom wordcloud import WordCloud__author__ = 'liuzhijun'headers = {  "Host": "m.weibo.cn",  "Referer": "https://m.weibo.cn/u/1705822647",  "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) "         "Version/9.0 Mobile/13B143 Safari/601.1",}def clean_html(raw_html):  pattern = re.compile(r'<.*?>|转发微博|//:|Repost|,|?|。|、|分享图片|回复@.*?:|//@.*')  text = re.sub(pattern, '', raw_html)  return texturl = "https://m.weibo.cn/api/container/getIndex"params = {"uid": "{uid}",     "luicode": "20000174",     "featurecode": "20000320",     "type": "uid",     "value": "1705822647",     "containerid": "{containerid}",     "page": "{page}"}def fetch_data(uid=None, container_id=None):  """  抓取数据,并保存到CSV文件中  :return:  """  page = 0  total = 4754  blogs = []  for i in range(0, total // 10):    params['uid'] = uid    params['page'] = str(page)    params['containerid'] = container_id    res = requests.get(url, params=params, headers=headers)    cards = res.json().get("cards")    for card in cards:      # 每条微博的正文内容      if card.get("card_type") == 9:        text = card.get("mblog").get("text")        text = clean_html(text)        blogs.append(text)    page += 1    print("抓取第{page}页,目前总共抓取了 {count} 条微博".format(page=page, count=len(blogs)))    with codecs.open('weibo1.txt', 'w', encoding='utf-8') as f:      f.write("\n".join(blogs))def grey_color_func(word, font_size, position, orientation, random_state=None,          **kwargs):  s = "hsl(0, 0%%, %d%%)" % 0  return sdef generate_image():  data = []  jieba.analyse.set_stop_words("./stopwords.txt")  with codecs.open("weibo1.txt", 'r', encoding="utf-8") as f:    for text in f.readlines():      data.extend(jieba.analyse.extract_tags(text, topK=20))    data = " ".join(data)    mask_img = imread('./52f90c9a5131c.jpg', flatten=True)    wordcloud = WordCloud(      font_path='msyh.ttc',      background_color='white',      mask=mask_img    ).generate(data)    plt.imshow(wordcloud.recolor(color_func=grey_color_func, random_state=3),          interpolation="bilinear")    plt.axis('off')    plt.savefig('./heart2.jpg', dpi=1600)if __name__ == '__main__':  fetch_data("1192515960", "1076031192515960")  generate_image()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家的支持。


  • 上一条:
    python中类和实例如何绑定属性与方法示例详解
    下一条:
    go和python变量赋值遇到的一个问题
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客