记一次微信公众号爬虫的经历(微信文章阅读点赞的获取)

笔记 同时被 2 个专栏收录
28 篇文章 1 订阅
2 篇文章 0 订阅

项目实现地址。查看我的Github地址

支持下载微信公众号内容为HTML(含图片,经过二次处理可以转换为Word、PDF),详情见GItHub。联系方式见评论。

原文代码由于时间久远,不一定能正确运行。若要正确运行,请参考Github代码

部分数据示例(由于数据量较大,数据可能需要几秒钟才能加载出来,请耐心等待):https://data.wnma3mz.cn/

追踪公众号文章(仅支持标题和链接一些基本数据),日更两次,https://data.wnma3mz.cn/demo.html

目前具体可获取指标(包含但不局限):阅读数、点赞数(在看)、评论内容及总数、正文内容及图片、是否为头条、是否为原创。
在这里插入图片描述

项目已经实现,比本文介绍的更加方便简单,可直接调用。

关于批量关注公众号的问题已解决,见我的另一篇csdn文章:自动批量关注微信公众号(非逆向)

不求完美,只求能够用。。。

截至2020年10月项目可正常运行, 方法已更新。

3月1号更新:

  1. 获取阅读点赞时,每篇文章间隔10s 一次性可获取500篇文章以上
  2. 从公众号获取永久链接时,间隔3分钟,可以连续获取几小时(网友测试)

公开已爬取的公众号历史文章的永久链接,数据上传至GitHub,日期均截止commit时间。

需求

某某微信公众号历史的所有文章的阅读数和点赞数

难点

  1. 微信公众号历史的所有文章(来源???)
  2. 每篇文章的阅读量和点赞量(电脑上浏览文章只显示内容,没有阅读量、点赞量、评论……)

突破难点一

  1. 搜狗微信搜索,可以搜索微信公众号文章。但是貌似只能显示该公众号最近十篇的文章。放弃……
  2. 利用抓包工具(Fiddler),抓取文章。成本有点大……,且貌似只能抓取原创文章。不符合个人需求,放弃……
  3. 利用微信个人订阅号进行爬取,神奇的操作。

操作

  1. 拥有一个微信个人订阅号,附上登陆和注册链接。微信公众平台

  2. 好在之前无聊注册过一次,所以就可以直接登陆操作。没有注册的童鞋可以用自己的微信号注册一下,过程十分简单,在此就不赘述了

  3. 登陆之后,点击左侧菜单栏“管理”-“素材管理”。再点击右边的“新建图文素材”

pic1

  1. ​弹出一个新的标签页,在上面的工具栏找到“超链接”并点击
    pic2

  2. 弹出了一个小窗口,选择“查找文章”,输入需要查找的公众号,这里用“科技美学”公众号作为例子
    pic3

  3. 点击之后,可以弹出该公众号的所有历史文章

pic4

代码实现

# -*- coding: utf-8 -*-
import requests
import time
import json


# 目标url
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"

# 使用Cookie,跳过登陆操作
headers = {
  "Cookie": yourcookie,
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
}

"""
需要提交的data
以下个别字段是否一定需要还未验证。
注意修改yourtoken,number
number表示从第number页开始爬取,为5的倍数,从0开始。如0、5、10……
token可以使用Chrome自带的工具进行获取
fakeid是公众号独一无二的一个id,等同于后面的__biz
"""
data = {
    "token": yourtoken,
    "lang": "zh_CN",
    "f": "json",
    "ajax": "1",
    "action": "list_ex",
    "begin": number,
    "count": "5",
    "query": "",
    "fakeid": yourfakeid,
    "type": "9",
}

# 使用get方法进行提交
content_json = requests.get(url, headers=headers, params=data).json()
# 返回了一个json,里面是每一页的数据
for item in content_json["app_msg_list"]:
    # 提取每页文章的标题及对应的url
    print(item["title"], "url": item["link"])

以上,即可爬取微信公众号的一页数据,如果是爬取所有页的数据,则需要改变number进行爬取。

注:每次抓取完一页之后,最好设定time.sleep(3)。过快会导致爬取失败

突破难点二

