項目實現地址。查看我的Github地址
一個公衆號數據暫定10元起,量大優惠;另亦可爬取文章具體內容整理成完整PDF。
目前具體可獲取指標(包含但不侷限):閱讀數、點贊數(在看)、評論內容及總數、正文內容及圖片、是否爲頭條、是否爲原創。
項目已經實現,比本文介紹的更加方便簡單,可直接調用。
關於批量關注公衆號的問題已解決,見我的另一篇csdn文章:自動批量關注微信公衆號(非逆向)
不求完美,只求能夠用。。。
截至2019年4月項目可正常運行, 方法已更新。
3月1號更新:
- 獲取閱讀點贊時,每篇文章間隔10s 一次性可獲取500篇文章以上
- 從公衆號獲取永久鏈接時,間隔3分鐘,可以連續獲取幾小時(網友測試)
公開已爬取的公衆號歷史文章的永久鏈接,數據上傳至GitHub,日期均截止commit時間。
需求
某某微信公衆號歷史的所有文章的閱讀數和點贊數
難點
- 微信公衆號歷史的所有文章(來源???)
- 每篇文章的閱讀量和點贊量(電腦上瀏覽文章只顯示內容,沒有閱讀量、點贊量、評論……)
突破難點一
- 搜狗微信搜索,可以搜索微信公衆號文章。但是貌似只能顯示該公衆號最近十篇的文章。放棄……
- 利用抓包工具(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"])
以上,即可爬取微信公衆號的一頁數據,如果是爬取所有頁的數據,則需要改變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 = {
"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"])
以上即可獲取到一篇文章的閱讀量、點贊量。
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半小時過期,我好像沒有遇到。
- 代碼中若有細節問題,歡迎指出討論
Github上已經實現了第1、2點,歡迎回到文章開頭看github上的實現過程。
關於被封禁的問題,已有兩個解決方案,均放在github上,在這不做講解。
- selenium解決方案,提高約十倍抓取量(不確定)。優點:提高抓取量;缺點:速度慢,不一定能完全抓取完整,抓取量不確定。test_seleinum.py
- 利用個人微信號的查看公衆號歷史消息,抓取量在500條以上,具體未測試。優點:抓取量最多的方案;缺點:短時間內(5-10分鐘)無法查看歷史消息,或者說無法持續抓取;不保證微信號會被封號。test_GetUrls.py