用Python爬取微博数据生成词云图片

标签: python 微博 数据 | 发表时间:2017-09-01 08:00 | 作者:
出处:http://www.phpxs.com

很早之前写过一篇怎么利用微博数据制作词云图片出来,之前的写得不完整,而且只能使用自己的数据,现在重新整理了一下,任何的微博数据都可以制作出来,放在今天应该比较应景。

一年一度的虐汪节,是继续蹲在角落默默吃狗粮还是主动出击告别单身汪加入散狗粮的行列就看你啦,七夕送什么才有心意,程序猿可以试试用一种特别的方式来表达你对女神的心意。有一个创意是把她过往发的微博整理后用词云展示出来。本文教你怎么用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)

最终效果图:

完整代码可以在公众号(Python之禅)回复“qixi”获取

关注公众号『Python之禅』(id:vttalk)获取最新文章

 

来自:https://foofish.net/python-word-cloud.html

 

相关 [python 微博 数据] 推荐:

用Python爬取微博数据生成词云图片

- - 编程学习网
很早之前写过一篇怎么利用微博数据制作词云图片出来,之前的写得不完整,而且只能使用自己的数据,现在重新整理了一下,任何的微博数据都可以制作出来,放在今天应该比较应景. 一年一度的虐汪节,是继续蹲在角落默默吃狗粮还是主动出击告别单身汪加入散狗粮的行列就看你啦,七夕送什么才有心意,程序猿可以试试用一种特别的方式来表达你对女神的心意.

Python连接数据库之DB-API

- - 标点符
在Python中如果要连接数据库,不管是 MySQL、 SQL Server、 PostgreSQL亦或是SQLite,使用时都是采用游标的方式,所以就不得不学习Python DB-API. Python所有的数据库接口程序都在一定程度上遵守 Python DB-API 规范. DB-API定义了一系列必须的对象和数据库存取方式,以便为各种底层数据库系统和多种多样的数据库接口程序提供一致的访问接口.

Python地理数据分析工具MovingPandas

- - 标点符
MovingPandas 是一个用于分析轨迹数据的 Python 库. 它在处理和分析移动对象的时空数据方面非常强大,适用于地理信息系统(GIS)、时空数据分析和可视化等领域. 它是在热门的地理数据处理库 GeoPandas 的基础上构建的,GeoPandas 本身是建立在Pandas数据处理库之上的.

Neo4j 推出基于 Python 的嵌入式图数据存储

- wang - python.cn(jobs, news)
Neo4j很早就在说,会推出一个嵌入在Python中的图数据库模块,让Python可以通过图数据库的API操作本地文件以存储图结构的数据(类似于很多支持SQLite的类库). 而今天Neo4j终于在官方博客上兑现了其承诺,并为自己的多次跳票表示抱歉. 目前最新版本在CPython2.7.2  Windows和Linux下都经过测试,在Python2.6版本下也可以正常工作.

飘逸的python - 大数据TopK问题的quick select解法

- - CSDN博客推荐文章
TopK问题,即寻找最大的K个数,这个问题非常常见,比如从1千万搜索记录中找出最热门的10个关键词.. 先排序,然后截取前k个数.. 时间复杂度:O(n*logn)+O(k)=O(n*logn). 维护容量为k的最小堆.根据最小堆性质,堆顶一定是最小的,如果小于堆顶,则直接pass,如果大于堆顶,则替换掉堆顶,并heapify整理堆,其中heapify的时间复杂度是logk..

使用python抓取并分析京东商品评论数据

- - 蓝鲸的网站分析笔记
本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化. 下面是要抓取的商品信息,一款女士文胸. 这个商品共有红色,黑色和肤色三种颜色, 70B到90D共18个尺寸,以及超过700条的购买评论. 京东商品评论信息是由JS动态加载的,所以直接抓取商品详情页的URL并不能获得商品评论的信息.

使用Python对数据进行归一化规格化

- - 标点符
数据归一化问题是数据挖掘中特征向量表达时的重要问题,当不同的特征成列在一起的时候,由于特征本身表达方式的原因而导致在绝对数值上的小数据被大数据“吃掉”的情况,这个时候我们需要做的就是对抽取出来的features vector进行归一化处理,以保证每个特征被分类器平等对待. 先前的文章中已经介绍了几种常见的 数据归一化的方法,这里对主要整理了如何将这些公式和方法转化程Python代码.

教你用几行Python和消费数据做客户细分

- - 机器之心
细分客户群是向客户提供个性化体验的关键. 它可以提供关于客户行为、习惯与偏好的相关信息,帮助企业提供量身定制的营销活动从而改善客户体验. 在业界人们往往把他吹嘘成提高收入的万能药,但实际上这个操作并不复杂,本文就将带你用简单的代码实现这一项目. 通过使用消费交易数据,我们将会通过创建一个2 x 2的有价值属性的矩阵来得到4个客户群.

Python +mysql 简易爬虫给新浪大 V 微博和文章做备份

- - V2EX - 技术
写了个爬虫定期抓取新浪指定用户的微博和文章,以防哪天失联了还能看备份. database.py 封装了各种 mysql 操作. post.py 抓取微博,每次抓取到上次抓取的时间为止. article.py 抓取文章,同上. gadget.py 用到的各种小工具. config.py 需要用到的参数.

关于Python数据分析,这里有一条高效的学习路径

- -
谷歌的数据分析可以预测一个地区即将爆发的流感,从而进行针对性的预防;淘宝可以根据你浏览和消费的数据进行分析,为你精准推荐商品;口碑极好的网易云音乐,通过其相似性算法,为不同的人量身定制每日歌单……. 数据正在变得越来越常见,小到我们每个人的社交网络、消费信息、运动轨迹……,大到企业的销售、运营数据,产品的生产数据,交通网络数据…….