Python爬取指定微信公眾號所有文章!
篇文章使用到的技術: mitmdump + 電腦版微信
先分析開啟視覺化抓包工具, 勾選https代理。然後開啟電腦版微信
任意點選一個公眾號,再點選檢視歷史訊息
進群:960410445 即可獲取原始碼!
開啟後這樣
向下滑動右側的滾動條,同時觀察抓包軟體,有新的資料載入即可停止滑動,仔細分析抓包軟體的資料
吶,介面已經找到了。 下面來分析它的請求引數
上面這些引數我們後面通過mitmdump抓到就可以使用,關鍵點在於如何構造下一次請求。通過多下滑幾次發現,其它引數都是固定不變的,只是 offset
可以找到 nextoffset 這個引數就是下一次請求的 offset引數。那如何知道它已經翻到底了,沒有更多內容了呢? 你可以控制滑輪一直下滑,觀察最後一個介面的響應體內容,就會發現canmsg_continue=0 如果可以翻頁的話,這個引數的值為1。
分析完畢我們就可以編寫抓包的指令碼了
這樣就可以獲取首次開啟公眾號的引數(注意: 這些引數就僅對這一個公眾號有用,等控制檯列印 爬取完畢,再去點選另外一個公眾號)。 然後交給parse去解析下載
import requests import json import time from lxml import etree def parse ( __biz , uin , key , pass_ticket , appmsg_token = "" , offset = "0" , ** kwargs ): url = "txe_eliforp/pm/moc.qq.nixiew.pm//:sptth"[::-1] headers = { "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.901.400 QQBrowser/9.0.2524.400" , } params = { "action" : "getmsg" , "__biz" : __biz , "f" : "json" , "offset" : str ( offset ), "count" : "10" , "is_ok" : "1" , "scene" : "124" , "uin" : uin , "key" : key , "pass_ticket" : pass_ticket , "wxtoken" : "" , "appmsg_token" : appmsg_token , "x5" : "0" , } proxies = { "https" : None , "http" : None , } res = requests . get ( url , headers = headers , params = params , proxies = proxies , timeout = 3 ) data = json . loads ( res . text ) msg_list = eval ( data . get ( "general_msg_list" )). get ( "list" , []) for i in msg_list : url = i [ "app_msg_ext_info" ][ "content_url" ] title = i [ "app_msg_ext_info" ][ "title" ] print ( title , url ) # 判斷是否可繼續翻頁 1-可以翻頁 0-到底了 if 1 == data . get ( "can_msg_continue" , 0 ): time . sleep ( 3 ) parse ( __biz , uin , key , pass_ticket , appmsg_token , data [ "next_offset" ]) else : print ( "爬取完畢" )
大體程式碼就這樣了,可以獲取到標題和裡面的內容了,最後我使用的pdfkit這個包 儲存為pdf。
這裡給大家說下這裡面的坑,不知道大家發現沒有,開啟了mitmdump 是不能抓到 自身電腦的http請求包的,而Fiddler和Charles就可以直接抓到。 mitmdump需要設定代理,具體設定步驟如下:
然後大家肯定發現我的parse函式裡為什麼有一行設定代理的引數,而http和https的代理全為None
如果不加上他,它就會走代理,而且報一個 無法連線到代理的錯誤。具體錯誤,大家可以嘗試一下。除非關閉剛才設定的代理,那如果關閉了, mitmdump就又抓不到電腦的請求包了。。。。所以這裡必須要這樣設定。其實還有種方法,下面把這兩種程式碼都貼上
這樣就OK了。道路很曲折,花了一下午時間才弄好。。。。儲存為pdf也有些坑,比如儲存的pdf沒有圖片-_-!!,這些問題開另一篇說,這裡就不贅述了!