横空出世:基于PC端的爬取公众号历史文章
优采云 发布时间: 2020-11-20 10:04基于PC文章爬行官方帐户的历史记录
前言
许多处于微信后台的消息尚未得到回复:看到它们后我无法回复。如有任何疑问,可以添加我的微信:菜单->与我联系
因为我最近需要官方帐户的历史文章信息,所以我尝试对其进行爬网。尽管目前可以对数据进行爬网,但是它还不能对很多自动化进行爬网。原因是参数键值对时间敏感(特定时间未验证为20分钟),并且我不知道如何生成它。
文章历史记录列表爬网
进入搜狗微信的第一件事是搜狗微信,但搜狗微信只能看到前十篇文章文章,而我无法确定阅读量和观看次数。我试图爬网手机包装,发现没有信息被捕获。我知道原因:
1、Android系统7.低于0的微信信任系统证书。
2、Android系统7. 0或更高版本,微信7. 0版本,微信信任系统提供的证书。
3、Android系统7. 0或更高版本,微信7. 0或更高版本,微信仅信任自己的证书。
我也尝试使用appium自动进行爬网,我个人觉得有点麻烦。因此,尝试从PC抓取请求。
这次进入主题,我使用Fiddler捕获数据包。下载链接:
Fiddler如何捕获数据包将不在此处一一解释。首先,首次安装Fiddler时,需要安装证书以捕获HTTPS请求。
如何安装?
打开Fiddler并从菜单栏中找到工具->选项->单击HTTPS->单击操作,将安装证书,配置如下:
以我自己的官方帐户为例:登录PC上的微信,打开Fiddler,按F12键开始/停止抓包,进入官方帐户历史记录文章页,请参见Fiddler有很多请求,如图所示下方:
因为查看历史记录是为了跳转到新页面,所以您可以从正文中返回更多内容,并且通过Content-Type,您还可以知道返回的内容是css或html或js,因此您可以查看首先在html上,所以几乎可以在上面显示的红色框中找到链接,单击它,然后您可以从右侧查看返回结果和参数:
从右侧的页眉中,您可以看到请求链接,方法,参数等。如果要更清晰地查看参数,可以单击WebForms进行查看,其结果如上图所示。这是重要参数的说明:
__ biz:微信官方帐号的唯一标识(同一官方帐号保持不变)
uin:唯一的用户标识(同一微信用户保持不变)
键:微信的内部算法对时间敏感,所以我不知道它是如何计算的。
pass_ticket:有一个阅读权限加密,该加密已更改(在我的实际爬网中,我发现它是不必要的,可以忽略)
在这一点上,您实际上可以编写代码来爬网第一页的文章,但是返回的是html页,显然解析该页很麻烦。
您可以尝试向下滑动,加载下一页数据,然后查看它是json还是html。如果是json,则很容易处理,如果仍然是html,则必须对其进行一些解析。继续往下走,您会发现:
此请求是返回的文章列表,它是json数据,这对我们进行解析非常方便。从参数中,我们发现有一个偏移量为10的参数,这显然是页面的偏移量。此请求为10,以加载第二页的历史记录,将其果断地修改为0,然后发送请求,并获取第一页的数据,则无需解析html页,再次分析参数,并找到许多参数。他们中许多人是无用的。最终参数为:
action: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页面。这里没有更多说明(可以在完整代码中查看)。