带大家一起爬取微信公众号文章

Cooci

开发工具

Python版本:3.6.4

相关模块:

pdfkit模块;

requests模块;

以及一些Python自带的模块。

抓包工具:fiddler

环境搭建

1.python环境

安装Python并添加到环境变量,pip安装需要的相关模块即可。

2.fiddler环境

去官网下载最新版本的安装包直接安装就ok啦,官网地址:

https://www.telerik.com/fiddler

原理简介

首先,我们打开fiddler这个抓包软件,其界面如下:

相关文件

关注公众号:python工程狮,回复“公众号”即可获取

对于不知道fiddler这个软件如何使用的,可以在公众号下方的菜单栏里获取我很久以前整理的一份fiddler使用入门教程:

资料区 ——> 个人整理 ——>  信息安全(Fiddler抓包)

然后,我们设置一下过滤规则以过滤掉没用的数据包,因为我们只想抓取微信相关的数据包而已,而不想其他没用的数据包干扰我们的分析,就像这样:

image

接着我们在电脑端登录微信,并随便找个公众号,查看它的历史文章列表。就像这样(这里我就不拿自己公众号举例了,怕历史文章丑陋的排版恶心到自己T_T):

image

不断滚动鼠标滚轮,以查看该公众号更多的历史文章数据。此时,我们可以在fiddler里看到出现了类似如下图所示的情况:

image

显然,红框里的https请求应该就是获得该微信公众号发的文章相关的数据的请求了。现在,我们来分析一下这个请求。显然,该请求的链接地址构成为(这是截图,微信里不让放和公众号主页相关的链接T_T):

image

接着看看请求头,请求头的话在这能看到:

image

感觉有个user-agent就足够了:

headers = {

接着看看cookies,在这(应该直接复制到代码里就行了):

image

最后,再看看发送这个请求需要携带哪些参数吧,在这:

image

即:

action

经过测试,我们可以发现如下参数是可以固定的:

action

其他参数的含义我们则可以根据经验和简单的测试进行判断:

1\. offset

前面三个可变参数都好解决,后面两个参数似乎就比较难办了。不过经过测试,我们可以发现pass_ticket其实是一个可有可无的参数,所以我们可以不管它。而appmsg_token的有效期至少有10几个小时,这段时间足够我们爬取目标公众号的所有文章了,所以直接复制过来就可以了,没必要浪费时间分析这玩意(随便想想也应该知道白嫖腾讯肯定没那么容易的T_T)。写个代码简单测试一下:

import requests

运行之后可以发现返回的数据如下:

image

看来是没啥问题,重新调整封装一下代码,就可以爬取该公众号所有文章的链接啦。具体而言,核心代码实现如下:

'''获得所有文章的链接'''

运行之后,我们就可以获得目标公众号的所有文章链接啦:

image

image

现在,我们只需要根据这些文章链接来爬取文章内容就行啦。这里我们借助python的第三方包pdfkit来实现将每篇文章都保存为pdf格式的文件。具体而言,核心代码实现如下:

'''下载所有文章'''

注意,使用pdfkit前需要先安装wkhtmltopdf。如下图所示:

image

运行的效果大概是这样子的:

image

image

大功告成,完整源代码详见相关文件~

效果展示

根据自己的抓包结果修改cfg.py文件:

# 目标公众号标识

然后在cmd窗口运行如下命令即可:

python articlesSpider.py
阅读 1.8k
238 声望
20 粉丝
0 条评论
你知道吗?

238 声望
20 粉丝
宣传栏