1 在電腦上登錄微信
2 打開fiddler抓包軟件,然后打開電腦版微信,找到需要爬取的公眾號,
3 點擊公眾號,再點擊查看歷史信息
4進入歷史信息界面如下
5 向下滑動右側的滾動條,同時觀察fiddler上的抓包信息,這里為了便於分析 ,可以添加過濾規則 在Fiddler的filter添加過濾規則 mp.weixin.qq.com/mp/profile_ext?action=getmsg
有新的抓包信息出現后即可停止,仔細分析抓包軟件中顯示的信息新的抓包信息的請求就是拖動滾動條,后台向微信服務器發起的請求,該請求可以返回公眾號發布過的歷史文章信息。
6 分析HTTP請求參數
多滑動幾次滾動條,分析每次請求的參數,發現以上參數中只有offset和is_ok參數會變化,這兩個參數是如何構造的呢,分析這類請求返回的json數據
在返回的json數據中,next_offset對應的就是下一次請求對應的offset參數,can_msg_continue對應的就是下一次請求對應的is_ok參數,通過觀察,當返回
json數據can_msg_continue=0的時候就代表歷史信息翻頁已經翻到底了。
繼續分析json數據, 可以看到general_msg_list鍵對應的value里包含了文章列表的基本信息,比如文章標題和url,向url發起請求便可以拿到文章內容。
公眾號文章的接口地址 /mp/profile_ext?
action=getmsg&__biz=MjM5ODIzNDEx&f=json&offset=25&count=10&is_ok=1&scene=124&uin=MTU0MTQzNj&key=f57423 ,參數比較多,
其中有用的
參數 __biz 是用戶和公眾號之間的唯一id,
uin是用戶的id,這個是不變的,
key 是請求的秘鑰,一段時間就會失效,
offset 是偏移量,
count 是每次請求的條數,
返回值可以看到返回數據包括文章標題titile、摘要digest、文章地址content_url、閱讀原文地址source_url、封面cover、作者author 等
抓取所以文章的列表
### 完整代碼 # 導入相關數據包 import json import time import requests wx_url = r"https://mp.weixin.qq.com/mp/profile_ext" headers = { "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63040026)" } url_list = {} def parse_weixin(biz,index,key): # 構建 url 請求參數 __biz uin key pass_ticket appmsg_token offset = (index+1)*10 params = { "action":"getmsg", "__biz":biz, "f":"json", "offset":str(offset), "count":"10", "is_ok":"1", "scene":"124", "uin":"NjU1NjAzMTE0", "key":key, "pass_ticket":"C+a973uxAppkGDNicNtAauknNabSPPvNqh1E5Ubt3m7i0v4lZc31uEPMHRvCGsbw", "wxtoken":"", "appmsg_token":"1137_om8ZctvGWpEzIAHDlbJeqf7keaVh23m2uCAxFg~~", "x5":"0" , "f":"json", } res_data = requests.get(wx_url,headers=headers,params=params) #print(res_data.text) data = json.loads(res_data.text) #print(data) mgs_data = json.loads(data['general_msg_list']) #print(mgs_data) for msg in mgs_data.get('list',[]): url,title = msg['app_msg_ext_info']['content_url'], msg['app_msg_ext_info']['title'] print(title,url) url_list[title] = url print("-----------------------------") next_offset = data['next_offset'] can_msg_continue = data['can_msg_continue'] # 判斷是否還可以繼續翻頁 if can_msg_continue: time.sleep(1) index += 1 parse_weixin(biz,index,key) else: print("爬取完畢") # 函數調用 biz = "MzU1Njg3NDU4Nw==" index = 0 key = "19106811931cc753a308bd3b9fd94318b93b0a19fb15e5ee010ce7bc50a22caaf250a090f27f83ec985123caa043e84506b0356dc0e6601e9d4b0cb6df45814bbfaf5bf64d04b80e3fcee195546ea1036df46463f4d57c555fa0abfc211bbaa60827e5159304214c24ab2a5ca8b92a620b1e8ecfdc608e6df9ac904cc52d2130" res_data = parse_weixin(biz,index,key)
抓取某一文章內容
import requests from lxml import etree url = "http://mp.weixin.qq.com/s?__biz=MzU1Njg3NDU4Nw==&mid=2247499340&idx=1&sn=7c479056b2064e9435ed935d0345a733&chksm=fc3cd078cb4b596e464301c39657ddc3136b684ace60c483a7946257f0a85e2379fd51150cd9&scene=27#wechat_redirect" headers = { "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63040026)" } response_content = requests.get(url,headers=headers) response_content.encoding = "utf-8" datas = response_content.text data_xpath = etree.HTML(datas) results = data_xpath.xpath('//*[@id="js_content"]/section/section/section/section/section[2]/section/section/p/span/text()') for result in results: print(result)