40

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

 4 years ago
source link: https://foofish.net/weibo-comment.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

咋办呢?

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

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

第一步:百度/Google

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

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

第二步:分析验证

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

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

FzEnEbb.png!web

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

YJje6rq.png!web

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

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

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

Mj6ZJjR.png!web

第三步:写代码、测试

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

为了能够更好的做分析处理,我决定叫数据保存到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)

E7nAnae.gif

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

vuy2Enz.png!web

第4步:关注公众号

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

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

有问题可以扫描二维码和我交流

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

vQremuy.jpg!web

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK