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


Posted in Python onAugust 31, 2017

前言

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

准备工作

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

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

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

pip install -r requirement.txt

第一步:分析网址

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

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

打开 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信息,只需要基本的请求头即可,具体需要哪些头信息也可以从浏览器中获取,首先构造必须要的请求参数,包括请求头和查询参数。

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

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))

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

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

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

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)

最终效果图:

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

完整示例代码如下:

# -*- coding:utf-8 -*-
import codecs
import re

import jieba.analyse
import matplotlib.pyplot as plt
import requests
from scipy.misc import imread
from 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 text


url = "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 s


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)


if __name__ == '__main__':
  fetch_data("1192515960", "1076031192515960")
  generate_image()

总结

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

Python 相关文章推荐
如何使用七牛Python SDK写一个同步脚本及使用教程
Aug 23 Python
python条件变量之生产者与消费者操作实例分析
Mar 22 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
Apr 02 Python
python实现关键词提取的示例讲解
Apr 28 Python
Python Pillow Image Invert
Jan 22 Python
使用python读取.text文件特定行的数据方法
Jan 28 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
解决Django后台ManyToManyField显示成Object的问题
Aug 09 Python
Python单元测试模块doctest的具体使用
Feb 10 Python
Python中无限循环需要什么条件
May 27 Python
python实现定时发送邮件到指定邮箱
Dec 23 Python
python urllib和urllib3知识点总结
Feb 08 Python
Python利用ElementTree模块处理XML的方法详解
Aug 31 #Python
go和python变量赋值遇到的一个问题
Aug 31 #Python
理解Python中的绝对路径和相对路径
Aug 30 #Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
Aug 30 #Python
python递归打印某个目录的内容(实例讲解)
Aug 30 #Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 #Python
关于python的list相关知识(推荐)
Aug 30 #Python
You might like
星际争霸任务指南——虫族
2020/03/04 星际争霸
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
php判断字符串在另一个字符串位置的方法
2014/02/27 PHP
php发送与接收流文件的方法
2015/02/11 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
JavaScript 乱码问题
2009/08/06 Javascript
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/25 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
JS实现title标题栏文字不间断滚动显示效果
2016/09/07 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
Vue页面手动刷新,实现导航栏激活项还原到初始状态
2020/08/06 Javascript
JS实现放大镜效果
2020/09/21 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
Django缓存Cache使用详解
2020/11/30 Python
英国家居用品和床上用品零售商:P&B Home
2020/01/16 全球购物
Flesh Beauty官网:露华浓集团旗下彩妆品牌
2021/02/15 全球购物
幼儿园中班教学反思
2014/02/10 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
Python+DeOldify实现老照片上色功能
2022/06/21 Python