微信公眾號(hào)文章的爬蟲可以通過多種方式,例如搜狗的接口颗胡,傳送門等網(wǎng)站毫深,但是有個(gè)問題,就是這些網(wǎng)站只能獲取文章的內(nèi)容毒姨,而不能獲取文章相應(yīng)的點(diǎn)贊數(shù)評(píng)論數(shù)哑蔫,以及閱讀量等信息,所以今天教一下大家通過微信客戶端進(jìn)行爬取這些信息。
我們用電腦微信客戶端登陸自己的微信闸迷,可以觀察到微信文章是不能直接在瀏覽器上訪問到詳細(xì)信息的嵌纲,所以我們爬取還是要通過抓包。本文抓取的主要思路是這樣的腥沽,通過抓包分析微信公眾號(hào)向服務(wù)器發(fā)送的各種請(qǐng)求以及各種參數(shù)之間的關(guān)系逮走,然后用python模擬客戶端發(fā)送請(qǐng)求,獲取相應(yīng)的數(shù)據(jù)今阳,下面展開詳細(xì)講解师溅。
首先將手機(jī)和電腦連接在同一個(gè)局域網(wǎng)內(nèi),然后用fiddler設(shè)置代理盾舌,通過手機(jī)訪問公眾號(hào)歷史信息墓臭,獲取請(qǐng)求數(shù)據(jù)。如圖矿筝,隨機(jī)點(diǎn)擊一個(gè)公眾號(hào)的歷史信息
這個(gè)URL比較長(zhǎng)起便,但是我們可以精簡(jiǎn)一下成這樣
https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz={biz}&scene=124&devicetype=iOS10.0.2&version=16050321&lang=zh_CN&nettype=WIFI&a8scene=3&fontScale=131&wx_header=1'.format(biz=self.biz)
其中biz相當(dāng)于公眾的身份證號(hào)棚贾,一個(gè)公眾號(hào)只要一個(gè)窖维,所以我們只要模擬請(qǐng)求該URL就可以了,但是里面有個(gè)key關(guān)鍵參數(shù)妙痹,這個(gè)key值怎么產(chǎn)生的不知道铸史,而且有時(shí)效性,每過20來分鐘就失效了怯伊,但是20多分對(duì)于抓取一個(gè)公眾號(hào)足以琳轿,于是模擬訪問該url,獲得第一次訪問歷史頁面的文章耿芹,一般是10篇崭篡,如圖是模仿請(qǐng)求然后用正則獲取文章url的代碼
輸出如圖
接著的思路是訪問每個(gè)詳細(xì)文章頁,獲得文章標(biāo)題吧秕,摘要琉闪,內(nèi)容,而且分析請(qǐng)求可知砸彬,要獲取文章的點(diǎn)贊閱讀颠毙,以及評(píng)論,必須要根據(jù)文章詳情頁的參數(shù)砂碉。這里先看文章點(diǎn)贊閱讀的請(qǐng)求
該請(qǐng)求是post請(qǐng)求蛀蜜,要獲得需要的數(shù)據(jù)有兩個(gè)關(guān)鍵點(diǎn),第一個(gè)是cookie里面的wip_sid2這個(gè)值增蹭,一定要帶上滴某,該值也是有時(shí)效性的,不過可以夸公眾號(hào)訪問,不像key只那么嚴(yán)格霎奢,另外一個(gè)關(guān)鍵點(diǎn)是該請(qǐng)求需要提交的data偏瓤,如圖
分析過data發(fā)現(xiàn)里面前面的兩個(gè)值都是在文章內(nèi)容頁面提取的,而且其他參數(shù)可以去掉椰憋,然后就可以模擬請(qǐng)求了厅克,如圖代碼
接下來是評(píng)論的抓取,評(píng)論的的返回都是json數(shù)據(jù)橙依,比較好解析证舟,先看請(qǐng)求
評(píng)論的url里面攜帶了多個(gè)參數(shù),有mid窗骑,sn女责,idx,第一個(gè)應(yīng)該是文章的id创译,sn應(yīng)該也是屬于標(biāo)記之類的抵知,idx是表示本文是該作者當(dāng)天第幾篇發(fā)表的文章,一般是1或者2软族,這些都可以再詳情頁獲取刷喜,下面是模擬請(qǐng)求的代碼
里面headers的偽裝于獲取點(diǎn)贊的headers一樣
有了根據(jù)文章url獲取所有數(shù)據(jù)的辦法只好,接下來看看怎么翻頁獲取文章的URL立砸,在手機(jī)中下拉刷新文章的時(shí)候掖疮,觸發(fā)的是該請(qǐng)求
如圖,最關(guān)鍵的還是wap_sid這個(gè)參數(shù)颗祝,攜帶上這個(gè)參數(shù)加上refer跟ua就能訪問下一頁了浊闪,下一頁返回的數(shù)據(jù)是json,直接解析就好了螺戳,headers也是比較簡(jiǎn)單的
first_url就是第一次訪問歷史信息的url
這樣就能翻頁抓取了搁宾,本人在代碼里面翻頁是利用文章的一個(gè)根據(jù)文章有遞減規(guī)律的id,因?yàn)樵诜搖rl里面的count參數(shù)不管用了倔幼,無論怎么訪問還是只返回10個(gè)一次盖腿。
總結(jié):在爬取的時(shí)候還是要手動(dòng)截取公眾號(hào)的key值跟wap_sid值,這兩個(gè)值在首次訪問歷史信息都可以從客戶端產(chǎn)生凤藏,雖然能爬奸忽,但還是不夠自動(dòng)化,感覺應(yīng)該有更好的辦法可以截取這兩個(gè)參數(shù)揖庄,貼一張這兩個(gè)參數(shù)的獲取位置
上兩張結(jié)果圖栗菜,
下面這個(gè)爬取的是python中文社區(qū)的文章
這是萌叔在杭州公眾號(hào):
最后值得得一提的是兩點(diǎn),要想批量化抓取抓取微信公眾號(hào)還是比較難的蹄梢,有兩個(gè)問題疙筹,第一個(gè)就是微信很容易封號(hào)富俄,尤其是那些剛剛注冊(cè)沒有銀行卡的(騰訊說:用微信哪有不付花錢?)而咆,而且微信號(hào)不像微博號(hào)那么好買啊霍比,分分鐘幾塊錢一個(gè),還有一個(gè)就是自動(dòng)化抓取暴备,題主之前想過用按鍵精靈進(jìn)行養(yǎng)號(hào)以及瀏覽要爬取的公眾號(hào)悠瞬,然后抓包軟件自動(dòng)捕獲請(qǐng)求頭寫進(jìn)本地文件,這個(gè)改幾行fiddle的配置文件就好了涯捻,然后爬蟲進(jìn)行監(jiān)聽浅妆,然后獲取相應(yīng)的參數(shù)自行爬取信息,想想現(xiàn)在還是挺難實(shí)現(xiàn)的障癌,那些利用微信爬蟲做成了熱搜榜的凌外,我也好想探究一下整個(gè)流程啊,有什么好的改進(jìn)的建議涛浙,各位小伙伴踴躍提翱导;
第二點(diǎn)是這個(gè)爬蟲當(dāng)時(shí)讓樓主獲得了一個(gè)爬蟲工程師的面試機(jī)會(huì)轿亮,樓主是去年畢業(yè)今年才轉(zhuǎn)行的疮薇,大學(xué)讀的還是文科,雖然最后還是沒進(jìn)去這間公司哀托,好遺憾惦辛。劳秋。仓手。要是有想轉(zhuǎn)行做爬蟲工程師的小伙伴可以考慮一下如何進(jìn)行批量化抓取。