記一次微信公衆號爬蟲的經歷(微信文章閱讀點讚的獲取)

項目實現地址。查看我的Github地址

一個公衆號數據暫定10元起,量大優惠;另亦可爬取文章具體內容整理成完整PDF。

目前具體可獲取指標(包含但不侷限):閱讀數、點贊數(在看)、評論內容及總數、正文內容及圖片、是否爲頭條、是否爲原創。
在這裏插入圖片描述

項目已經實現,比本文介紹的更加方便簡單,可直接調用。

關於批量關注公衆號的問題已解決,見我的另一篇csdn文章:自動批量關注微信公衆號(非逆向)

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

截至2019年4月項目可正常運行, 方法已更新。

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章