汇总:基于Python采集爬取微信公众号历史数据
优采云 发布时间: 2022-11-02 12:25汇总:基于Python采集爬取微信公众号历史数据
在
本文,昆之鹏的技术人员将介绍一种通过模拟微信App的操作来采集指定公众号所有历史数据的方法。
通过我们的抓包分析,我们发现微信公众号的历史数据是通过HTTP协议加载的,对应的API接口如下图所示,有四个关键参数(__biz、appmsg_token、pass_ticket和COOKIE)。
为了能够得到这四个参数,我们需要模拟操作应用,让它生成这些参数,然后我们捕获数据包来获取它。对于模拟 App 操作,我们之前介绍了通过 Python 模拟 Android App 的方法(详见)。对于 HTTP 集成数据包捕获,我们之前介绍了 Mitmproxy (有关详细信息,请参阅)。
我们
需要模拟微信的操作才能完成以下步骤:
1. 启动微信应用
2. 点击“联系人”
3. 点击“公众号”
4)点击采集的公众号后
5. 点击右上角的用户图片图标
6. 点击“所有消息”
在这一点上,我们可以从#63开始;action=home 的答案数据捕获了三个关键参数,__biz、appmsg_token和pass_ticket,以及请求标头中的 cookie 值。如下图所示。
有了以上四个参数,我们可以构造一个 API 请求来获取历史文章列表,并通过调用 API 接口直接获取数据(无需模拟 App 操作)。核心参数如下,通过更改偏移参数,可以得到所有的历史数据。
# COOKIE
headers = {'COOKIE': 'rewardsn=; wxtokenkey=777; wxuin=584068438; devicetype=android-19; version=26060736; lang=zh_CN; pass_ticket=Rr8cO5c2******3tKGqe7aVZzV9TupvrK+1uHHmHYQGL2WFdKIE; wap_sid2=COKhxu4KElxckFZQ3QzTHU4WThEUk0zcWdrZjhGcUdYdEVSV3Y1X2NPWHNUakRrd1ZzMnpLTERpdE5rbmxjSTg******dlRBcUNRazZpOGxTZUVEQUTgNQJVO'}
url = 'https://mp.weixin.qq.com/mp/profile_ext?'
data = {}
data['is_ok'] = '1'
data['count'] = '10'
data['wxtoken'] = ''
data['f'] = 'json'
data['scene'] = '124'
<p>
data['uin'] = '777'
data['key'] = '777'
data['offset'] = '0'
data['action'] = 'getmsg'
data['x5'] = '0'
# 下面三个参数需要替换
# https://mp.weixin.qq.com/mp/profile_ext&#63;action=home应答数据里会暴漏这三个参数
data['__biz'] = 'MjM5MzQyOTM1OQ=='
data['appmsg_token'] = '993_V8%2BEmfVD7g%2FvMZ****4DNUJNFkg~~'
data['pass_ticket'] = 'Rr8cO5c23ZngeQHRGy8E7gv*****pvrK+1uHHmHYQGL2WFdKIE'
url = url + urllib.urlencode(data)</p>
以微信公众号“数字工厂”为例,采集流程操作截图如下图所示:
输出的屏幕截图如下所示:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
解决方案:VBA一键提取广东省工资系统《个人信息采集表》A3版本
前两天发了一个A4版的摘录
因为A4版的内容是
(1)前5行内容一致
(2)5行之后,根据个人有不同的内容
于是我用了九N二H的幂,根据不同的内容做出不同的判断,将不同的内容提取到不同的单元格中。(你看表达这么麻烦,设计一定不简单)
【解决了】
我今天下载了一个A3版本,
简单就是完美
发现A3版的内容都是固定单元格。
(1)我们只要找到要提取的内容的单元格(彩色),放在第一行,如下图
然后将第一行的内容读入数组,就可以得到总的列数
(2)读取文件总数得到总行数,Redim一个数组(总行数,总列数)
(3)运行程序,循环自动逐个打开Excel文件,将第一行指定的单元格读取到汇总表中
您可以轻松完成数据提取。大约 3K 文件在 400 多秒内被提取出来。完美的,
【代码】
Sub yhd一键提取广东省工资系统个人信息A3版本()
Dim mysht As Worksheet
Dim fold As String, file, data_arr()
Dim myobj As Object
Dim file_num
<p>
file_num = 0
Set mysht = Sheets("提取A3")
fold = SelectGetFolder
If fold = "没有选择" Then Exit Sub
arr = GetPathAllFile(fold)
Call AppEx(False)
ti = Timer()
With mysht
.Range("a5").Resize(5000, 200).ClearContents
xl_c = .Range("A1").End(xlToRight).Column
ReDim data_arr(UBound(arr) - 1, xl_c - 1)
start_arr = .Range("A1").Resize(2, xl_c)
Debug.Print UBound(start_arr, 2), UBound(data_arr, 1) & "--" & UBound(data_arr, 2)
End With
For Each rr In arr
Set myobj = GetObject(rr)
With myobj
With .Sheets("Sheet1")
For i = 1 To xl_c
data_arr(file_num, i - 1) = .Range(start_arr(1, i))
Next i
End With
.Close False
End With
file_num = file_num + 1
Set myobj = Nothing
Next
With mysht.Range("a5").Resize(UBound(data_arr, 1) + 1, UBound(data_arr, 2) + 1)
.NumberFormatLocal = "@"
.Value = data_arr 'Application.Transpose(arr)
.ShrinkToFit = True
End With
Call AppEx(True)
MsgBox "完成!用时" & Format(Timer - ti, "0000.00秒")
End Sub
</p>
复制
代码在这里供自己和有用的人学习和使用,如果您有任何问题,可以问我
【影响】
你们的喜欢和欣赏是我前进的动力。
感激的!