querylist采集微信公众号文章(Fiddler如何抓包这里不再一一阐述,首先第一次如何安装?(组图))
优采云 发布时间: 2021-12-18 22:13querylist采集微信公众号文章(Fiddler如何抓包这里不再一一阐述,首先第一次如何安装?(组图))
前言
微信后台很多消息都没有回复:看到就回复不了。有什么问题可以加我的微信:菜单->联系我
由于最近需要公众号的历史文章信息,尝试爬取。虽然目前可以爬取数据,但是还不能实现大量的自动化爬取。原因是参数key值是时间敏感的(具体时间没有验证为20分钟),目前不知道怎么生成。
文章历史列表爬取
第一个是搜狗微信,但是搜狗微信只能看到前十篇文章,看不到阅读量和观看数。尝试爬取手机包,发现没有抓取到任何信息。知道原因:
1、Android系统7. 0以下,微信信任系统的证书。
2、Android系统7.0及以上,微信7.0版本,微信信任系统提供的证书。
3、Android系统7.0及以上,微信7.0及以上,微信只信任自己的证书。
我也试过用appium来自动爬取,个人觉得有点麻烦。所以尝试从PC上抓取请求。
进入正题,这次我用Fiddler抓包。下载链接:
Fiddler如何抓包这里就不一一解释了。首先,第一次安装Fiddler时,需要安装一个证书来捕获HTTPS请求。
如何安装?
打开Fiddler,在菜单栏找到Tools -> Options -> 点击HTTPS -> 点击Actions,证书安装配置如下:
以我自己的公众号为例:PC端登录微信,打开Fiddler,按F12开始/停止抓包,进入公众号历史文章页面,看到Fiddler有很多请求,如如下图所示:
由于查看历史记录是跳转到一个新的页面,所以可以从body中看到返回的更多。同时通过Content-Type可以知道返回的是css或者html或者js。你可以先看一下html,所以它会找到上图红框中的链接,点击它,从右边可以看到返回的结果和参数:
从右边的Headers可以看到请求链接、方法、参数等,如果想更清楚的查看参数,可以点击WebForms查看,就是上图的结果。以下是重要参数的说明:
__biz:微信公众号的唯一标识(同一公众号保持不变)
uin:唯一用户标识(同一微信用户不变)
关键:微信内部算法是时间敏感的。我目前不知道如何计算。
pass_ticket:有读权限加密,改了(在我实际爬取中发现没必要,可以忽略)
这时候其实可以写代码爬取第一页的文章,但是返回的是一个html页面,解析页面显然比较麻烦。
可以尝试向下滑动,加载下一页数据,看看是json还是html。如果是json,好办,如果还是html,那就得稍微解析一下了。继续往下查找:
这个请求是文章的返回列表,是json数据,非常方便我们解析。从参数中我们发现有一个offset为10的参数,很明显这个参数是分页的offset,这个请求是10来加载第二页的历史记录,果断修改为0,然后发送请求,拿到第一页的数据,然后就不用解析html页面了,再次分析参数,发现是Multi-parameters,很多都没用,最后的参数是:
动作:getmsg(固定值,应该是获取更多信息)
__biz、uin、key这三个值上面已经介绍过了,这里也是必选参数。
f:json(固定值,表示返回json数据)
偏移:页面偏移
如果要获取公众号的历史列表,这6个参数是必须的,其他参数不需要带。我们来分析一下请求头中的听者,如图:
参数很多,不知道哪些应该带,哪些不需要带。最后,我只需要携带UA,别的什么都没有。最后写个脚本尝试获取:
import requests
url = "链接:http://链接:mp.weixin链接:.qq.com/mp/profile_ext"
headers= {
'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A403 MicroMessenger/6.5.18 NetType/WIFI Language/zh_CN'
}
param = {
'action': 'getmsg',
'__biz': 'MzU0NDg3NDg0Ng==',
'f': 'json',
'offset': 0,
'uin': 'MTY5OTE4Mzc5Nw==',
'key': '0295ce962daa06881b1fbddd606f47252d0273a7280069e55e1daa347620284614629cd08ef0413941d46dc737cf866bc3ed3012ec202ffa9379c2538035a662e9ffa3f84852a0299a6590811b17de96'
}
index_josn = requests.get(url, params=param, headers=headers)
print(index_josn.json())
print(index_josn.json().get('general_msg_list'))
获取json对象中的general_msg_list,得到结果:
获取文章的详细信息
我有上面的链接,只是请求解析 html 页面。此处不再解释(可在完整代码中查看)。