利用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改变日志(logging)存放位置的示例
Mar 27 Python
python修改字典内key对应值的方法
Jul 11 Python
Python中的多行注释文档编写风格汇总
Jun 16 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
python实战教程之自动扫雷
Jul 13 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
Oct 28 Python
Django 反向生成url实例详解
Jul 30 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
Django多数据库配置及逆向生成model教程
Mar 28 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 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
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
php 函数中使用static的说明
2012/06/01 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
js实现数组转换成json
2015/06/26 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
详解vue axios二次封装
2018/07/22 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
基于vue2.0的活动倒计时组件countdown(附源码下载)
2018/10/09 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
python简单文本处理的方法
2015/07/10 Python
python基础_文件操作实现全文或单行替换的方法
2017/09/04 Python
Python if语句知识点用法总结
2018/06/10 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
python使用配置文件过程详解
2019/12/28 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
高中体育教学反思
2014/01/29 职场文书
员工离职感谢信
2015/01/22 职场文书
小学大队长竞选稿
2015/11/20 职场文书
python装饰器代码解析
2022/03/23 Python