本文授權轉載自:小癡印記
不知道你有沒有這樣的經曆。
偶然間,關注了一個自己特别感興趣的公衆号,感覺就像是挖到了一個寶藏。于是,我們就想翻一翻寶藏裡都有什麼。
但是,如果你想看到寶藏最開始的内容,你不得不翻山越嶺,刷到公衆号的曆史起點。這還不算什麼,等你下次想要接着看下一篇時,不得不重蹈覆轍。
那麼,我們有什麼辦法解決一下這個問題呢?
用萬能的python寫個腳本,我們就可以把公衆号曆史所有的文章批量的儲存為本地的PDF,這樣,就可以根據标題和日期來看自己喜歡的文章啦!
核心内容:
1 抓包工具Fiddler的配置及其使用
2 python擷取公衆号全部曆史文章url位址
3 把url轉化為PDF
4 擷取單個文章的方法
1 抓包工具Fiddler的配置及使用
1)工作原理
用戶端和伺服器之間建立一個代理伺服器,監聽本機發出的請求和伺服器傳回的響應結果。
浏覽器與伺服器之間通過建立TCP連接配接以HTTP協定進行通信,浏覽器預設通過自己發送HTTP請求到伺服器。
而Fiddler是c#開發(微軟出品,主要作者Eric Lawrence)的http代理伺服器,fiddler工作于七層中的應用層,能夠捕獲到通過的http(s)請求。
2)下載下傳位址
這是官網:http://www.telerik.com/fiddler
你也可以在公衆号【小癡印記】背景,回複關鍵字“Fiddler抓包”直接擷取。
3)配置https
預設情況下,Fiddler是不會捕獲HTTPS會話的,初次使用時,需要下載下傳安全證書,并配置。
具體步驟:
依次點選“Tools-Options-Https”,進行如下圖的配置,“Actions-Trust root”是下載下傳安全證書的。
4)設定區域網路ip和端口号
Fiddler的運作機制其實就是本機上監聽 8888 端口的 HTTP 代理。
Fiddler 啟動的時候預設 IE 的代理設為了127.0.0.1:8888,而其他浏覽器是需要手動設定的,是以将 Chrome 浏覽器的代理改為127.0.0.1:8888 就可以監聽資料了。
具體操作步驟,見第一篇參考文章:
https://blog.csdn.net/jingjingshizhu/article/details/80566191
注意:運作爬蟲程式時,要關閉Fidder用戶端
2 python源碼分析
1)打開微信用戶端,
點開某一個公衆号的曆史文章界面
以我的公衆号為例,如圖。
2)打開Fiddler,監聽url
通過對比,前後兩個url,可以發現,隻是offset這個參數有所改變。
一些重要的關鍵字段:
__biz : 使用者和公衆号之間的唯一id
uin :使用者的私密id
key :請求的秘鑰,一段時候隻會就會失效
offset :偏移量
圖的右下角,我們可以看到傳回的資料類型,及其格式。
好啦,接下來,我們可以擷取一頁内容看看啦。
看看,reponse_dict的内容。
根據上圖的json字元串,我們要做的是把title、content_url、datetime提取出來。
見下圖。
至此,我們成功的擷取到了标題、時間、内容url等資訊。
隻有在最後一篇文章時,can_msg_continue=0,其餘所有文章都是1。
是以,擷取公衆号曆史文章全部内容,可以加一個死循環,當判斷為最後一篇文章時,直接break,結束循環。
完整代碼:
關注【小癡印記】公衆号,背景回複“公衆号曆史文章”
3 把url轉化為pdf
用到了python第三方庫pdfkit,重點在安裝。
1)安裝pdfkit
pip install pdfkit
2)安裝wkhtmltopdf
1.下載下傳位址:
https://wkhtmltopdf.org/downloads.html,安裝到本地即可。
2.将按照目錄下的bin添加到環境變量的path中;
3)重新開機電腦,重新開機電腦,重新開機電腦。
最終結果:
4 擷取單個文章的其他途徑
1)在網頁上,打開對應的文章,注意,一定要把文章加載到底部(待圖檔顯示完全)
2)我用的谷歌浏覽器,列印-ctrl+p,另存為pdf
結果如下圖:
5 文章小結
本文主要介紹了,使用python擷取你喜歡的公衆号的曆史文章,并儲存到本地PDF檔案。
其中,用到了Fiddler抓包工具,首先獲得所有文章内容的url位址,然後可把url轉為PDF檔案,不過,此方法儲存的檔案,圖檔不能很好的顯示。
是以,如果你隻是想列印一篇文章,那麼,我建議你可在浏覽器端打開指定一篇文章,另存為PDF檔案。
回複關鍵字“Fiddler抓包”,擷取“抓包工具”
回複關鍵字“公衆号曆史文章”,擷取“完整源代碼”
推薦閱讀:(點選下方标題即可跳轉)
暑期實習的那 5 周,我收獲了些什麼?
GitHub 标星 8w!學完這份指南後,你就可以去 Google 面試了!