需求
某某微信公众号历史的所有文章的阅读数和点赞数
难点
微信公众号历史的所有文章(来源???)
每篇文章的阅读量和点赞量(电脑上浏览文章只显示内容,没有阅读量、点赞量、评论……)
突破难点一
搜狗微信搜索,可以搜索微信公众号文章。但是貌似只能显示该公众号最近十篇的文章。放弃……
利用抓包工具(Fiddler),抓取文章。成本有点大……,且貌似只能抓取原创文章。不符合个人需求,放弃……
利用微信个人订阅号进行爬取,神奇的操作。
操作
拥有一个微信个人订阅号,附上登陆和注册链接。微信公众平台
好在之前无聊注册过一次,所以就可以直接登陆操作。没有注册的童鞋可以用自己的微信号注册一下,过程十分简单,在此就不赘述了
登陆之后,点击左侧菜单栏“管理”-“素材管理”。再点击右边的“新建图文素材”
弹出一个新的标签页,在上面的工具栏找到“超链接”并点击
弹出了一个小窗口,选择“查找文章”,输入需要查找的公众号,这里用“科技美学”公众号作为例子
点击之后,可以弹出该公众号的所有历史文章
代码实现
# -*- 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"])123456789101112131415161718192021222324252627282930313233343536373839404142
以上,即可爬取微信公众号的一页数据,如果是爬取所有页的数据,则需要改变number进行爬取。
注:每次抓取完一页之后,最好设定time.sleep(3)。过快会导致爬取失败
突破难点二
这里我使用的方法是在电脑上登陆微信客户端,进行抓包分析。从客户端看推文可以看到阅读量、点赞量。
我使用的是Fiddler。Fiddller具体使用就不赘述了。下面直接演示操作
操作
打开fiddler开始监控
登陆微信客户端,浏览该公众号的任意一篇推文
可以观察到这里的内容显示会有阅读量、点赞量、评论等
观察fiddler的监控数据,如下图显示
5. 其中/mp/getappmgsext?...
是我们推文内容的url,双击之后,fiddler界面右边出现如下图数据
6. 上图下侧的json里面的read_num
、like_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,`req_id`、`pass_ticket`分别对应文章的信息,从fiddler复制即可。不过貌似影响不大 data = { "is_only_read": "1", "req_id": yourreq_id, "pass_ticket": yourpass_ticket, "is_temp_url": "0", } """ 添加请求参数 __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() # 提取其中的阅读数和点赞数 print(content["appmsgstat"]["read_num"], content["appmsgstat"]["like_num"])12345678910111213141516171819202122232425262728293031323334353637383940
以上即可获取到一篇文章的阅读量、点赞量。
Cookie
、req_id
、pass_ticket
、key
、appmsg_token
、__biz
利用fiddler获取
如果是需要多篇文章,需要更改的参数mid
、sn
、idx
如果是不同公众号,就需要根据url修改__biz
多篇文章的爬取,需要根据之前爬取到的url进行提取关键信息,分别爬取。
注:每次抓取完一页之后,最好设定time.sleep(3)。过快会导致爬取失败。
写在最后
以上就是这次微信爬虫的经历。
需要掌握的基本技能:
python爬虫的语法
Chrome、Fiddler基本使用
网络爬虫基本常识
以上代码不完善的点:
使用Cookie登陆,未实现自动登陆
key、appmsg_token一些关键参数需要进行手动获取
实际运行之后,就算设定了爬取间隙时间,还是会被封禁。
说明:
网上一些说法,key半小时过期,我好像没有遇到。
代码中若有细节问题,欢迎指出讨论