4步爬取微博评论数据,会写 helloworld 就能学会

By 刘志军 , 2020-03-01, 分类: PYTHON技术

爬虫

想去微博爬下微博评论拿来做数据分析,拿以前写的代码用发现跑不起来了

然后用浏览器登录微博看了下请求过程,发现规则确实变了。以前可以直接看到数据接口,现在变复杂了。

咋办呢?

吭呲吭呲从0开始分析? 那样太低效了。你遇到的坑肯定很多人都遇到过,这个时候我们就没必要自己重新去踩了。直接从他们填好的坑上走过去就好了,过蜀道如平川。

这里教你一个方法,叫做5步法爬取微博评论。

第一步:百度/Google

用搜素引擎搜关键字“微博评论爬虫 python”, 基本上第一页的结果都是最近一年写的文章,有一定时效性,太早的文章就直接忽略。随便打开两篇你能看懂的文章,记住,看不懂不是你的问题,是作者没写明白。

我搜到简书上的一篇文章,地址:https://www.jianshu.com/p/8dc04794e35f , 不过按照她的方式操作已经不起效了,因为微博的评论数据获取方式改了,但是发现了一个很重要的线索。

第二步:分析验证

虽然数据不再是通过接口的方法返回的,但是老接口还能用 https://m.weibo.cn/api/comments/show?id={id}&page={page} , 这里的id只是某条微博的id, page 是分页参数。

于是尝试用这个接口去获取数据

微信截图_20200301125337.png

确实能拿到数据,一共有40多万条数据,每页10条,41336页。当你正喜出望外的时候,却发现只能获取最近50页的数据。把 page 参数改成 51 就不行了。

微信截图_20200301125749.png

不难理解,这种分页方式在MySQL中是效率非常低效的,特别是遇到数据非常的时候,所以用这种方式拿不到全部分页的数据是情理之中的。

幸好,还有一个新接口,https://m.weibo.cn/comments/hotflow?mid=4477013081328252&max_id=330569188932643&max_id_type=0

这个接口也能拿到评论,mid 是某条微博的参数, max_id 是分页参数,这个参数可以从一个请求返回的数据中拿到

微信截图_20200301130957.png

第三步:写代码、测试

数据获取的原理搞懂了, 就可以通过代码来实现,几十万条数据就能唰唰的爬下来了。

为了能够更好的做分析处理,我决定叫数据保存到MongoDB,它的好处就不介绍了,反正就是省事。

"""
爬取微博评论,保存到数据库

https://m.weibo.cn/api/comments/show?id=4477013081328252&page=50
该接口能获取微博的前50页数据,每页10条, id 是某条微博的id


https://m.weibo.cn/comments/hotflow?mid=4477013081328252&max_id=330569188932643&max_id_type=0
此接口能爬到所有评论信息, mid 是某条微博id, max_id 是上一个请求返回的分页参数, max_id_type 固定为0就好
"""

from pymongo import MongoClient
import requests
import time

__author__ = 'liuzhijun'

headers = {
    "Host": "m.weibo.cn",
    "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",
    "Cookie": "xxxxx" # 这里将浏览器的cookie复制过来进行了。
}

client = MongoClient('mongodb://localhost:27017/')
db = client['weibo']


def main(mid, max_id):
    """
    :param mid: 某条微博id
    :param max_id: 分页参数
    :return:
    """
    url = "https://m.weibo.cn/comments/hotflow?max_id_type=0"
    params = {"mid": mid}
    if max_id:
        params['max_id'] = max_id

    res = requests.get(url, params=params, headers=headers)
    print(res.content)
    result = res.json()
    max_id = result.get("data").get("max_id")
    data = result.get('data').get('data')
    for item in data:
        db['comment'].insert_one(item)

    if max_id:
        time.sleep(1)
        main(mid, max_id)


if __name__ == '__main__':
    main("4477013081328252", None)

weibocomment.gif

最后数据整整齐齐保存在数据库中

微信截图_20200301140227.png

第4步:关注公众号

核心代码就那么几行,是不是觉得特别简单,如果你会写HelloWorld,那么这个代码对你来说也不难嘛,这对做产品、做运营的时候来说,简直就是救命药。再也不要求程序员哥哥要数据了。

把这边文章分享给你身边的朋友,关注我一起搞数据啊。。。如果你在爬数据过程中遇到任何微信可以微信加我 "yueryounali"


关注公众号「Python之禅」,回复「1024」免费获取Python资源

python之禅

猜你喜欢

2017-02-10
Python 爬虫:把廖雪峰教程转换成 PDF 电子书
2017-02-14
基于微博数据打造一颗“心”
2017-04-06
爬虫入门系列(一):快速理解HTTP协议
2022-08-04
滑动验证码破解
2017-04-26
爬虫入门系列(四):HTML文本解析库BeautifulSoup
2022-11-06
公众号最新文章获取API
2017-05-23
爬虫入门系列(五):正则表达式完全指南(上)
2017-04-16
爬虫入门系列(三):用 requests 构建知乎 API
2017-08-18
Python爬虫如何入门
2017-03-30
Python爬虫之模拟知乎登录