开发工具
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
网友评论