全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

前言

在很早之前写过一篇怎么利用微博数据制作词云图片出来,之前的写得不完整,而且只能使用自己的数据,现在重新整理了一下,任何的微博数据都可以制作出来,一年一度的虐汪节,是继续蹲在角落默默吃狗粮还是主动出击告别单身汪加入散狗粮的行列就看你啦,七夕送什么才有心意,程序猿可以试试用一种特别的方式来表达你对女神的心意。有一个创意是把她过往发的微博整理后用词云展示出来。本文教你怎么用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,进入她的微博主页,分析浏览器发送请求的过程

打开 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 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爬取数据  # 使用python生成云词图实现画红楼梦词云图  # Python通过文本和图片生成词云图  # python根据文本生成词云图代码实例  # 基于python生成英文版词云图代码实例  # 怎么使用python生成词云图  # 每条  # 条数  # 自己的  # 的是  # 并保存  # 是一个  # 狗粮  # 几个  # 瑞士  # 不需要  # 说了  # 也能  # 不多  # 推荐使用  # 才有  # 再来  # 把她  # 教你  # 你对  # 分页 


相关文章: 网站制作需要会哪些技术,建立一个网站要花费多少?  建站主机无法访问?如何排查域名与服务器问题  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  如何选购建站域名与空间?自助平台全解析  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  建站与域名管理如何高效结合?  家庭建站与云服务器建站,如何选择更优?  个人网站制作流程图片大全,个人网站如何注销?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何通过山东自助建站平台快速注册域名?  如何快速完成中国万网建站详细流程?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  家庭服务器如何搭建个人网站?  如何通过西部建站助手安装IIS服务器?  Python多线程使用规范_线程安全解析【教程】  定制建站哪家更专业可靠?推荐榜单揭晓  建站之星微信建站一键生成小程序+多端营销系统  潮流网站制作头像软件下载,适合母子的网名有哪些?  微信小程序 input输入框控件详解及实例(多种示例)  黑客如何利用漏洞与弱口令入侵网站服务器?  建站之星后台密码遗忘如何找回?  建站之星安装失败:服务器环境不兼容?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  建站主机是否等同于虚拟主机?  建站之星如何优化SEO以实现高效排名?  ,在苏州找工作,上哪个网站比较好?  Swift中switch语句区间和元组模式匹配  南宁网站建设制作定制,南宁网站建设可以定制吗?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  TestNG的testng.xml配置文件怎么写  建站之星安装需要哪些步骤及注意事项?  如何配置IIS站点权限与局域网访问?  建站之星如何快速生成多端适配网站?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  如何用西部建站助手快速创建专业网站?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  如何在阿里云香港服务器快速搭建网站?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  如何选择PHP开源工具快速搭建网站?  宝塔新建站点为何无法访问?如何排查?  如何通过商城自助建站源码实现零基础高效建站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。