这里我使用的方法是在电脑上登陆微信客户端,进行抓包分析。从客户端看推文可以看到阅读量、点赞量。

我使用的是Fiddler。Fiddller具体使用就不赘述了。下面直接演示操作

操作

  1. 打开fiddler开始监控
  2. 登陆微信客户端,浏览该公众号的任意一篇推文
  3. 可以观察到这里的内容显示会有阅读量、点赞量、评论等
  4. 观察fiddler的监控数据,如下图显示

pic5
5. 其中/mp/getappmgsext?...是我们推文内容的url,双击之后,fiddler界面右边出现如下图数据

pic6
6. 上图下侧的json里面的read_numlike_num分别是阅读量和点赞量

####代码实现

import time
import requests
import json


# 目标url
url = "http://mp.weixin.qq.com/mp/getappmsgext"
# 添加Cookie避免登陆操作,这里的"User-Agent"最好为手机浏览器的标识
headers = {
    "Cookie": yourcookie,
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.27.400 QQBrowser/9.0.2524.400"
}


data = {
    "is_only_read": "1",
    "is_temp_url": "0",                
    "appmsg_type": "9", # 新参数,不加入无法获取like_num
}
"""
添加请求参数
__biz对应公众号的信息,唯一
mid、sn、idx分别对应每篇文章的url的信息,需要从url中进行提取
key、appmsg_token从fiddler上复制即可
pass_ticket对应的文章的信息,貌似影响不大,也可以直接从fiddler复制
"""
params = {
    "__biz": your__biz,
    "mid": article_mid,
    "sn": article_sn,
    "idx": article_idx,
    "key": yourkey,
    "pass_ticket": pass_ticket,
    "appmsg_token": yourappmsg_token,
}
# 使用post方法进行提交
content = requests.post(url, headers=headers, data=data, params=params).json()

# 由于上面这种方法可能会获取数据失败,可以采取字符串拼接这种方法
origin_url = "https://mp.weixin.qq.com/mp/getappmsgext?"
appmsgext_url = origin_url + "__biz={}&mid={}&sn={}&idx={}&appmsg_token={}&x5=1".format(your__biz, article_mid, article_sn, article_idx, yourappmsg_token)
content = requests.post(appmsgext_url, headers=headers, data=data).json()

# 提取其中的阅读数和点赞数
print(content["appmsgstat"]["read_num"], content["appmsgstat"]["like_num"])

以上即可获取到一篇文章的阅读量、点赞量。
Cookiereq_idpass_ticketkeyappmsg_token__biz利用fiddler获取
如果是需要多篇文章,需要更改的参数midsnidx
如果是不同公众号,就需要根据url修改__biz
多篇文章的爬取,需要根据之前爬取到的url进行提取关键信息,分别爬取。
注:每次抓取完一页之后,最好设定time.sleep(3)。过快会导致爬取失败。

写在最后

以上就是这次微信爬虫的经历。

需要掌握的基本技能:

  1. python爬虫的语法
  2. Chrome、Fiddler基本使用
  3. 网络爬虫基本常识

缺陷:

  1. 使用Cookie登陆,未实现自动登陆
  2. key、appmsg_token一些关键参数需要进行手动获取
  3. 实际运行之后,就算设定了爬取间隙时间,还是会被封禁(获取链接时)。

说明:

  1. 网上一些说法,key半小时过期,我好像没有遇到。
  2. 代码中若有细节问题,欢迎指出讨论

Github上已经实现了第1、2点,欢迎回到文章开头看github上的实现过程。

关于被封禁的问题,已有两个解决方案,均放在github上,在这不做讲解。

  1. selenium解决方案,提高约十倍抓取量(不确定)。优点:提高抓取量;缺点:速度慢,不一定能完全抓取完整,抓取量不确定。test_seleinum.py
  2. 利用个人微信号的查看公众号历史消息,抓取量在500条以上,具体未测试。优点:抓取量最多的方案;缺点:短时间内(5-10分钟)无法查看历史消息,或者说无法持续抓取;不保证微信号会被封号。test_GetUrls.py
评论 98 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页

打赏作者

wnma3mz

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值