Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)

发布日期:2025-01-04 17:27    点击次数:109
背景说明 感觉微信公众号算得是比较难爬的平台之一,不过一番折腾之后还是小有收获的。没有用Scrapy(估计爬太快也有反爬限制),但后面会开始整理写一些实战出来。简单介绍下本次的开发环境: python3 requests psycopg2 (操作postgres数据库) 抓包分析 本次实战对抓取的公众号没有限制,但不同公众号每次抓取之前都要进行分析。打开Fiddler,将手机配置好相关代理,为避免干扰过多,这里给Fiddler加个过滤规则,只需要指定微信域名mp.weixin.qq.com就好: Fiddler配置Filter规则 平时关注的公众号也比较多,本次实战以“36氪”公众号为例,继续往下看: “36氪”公众号 公众号右上角 -> 全部消息 在公众号主页,右上角有三个实心圆点,点击进入消息界面,下滑找到并点击“全部消息”,往下请求加载几次历史文章,然后回到Fiddler界面,不出意外的话应该可以看到这几次请求,可以看到返回的数据是json格式的,同时文章数据是以json字符串的形式定义在general_msg_list字段中: 公众号文章列表抓包请求 分析文章列表接口 把请求URL和Cookie贴上来进行分析: 下面把重要的参数说明一下,没提到的说明就不那么重要了: __biz:相当于是当前公众号的id(唯一固定标志) offset:文章数据接口请求偏移量标志(从0开始),每次返回的json数据中会有下一次请求的offset,注意这里并不是按某些规则递增的 count:每次请求的数据量(亲测最多可以是10) pass_ticket:可以理解是请求票据,而且隔一段时间后(大概几个小时)就会过期,这也是为什么微信公众号比较难按固定规则进行抓取的原因 appmsg_token:同样理解为非固定有过期策略的票据 Cookie:使用的时候可以把整段贴上去,但最少仅需要wap_sid2这部分 是不是感觉有点麻烦,毕竟不是要搞大规模专业的爬虫,所以单就一个公众号这么分析下来,还是可以往下继续的,贴上截取的一段json数据,用于设计文章数据表: 可以简单抽取想要的数据,这里将文章表结构定义如下,顺便贴上建表的SQL语句: 文章数据表 附请求文章接口并解析数据保存到数据库的相关代码: 分析文章评论接口 获取评论的思路大致是一样的,只是会更加麻烦一点。首先在手机端点开一篇有评论的文章,然后查看Fiddler抓取的请求: 公众号文章评论 公众号文章评论接口抓包请求 提取其中的URL和Cookie再次分析: 接着分析参数: __biz:同上 pass_ticket:同上 Cookie:同上 offset和limit:代表偏移量和请求数量,由于公众号评论最多展示100条,所以这两个参数也不用改它 comment_id:获取文章评论数据的标记id,固定但需要从当前文章结构(Html)解析提取 appmsgid:票据id,非固定每次需要从当前文章结构(Html)解析提取 appmsg_token:票据token,非固定每次需要从当前文章结构(Html)解析提取 可以看到最后三个参数要解析html获取(当初真的找了好久才想到看文章网页结构)。从文章请求接口可以获得文章地址,对应上面的content_url字段,但请求该地址前仍需要对url做相关处理,不然上面三个参数会有缺失,也就获取不到后面评论内容: 再回来看该接口返回的json数据,分析结构后然后定义数据表(含SQL): 文章评论数据表 万里长征快到头了,最后贴上这部分代码,由于要先获取文章地址,所以和上面获取文章数据的代码是一起的: 文末小结 最后展示下数据库里的数据,单线程爬的慢而且又没这方面的数据需求,所以也只是随便试了下手: 抓取的部分数据 有时候写爬虫是个细心活,如果觉得太麻烦的话,推荐了解下WechatSogou这个工具。有问题的欢迎底部留言讨论。 完整代码:GitHub 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。