Python中如何编写爬虫获取微信公众号文章的阅读数和点赞数
先放github 地址。
抓取方式:
-
-
模拟登陆微信公众号平台,借此获取需要爬取公众号文章的 url
-
通过
mitmproxy手机抓包,得到appmsgtoken和cookie,爬取文章的阅读数、点赞数及评论信息
-
-
不使用模拟登陆,用抓包工具获取相关参数后,直接抓取
有以下问题:
-
不知道如何使用
python在shell中显示获取到的二维码,目前使用的方式是用matplotlib和PIL显示。 -
获取微信公众号文章的时候,一次性不能爬取太多,一次最多貌似只能有 30、40 条。
-
API 设计上可能存在问题
以上,望大佬轻喷,提出意见
Python中如何编写爬虫获取微信公众号文章的阅读数和点赞数
反爬虫可以试试把包里的 agent 参数或者其他参数改变试试。如果是针对 ip 的话,那个人确实没啥办法。除非搞几台云服务器,(手动滑稽
要爬取微信公众号文章的阅读数和点赞数,得用微信的接口。直接爬网页是拿不到这些数据的,因为数据是通过接口动态加载的。核心是找到那个返回文章数据的接口,然后模拟请求。
这里有个关键点:你需要先获取文章的 __biz、mid 和 idx 这三个参数。它们通常在公众号文章页面的URL里或者页面源码的某个JavaScript变量里。
下面是一个示例,展示如何从一篇公众号文章的URL中提取这些参数,并请求数据接口。这个接口地址(https://mp.weixin.qq.com/mp/getappmsgext)是微信用来返回阅读数、点赞数等统计信息的。
import re
import json
import requests
from urllib.parse import urlparse, parse_qs
def get_article_stats(article_url, cookie):
"""
获取微信公众号文章的阅读数、点赞数等信息。
参数:
article_url (str): 公众号文章链接
cookie (str): 你的微信Cookie,需要从登录后的浏览器获取
返回:
dict: 包含阅读数(read_num)、点赞数(like_num)等信息的字典
"""
# 1. 从URL解析出关键参数 __biz, mid, idx
parsed_url = urlparse(article_url)
query_params = parse_qs(parsed_url.query)
# 这些参数可能在query里,也可能需要从页面源码中提取
# 这里假设它们在URL的query参数中
biz = query_params.get('__biz', [''])[0]
mid = query_params.get('mid', [''])[0]
idx = query_params.get('idx', [''])[0]
# 如果URL中没有,尝试从页面源码提取(更通用的方法)
if not all([biz, mid, idx]):
# 这里简化处理,实际可能需要更复杂的解析
resp = requests.get(article_url, headers={'User-Agent': 'Mozilla/5.0'})
# 使用正则查找这些参数(实际页面结构可能变化)
biz_match = re.search(r'__biz = "([^"]+)"', resp.text)
mid_match = re.search(r'mid = (\d+)', resp.text)
idx_match = re.search(r'idx = (\d+)', resp.text)
biz = biz_match.group(1) if biz_match else ''
mid = mid_match.group(1) if mid_match else ''
idx = idx_match.group(1) if idx_match else ''
if not all([biz, mid, idx]):
raise ValueError("无法从文章页面提取必要的参数 (__biz, mid, idx)")
# 2. 构造请求接口的URL和参数
appmsgstat_url = "https://mp.weixin.qq.com/mp/getappmsgext"
# 接口需要的参数
params = {
'__biz': biz,
'mid': mid,
'idx': idx,
'sn': '', # 通常可以为空
'scene': '124', # 固定值
'uin': '', # 需要你的uin,可以从cookie里找
'key': '', # 需要key,可以从cookie里找或接口返回
'pass_ticket': '', # 需要pass_ticket
'appmsg_token': '', # 需要appmsg_token
'x5': '0',
'f': 'json'
}
# 3. 设置请求头,Cookie是关键
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Cookie': cookie,
'Referer': article_url
}
# 4. 发送POST请求
response = requests.post(appmsgstat_url, params=params, headers=headers)
if response.status_code != 200:
raise ConnectionError(f"请求失败,状态码: {response.status_code}")
data = response.json()
# 5. 解析返回的数据
if data.get('appmsgstat'):
stat = data['appmsgstat']
return {
'read_num': stat.get('read_num', 0),
'like_num': stat.get('like_num', 0),
'old_like_num': stat.get('old_like_num', 0)
}
else:
raise ValueError("返回数据中未找到appmsgstat字段")
# 使用示例
if __name__ == "__main__":
# 替换成你的文章URL和Cookie
url = "https://mp.weixin.qq.com/s?__biz=XXXXX&mid=XXXXX&idx=XXXXX"
# Cookie需要从登录后的浏览器获取,包含关键信息如uin、key、pass_ticket等
your_cookie = "your_cookie_string_here"
try:
stats = get_article_stats(url, your_cookie)
print(f"阅读数: {stats['read_num']}")
print(f"点赞数: {stats['like_num']}")
except Exception as e:
print(f"获取数据失败: {e}")
重点说明:
- Cookie是关键:你需要一个有效的微信Cookie,里面必须包含
uin、key、pass_ticket、appmsg_token等字段。这个Cookie通常需要你手动登录微信公众号平台后,从浏览器开发者工具中复制。 - 参数获取:
__biz、mid、idx这三个参数是文章的身份证。上面的代码展示了两种获取方式:先从URL的查询参数里找,如果找不到,再尝试从页面HTML源码里用正则表达式匹配。后一种方法更健壮,但正则表达式可能需要根据页面实际情况调整。 - 接口参数:请求
getappmsgext接口时,除了那三个文章ID,还需要uin、key等从Cookie中提取的参数。示例中留空了,你需要用脚本从Cookie字符串里解析出来补上。 - 反爬机制:微信有反爬,频繁请求或Cookie失效会导致失败。确保Cookie有效,并适当控制请求频率。
总结:核心就是模拟那个带特定参数和Cookie的POST请求。
针对 ip 还好说,微信公众号这边针对的是账号。。。。。
登陆公众号平台再抓,效率太低,还不是全自动化的,没人会用这种。
嗯嗯,只是作为一个练习。并且个人使用就好,不打算大规模使用
谢谢,他是用 node 写的,有空研究下
这样抓取效率不高,用万能 key 会高很多,但五月初微信还更新了万能 key 的一些细节,所以随时可能被封。有兴趣的看我知乎的回答好了: https://www.zhihu.com/question/26716409/answer/224332129
微信文章阅读点赞,评论,服务号、订阅号区分 +wx crawler888


