大家好,我是 @马哥python说,一枚10年程序猿。
分享一期python爬虫案例,爬取目标是新浪微博的微博签到数据,字段包含:
页码,微博id,微博bid,微博作者,发布时间,微博内容,签到地点,转发数,评论数,点赞数
(资料图)
经过分析调研,发现微博有3种访问方式,分别是:
PC端网页:https://weibo.com/
移动端:https://weibo.cn/
手机端:https://m.weibo.cn/
最终决定,通过手机端爬取。
这里,给大家分享一个爬虫小技巧。当目标网站既存在PC网页端,又有手机移动端,建议爬取移动端,原因是:移动端一般网页结构简单,并且反爬能力较弱,更方便爬虫爬取。
通过爬虫代码,爬取了“环球影城”这个关键字下的前100页微博,部分数据如下:
一共翻页了100页,大概1000条左右微博。
首先,导入需要用到的库:
然后,定义一个转换时间字符串的函数,因为爬取到的时间戳是GMT格式(类似这种:Fri Jun 17 22:21:48 +0800 2022)的,需要转换成标准格式:
定义一个请求头,后面发送请求的时候带上它,防止反爬:
打开chrome浏览器,在m端网址搜索"环球影城",选择地点,选择第一条搜索结果"北京环球影城",如下:
获取地点对应的containerid,后面会用到,爬虫代码如下:
点击第一个地点"北京环球影城",跳转到它对应的微博签到页面:
首先打开开发者模式,然后往下翻页,多翻几次,观察XHR页面的网络请求:
根据分析结果,编写请求代码:
其中,since_id每次翻页+1,相当于页码数值。
请求参数,可以在Payload页面获取:
下面开始发送请求并解析数据:
定义一些空列表,用于后续保存数据:
以"微博博文"为例,展示代码,其他字段同理,不再赘述。
把所有数据保存到Dataframe里面:
最终,把所有数据保存到csv文件:
说明一下,由于每次保存csv都是追加模式(mode='a+'),所以加上if判断逻辑:
如果csv存在,说明不是第一次保存csv,不加表头;
如果csv不存在,说明是第一次保存csv,加上表头。
如此,可避免写入多次表头的尴尬局面。
整个代码中,还含有:正则表达式提取博文、爬取展开全文、从博文中提取签到地点、数据清洗(删除空数据、去重复)等功能,详细请见原始代码。
演示视频:
爱学习的小伙伴,本次分析过程的完整python源码及结果数据,我已打包好,并上传至我的微信公众号"老男孩的平凡之路",后台回复"爬微博签到"即可获取。
我是@马哥python说 ,持续分享python干货!
推荐阅读:
Copyright@ 2015-2022 西方包装网版权所有 备案号: 沪ICP备2020036824号-7 联系邮箱:5 626 629 @qq.com