微博各种数据抓取思路与难点总结——小白爬虫进阶(1)
优采云 发布时间: 2022-06-04 11:43微博各种数据抓取思路与难点总结——小白爬虫进阶(1)
最近后台留言异常的多,还有不少催更,看来各位小伙伴都是寒假稍歇后就立刻又投身于秃头事业了,让大家久等了,2022一起继续加油。
在之前的小白爬虫实战(1)里,我们以马云的微博为例初步演示了如何爬取一个微博用户的所有微博文本(回顾戳这→),最近有很多同学后台问起详细的思路,也有小伙伴对如何进一步抓取微博转发、评论、点赞数据甚至配图的抓取方法提出了疑问。
针对以上问题,本篇对微博数据的抓取做一个专门的梳理与总结,本文分为以下三部分:
1、抓取URL的构造
2、微博文本、转发、评论、点赞数据的抓取与保存
3、微博图片的抓取与保存
经过这三部分的梳理,相信各位能对有关微博的抓取有更进一步的了解,无论是抓取话题还是抓取热搜,万变不离其宗,只需要按需求在本文基础上进行些改动即可。
注意:本篇是基于爬虫实战(1)等前面相关内容之上的总结,一些基础的内容便不再赘述,有需要的小伙伴可以回顾之前的相关内容:
下面我们开始这三部分——
1
抓取URL的构造
在爬虫实战(1)中,我们用检查中的XHR过滤器找到了获取数据所需的链接地址,这个链接地址有一大坨,第一页链接与之后链接的差距就在于第一页的链接尾部没有since_id参数,这次我们进一步对这一大坨链接进行分解分析。
%3D1%26q%3D%E9%A9%AC%E4%BA%91&type=uid&value=2145291155&containerid=91155&since_id=44903
上面即是马云微博数据的第二页链接,若是把链接末尾的since_id删去即为第一页链接。在这么一大坨链接里,最终是靠着末尾since_id的变化实现获取下一页数据的,在爬虫实战(1)中,我们是直接将这一大坨复制粘贴到代码中,而为since_id专门设了一个变量,这次我们再进一步将这个链接拆分看看。
实际上,这么一大坨连接中,只有
为基础连接,后面的一长串都是各种各样的参数组合,比如uid、t、luicode等等,而这一长串由百分号、数字和字母构成的部分我们可以通过解码得到它的实际文本
%3D1%26q%3D%E9%A9%AC%E4%BA%91
我们可以在中对上面这行奇奇怪怪的内容进行URL解码:
解码之后:
通过解码可知,%3D1%26q%3D%E9%A9%AC%E4%BA%91的实际文本含义为“=1&q=马云”,据此可得这一大串链接的真实表达为:
=1&q=马云&type=uid&value=2145291155&containerid=91155&since_id=44903
也就是一个基础链接加上各种必要参数的组合。在Python中我们可以通过调用urlencode()方法将构造的参数字典与基础连接组合生成完整链接,据此我们首先构造一个生成完整请求链接的函数:
from urllib.parse import urlencode
def generate_url(since_id='0'):
"""
构造完整链接 """
base_url = ''
params = {
'uid': '2145291155',
't': '0',
'luicode': '10000011',
'lfid': '100103type=1',
'q': '马云',
'type': 'uid',
'value': '2145291155',
'containerid': '91155',
'since_id': since_id
}
url = base_url + urlencode(params)
return url
generate_url
因为只有since_id是变化的,而第一页链接又不含since_id,所以这里设一个since_id默认值为0的变量。
到此,抓取所需的URL便构造完成了。
2
微博文本、转发、评论、点赞数据的抓取与保存
在爬虫实战(1)中说到,若用火狐浏览器访问我们所构造的URL,可以得到结构化的json数据,而我们所需要抓取的目标就在这些json数据之中。微博文本在mblog的text下,而转发、评论、点赞数据也异曲同工:
数据位置
数据含义
mblog→reposts_count
点赞数
mblog→comments_count