微信公众号文章的爬虫可以通过多种方式,例如搜狗的接口,传送门等网站,但是有个问题,就是这些网站只能获取文章的内容,而不能获取文章相应的点赞数评论数,以及阅读量等信息,所以今天教一下大家通过微信客户端进行爬取这些信息。
我们用电脑微信客户端登陆自己的微信,可以观察到微信文章是不能直接在浏览器上访问到详细信息的,所以我们爬取还是要通过抓包。本文抓取的主要思路是这样的,通过抓包分析微信公众号向服务器发送的各种请求以及各种参数之间的关系,然后用python模拟客户端发送请求,获取相应的数据,下面展开详细讲解。
首先将手机和电脑连接在同一个局域网内,然后用fiddler设置代理,通过手机访问公众号历史信息,获取请求数据。如图,随机点击一个公众号的历史信息
这个URL比较长,但是我们可以精简一下成这样
https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz={biz}&scene=124&devicetype=iOS10.0.2&version=16050321&lang=zh_CN&nettype=WIFI&a8scene=3&fontScale=131&wx_header=1'.format(biz=self.biz)
其中biz相当于公众的身份证号,一个公众号只要一个,所以我们只要模拟请求该URL就可以了,但是里面有个key关键参数,这个key值怎么产生的不知道,而且有时效性,每过20来分钟就失效了,但是20多分对于抓取一个公众号足以,于是模拟访问该url,获得第一次访问历史页面的文章,一般是10篇,如图是模仿请求然后用正则获取文章url的代码
输出如图
接着的思路是访问每个详细文章页,获得文章标题,摘要,内容,而且分析请求可知,要获取文章的点赞阅读,以及评论,必须要根据文章详情页的参数。这里先看文章点赞阅读的请求
该请求是post请求,要获得需要的数据有两个关键点,第一个是cookie里面的wip_sid2这个值,一定要带上,该值也是有时效性的,不过可以夸公众号访问,不像key只那么严格,另外一个关键点是该请求需要提交的data,如图
分析过data发现里面前面的两个值都是在文章内容页面提取的,而且其他参数可以去掉,然后就可以模拟请求了,如图代码
接下来是评论的抓取,评论的的返回都是json数据,比较好解析,先看请求
评论的url里面携带了多个参数,有mid,sn,idx,第一个应该是文章的id,sn应该也是属于标记之类的,idx是表示本文是该作者当天第几篇发表的文章,一般是1或者2,这些都可以再详情页获取,下面是模拟请求的代码
里面headers的伪装于获取点赞的headers一样
有了根据文章url获取所有数据的办法只好,接下来看看怎么翻页获取文章的URL,在手机中下拉刷新文章的时候,触发的是该请求
如图,最关键的还是wap_sid这个参数,携带上这个参数加上refer跟ua就能访问下一页了,下一页返回的数据是json,直接解析就好了,headers也是比较简单的
first_url就是第一次访问历史信息的url
这样就能翻页抓取了,本人在代码里面翻页是利用文章的一个根据文章有递减规律的id,因为在翻页url里面的count参数不管用了,无论怎么访问还是只返回10个一次。
总结:在爬取的时候还是要手动截取公众号的key值跟wap_sid值,这两个值在首次访问历史信息都可以从客户端产生,虽然能爬,但还是不够自动化,感觉应该有更好的办法可以截取这两个参数,贴一张这两个参数的获取位置
上两张结果图,
下面这个爬取的是python中文社区的文章
这是萌叔在杭州公众号:
最后值得得一提的是两点,要想批量化抓取抓取微信公众号还是比较难的,有两个问题,第一个就是微信很容易封号,尤其是那些刚刚注册没有银行卡的(腾讯说:用微信哪有不付花钱?),而且微信号不像微博号那么好买啊,分分钟几块钱一个,还有一个就是自动化抓取,题主之前想过用按键精灵进行养号以及浏览要爬取的公众号,然后抓包软件自动捕获请求头写进本地文件,这个改几行fiddle的配置文件就好了,然后爬虫进行监听,然后获取相应的参数自行爬取信息,想想现在还是挺难实现的,那些利用微信爬虫做成了热搜榜的,我也好想探究一下整个流程啊,有什么好的改进的建议,各位小伙伴踊跃提啊;
第二点是这个爬虫当时让楼主获得了一个爬虫工程师的面试机会,楼主是去年毕业今年才转行的,大学读的还是文科,虽然最后还是没进去这间公司,好遗憾。。。要是有想转行做爬虫工程师的小伙伴可以考虑一下如何进行批量化抓取。