因?yàn)榕笥褑栁夷懿荒苷乙幌乱粋€(gè)微信公眾號的全部歷史文章的鏈接,我就幫他弄了一下,通過百度和谷歌發(fā)現(xiàn)現(xiàn)在大家爬微信公眾號的思路基本都是下面兩種:
- 通過搜狗搜索微信公眾號然后拿到鏈接
- 通過fiddler檢測手機(jī)微信拿到鏈接。
經(jīng)過考慮沙廉,首先放棄了搜狗蒲稳,因?yàn)槌醪娇戳艘幌滤压返墓娞査训降哪抢镏挥星笆恼碌逆溄印O旅嬲f一下我這次的思路婿屹。
思路
我在嘗試抓取手機(jī)微信上的公眾號的歷史鏈接時(shí),無意中發(fā)現(xiàn)推溃,使用電腦上的微信同樣可以抓取到鏈接昂利。不過這一點(diǎn)倒是沒有太大的影響。因?yàn)槲以嚵艘幌率謾C(jī)和電腦都是可以爬的铁坎,只不過電腦上要更方便一下蜂奸。
首先,打開fiddler硬萍,然后在電腦端微信上找到要爬取的微信公眾號扩所,然后左鍵點(diǎn)一下就會有一個(gè)查看所有歷史信息。點(diǎn)擊查看歷史信息之后我們就會在fiddler上看到一條這樣的GET請求:/mp/getmasssendmsg?__biz=MzA3NDk1NjI0OQ==&uin=MjgxMTU0NDM1&key=cdce7679908e443d6f21adcc7236aea6bfd78ef06cb0f784644d5a3d1a7d1ee97b52997a3fdfca401835b9cc962bfa98e2d8f8806cba94b89ccd72c0883df2baaf712b0818727d149cefb3f920257d27&devicetype=Windows+10&version=6203005d&lang=zh_CN&ascene=7&pass_ticket=PMllYHvaLNk2DRePx1zNYuCv71ocxw7m6lOhOnaFfnnDt35P7ybHP3ESUYFoYaDQ ,在這個(gè)前面加上https://mp.weixin.qq.com后在瀏覽器中打開整個(gè)鏈接就會發(fā)現(xiàn)打開了這個(gè)公眾號的歷史文章了朴乖。
多用fiddler抓幾次這個(gè)鏈接以及換幾個(gè)公眾號后就會發(fā)現(xiàn)碌奉,整個(gè)鏈接里面biz應(yīng)該是微信公眾號的標(biāo)識符,uin應(yīng)該是微信號的標(biāo)識寒砖,key是騰訊的一個(gè)算法赐劣。在整個(gè)鏈接里面,如果是抓同一個(gè)微信公眾號的話哩都,那么只有key是有時(shí)效性的魁兼,其它的都是不變的。超過一定時(shí)間的話漠嵌,再用這個(gè)key打開鏈接就會發(fā)現(xiàn)不能用了咐汞,提示請用微信打開了!這里我本來以為如果用微信自帶的瀏覽器就不會有時(shí)效性問題了儒鹿, 所以最開始我的UA設(shè)置的微信的化撕,然后發(fā)現(xiàn)并沒有什么用...就又換回電腦的了...這里就很坑啊,不能死用一個(gè)key的约炎!不過還好只抓一個(gè)公眾號的話植阴,時(shí)間還是夠的蟹瘾,就是寫程序的時(shí)候就很頭疼了..每次失效了都要重新弄...通過審查這個(gè)鏈接里面的元素,我們不難發(fā)現(xiàn)掠手,已經(jīng)可以看到文章的鏈接了憾朴,但是問題來了,這個(gè)初始鏈接里依然只有10條最近的文章喷鸽。這個(gè)時(shí)候众雷,我們必須往下滑動滾動條才能把剩下的文章全部的顯示出來。所以在寫程序的時(shí)候就需要通過selenium+phahtomJS來鏈接這個(gè)界面并且滑動滾動條做祝,知道滾動條滑到最下面為止了砾省。這樣我們再審查元素就可以看到獲得了全部的文章鏈接。 ** 注意混槐,文章的鏈接分別藏在幾種標(biāo)簽里面编兄,所以要把他們?nèi)空页鰜恚蝗粫z漏的纵隔! **然后把這些鏈接存起來就好了翻诉。
程序
大概說一下我的程序思路:
整個(gè)流程就是通過selenium+phantomJS鏈接上面那個(gè)鏈接炮姨,通過BeautifulSoup提取頁面捌刮,利用JS操作滾動條滾到底直到出現(xiàn)沒有更多消息為止,最后找到所有鏈接后輸出就行了(記得鏈接存在幾種類型的tag里面舒岸,一定要找全)绅作。由于朋友只需要這一個(gè)公眾號的鏈接,而且因?yàn)橥粋€(gè)公眾號的鏈接只有key在變蛾派,所以key就從bash獲取就行了俄认,其它的可以寫在程序里。我是不是太懶了........大概思路就是這樣洪乍,還有很多可以優(yōu)化的地方...
附上代碼(https://github.com/fst034356/crawler/tree/master/wechat)