Python中如何编写爬虫获取微信公众号文章的阅读数和点赞数

先放github 地址

抓取方式:

    1. 模拟登陆微信公众号平台,借此获取需要爬取公众号文章的 url

    2. 通过mitmproxy手机抓包,得到appmsgtokencookie,爬取文章的阅读数、点赞数及评论信息

  • 不使用模拟登陆,用抓包工具获取相关参数后,直接抓取

有以下问题:

  1. 不知道如何使用pythonshell中显示获取到的二维码,目前使用的方式是用matplotlibPIL显示。

  2. 获取微信公众号文章的时候,一次性不能爬取太多,一次最多貌似只能有 30、40 条。

  3. API 设计上可能存在问题

以上,望大佬轻喷,提出意见


Python中如何编写爬虫获取微信公众号文章的阅读数和点赞数

9 回复

反爬虫可以试试把包里的 agent 参数或者其他参数改变试试。如果是针对 ip 的话,那个人确实没啥办法。除非搞几台云服务器,(手动滑稽


要爬取微信公众号文章的阅读数和点赞数,得用微信的接口。直接爬网页是拿不到这些数据的,因为数据是通过接口动态加载的。核心是找到那个返回文章数据的接口,然后模拟请求。

这里有个关键点:你需要先获取文章的 __bizmididx 这三个参数。它们通常在公众号文章页面的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}")

重点说明:

  1. Cookie是关键:你需要一个有效的微信Cookie,里面必须包含 uinkeypass_ticketappmsg_token 等字段。这个Cookie通常需要你手动登录微信公众号平台后,从浏览器开发者工具中复制。
  2. 参数获取__bizmididx 这三个参数是文章的身份证。上面的代码展示了两种获取方式:先从URL的查询参数里找,如果找不到,再尝试从页面HTML源码里用正则表达式匹配。后一种方法更健壮,但正则表达式可能需要根据页面实际情况调整。
  3. 接口参数:请求 getappmsgext 接口时,除了那三个文章ID,还需要 uinkey 等从Cookie中提取的参数。示例中留空了,你需要用脚本从Cookie字符串里解析出来补上。
  4. 反爬机制:微信有反爬,频繁请求或Cookie失效会导致失败。确保Cookie有效,并适当控制请求频率。

总结:核心就是模拟那个带特定参数和Cookie的POST请求。

针对 ip 还好说,微信公众号这边针对的是账号。。。。。

登陆公众号平台再抓,效率太低,还不是全自动化的,没人会用这种。

嗯嗯,只是作为一个练习。并且个人使用就好,不打算大规模使用

可以看看这个: https://github.com/lqqyt2423/wechat_spider
不过我没用过,据说很好用

谢谢,他是用 node 写的,有空研究下

这样抓取效率不高,用万能 key 会高很多,但五月初微信还更新了万能 key 的一些细节,所以随时可能被封。有兴趣的看我知乎的回答好了: https://www.zhihu.com/question/26716409/answer/224332129

微信文章阅读点赞,评论,服务号、订阅号区分 +wx crawler888

回到顶部