这是 月小水长 的第 88 篇原创干货
目前公众号平台改变了推送机制,点“赞”、点“在看”、添加过“星标”的同学,都会优先接收到我的文章推送,所以大家读完文章后,记得点一下“在看”和“赞”。
在微博上发布的内容有的短文本+图片(也就是微博),还有视频,文章等形式,爬取用户微博可以使用之前的源代码文章:一个爬取用户所有微博的爬虫,还能断网续爬那种
本次分享的是如何爬取用户的所有文章。有文章标题,id,内容,发布时间,阅读数,评论数,点赞数,图片链接等字段或信息,并开放源代码。
下面以【共青团中央】微博为 target,抓取该账号发布的所有文章,大部分都是深度好文,值得保存起来细细品读。
它的主页 url 地址为
https://weibo.com/u/3937348351?tabtype=article
可以从 url 知道它的 uid 就是 3937348351,我们不断地往下翻网页,可以注意到一个请求和文章数据是密切相关的,这个请求就是
https://weibo.com/ajax/statuses/mymblog
在 Filter 框输入 mymlog 就能过滤出此类请求,然后在请求上右键 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 改成如下的字典形式
params = {
'uid': '1516153080',
'page': '1',
'feature': '10',
}
其实上面一个爬虫的爬取流程就完成,然后就是设计爬虫架构了,具体来说就是考虑怎么自动翻页请求,怎么及时保存数据以及选择保存媒介,如何判断停止,以及弱网无网等情况下爬虫的稳定性问题等等,这些都是需要在不断实践中结合业界最佳实践和自己的偏好形成自己的方法论的,没有最好的办法,只有最合适的办法。
下面针对实际问题简单介绍下如何设计这个爬虫的问题。
怎么让它自动翻页呢,这个爬虫很简单,只需要设计一个循环,在解析保存完一个请求的数据后不断 page + 1就行,有时稍微复杂点的需要从上一个请求的 response 里或者中间某个请求的 js 文件里找到指定的可以使请求继续的参数。当解析发现没有数据时,就可以跳出这个循环了。并保存数据。
还有个问题就是解析的问题,这个爬虫大部分字段是可以直接获取的,但是文章的具体内容需要额外再请求一次,这也是大部分资讯类网站需要面临的问题,无形中增加了大量请求,容易造成反爬。没有很好的办法可以避开这个问题,只能直面问题。
保存数据时,一定要针对一些异常情况作处理,比如由于断网了,爬了几十万条微博数据在内存中没有持久化保存到文件中而丢失,这可就大亏特亏了,建议在执行具体的 requests 请求时加个 try...except Exception NetworkError(伪代码) ,在 expect 中执行最后的保存工作,同时保存一些配置信息比如出错的 page,下次可以直接从这个 page 继续,就没必要重试了,因为没网重试也是没网。微博数量多的时候,可以考虑每翻 N 页面保存一次,不过文章数量一般比微博少多个,可以直接爬完保存,具体情况具体分析。
源代码就不贴在公众号了,篇幅过长,后台小窗免费获取,获取源代码后,只需要修改你想抓取的用户 id 和你的登录 cookie 即可,怎么获取 id 和 cookie,可以参考上文如何自动生成代码那部分。
最近也会有较多微博爬虫相关的更新,请持续关注,在短视频爆炸的今天,原创图文内容不易,转发好看就是最大的支持~