[开源代码] 一个爬取微博用户所有文章的爬虫

大侠一枝花 2023-02-04 0

点击上方月小水长,设为星标第一时间接收干货推送

这是岳小水长的第88期原创干货

目前,公众号平台已经改变了推送机制。 点“赞”,点“在看”,加“星”的同学会优先收到我的文章推送,所以看完文章记得点“在看”和“点赞”。

微博发布的内容有短文+图片(即微博),也有视频、文章等,爬取用户微博可以使用之前的源码文章:

这次分享一下如何爬取用户的所有文章。 有文章标题、id、内容、发布时间、阅读数、评论数、点赞数、图片链接等字段或信息,并开源代码。

我们以【共青团中央】微博为例,抓取该账号发布的所有文章。 大部分都是有深度的好文章,值得收藏和仔细阅读。

它的主页url地址是

https://weibo.com/u/3937348351?tabtype=article

复制

我们可以从url中知道它的uid,我们一直向下滚动网页,我们可以注意到一个请求与文章数据密切相关,这个请求是

https://weibo.com/ajax/statuses/mymblog

复制

您可以通过在框中键入来过滤掉此类请求,然后在请求上右键单击 Copy as cURL(bash) 以方便自动转换为爬虫代码。 具体见自动生成代码如下

import requests
headers = {
    'authority': 'weibo.com',
    'sec-ch-ua': '"Chromium";v="94", "Google Chrome";v="94", ";Not A Brand";v="99"',
    'x-xsrf-token': 'M5-ZNBqYi4YtNkfZ8nh_Oz_0',
    'traceparent': '00-348dc482c55e89d8cded23aaa7d56105-8f3e5ce7e78653bc-00',
    'sec-ch-ua-mobile': '?0',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36',
    'accept': 'application/json, text/plain, */*',
    'x-requested-with': 'XMLHttpRequest',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-mode': 'cors',
    'sec-fetch-dest': 'empty',
    'referer': 'https://weibo.com/u/3937348351?tabtype=article',
    'accept-language': 'zh-CN,zh;q=0.9,en-CN;q=0.8,en;q=0.7,es-MX;q=0.6,es;q=0.5',
    'cookie': '看不见我',
}
params = (
    ('uid', '3937348351'),
    ('page', '2'),
    ('feature', '10'),
)
response = requests.get('https://weibo.com/ajax/statuses/mymblog', headers=headers, params=params)

复制

我们要做的第一件事就是把它改成下面的字典形式

    params = {
        'uid': '1516153080',
        'page': '1',
        'feature': '10',
    }

复制

其实上面的爬虫的爬取过程就完成了,接下来就是爬虫架构的设计了。 具体就是考虑如何自动翻页请求,如何及时保存数据和选择存储介质,如何判断停止,以及弱网和无网情况等。爬虫的稳定性,等等,这些都需要结合业界的最佳实践和自己的喜好,在不断的实践中形成自己的方法论。 没有最好的方法,只有最合适的方法。

下面针对实际问题,简单介绍一下如何设计这个爬虫。

如何让它自动翻页? 这个爬虫非常简单。 你只需要设计一个循环。 一个的数据解析保存后,会继续page+1。有时候从上一个或者中间的某个地方开始抓取微博,会稍微复杂一点。 在请求的js文件中找到可以让请求继续的指定参数。 当分析发现没有数据时,可以跳出这个循环。 并保存数据。

另一个问题是解析的问题。 本爬虫的大部分字段都可以直接获取,但是文章的具体内容需要再次请求。 这也是大部分资讯网站需要面对的问题,无形中增加了大量的请求。 很容易造成反爬。 这个问题没有什么好的办法可以避免抓取微博,只能直面它。

在保存数据时,我们必须处理一些异常情况。 例如,由于网络断开,爬取的数十万条微博数据没有持久化在内存中,丢失在文件中。 这是一个很大的损失。 建议在执行具体请求的时候加一个try...(伪代码),在里面进行最后的保存工作,同时保存错误页面等一些配置信息,可以直接从这里继续下次页面,就不用重试了,因为没有网络,重试也是没有网络。 当微博数量较多时,可以考虑每隔N页保存一次,但是文章数量一般比微博少很多,爬取后直接保存即可。 具体情况具体分析。

源码就不在公众号贴了,太长了,可以后台窗口免费获取。 拿到源码后,你只需要修改你要抓取的用户id和你的登录名即可。 如何获取id,可以参考上面文章如何自动生成部分代码。

近期会有更多微博爬虫相关的更新,请继续关注,在短视频大爆发的今天,原创图文内容不易,好看的转发就是最大的支持~