1. 程式人生 > >知乎的爬蟲 (Scrapy 框架)

知乎的爬蟲 (Scrapy 框架)

背景: 前段時間適應了工作環境之後就尋思開始自己搗鼓點東西玩玩, 於是想啊既然網上這麼多爬蟲教程什麼的,那咱也來湊湊熱鬧把,畢竟我也很喜歡搞點Data玩一玩。但是拖延了好久,這不趁著回來辦簽證這功夫趕緊把這個push了!

開發的環境:

Mac OSX, Python 3.5, Scrapy 框架   Tips:  為什麼使用 Python 3.5? Python 2.x 在不久的將來就不被維護了。

使用的工具:

給大家推薦一款mac上編寫python的IDE - Pycharm, 目前我發現它的優點有:1. python intepreter 的版本控制做的很棒,可以隨意切換python 版本,另外對每個版本下都安裝了什麼lib也一目瞭然。2. 對於不同版本的python,可以很簡單的對其進行lib的增加和刪除。減少了安裝需要考慮路徑等不必要的麻煩。3. 支援 自動填充 你打出一個function的開頭它給你結尾這樣。

專案的簡介:

本次專案實現了模擬登入,並在登入之後爬取某個話題下面的所有問題資訊。

專案程式碼:

專案的分析步驟:

什麼是Scrapy?   

Scrapy 是一個爬蟲的框架,它提供了很多方便的元件比如 item - 用一個用來儲存下載下來的資料的類, itempipeline - 用來對下載下來的資料進行操作的類等等。 下圖是一個scrapy框架的整個流程.  1. 當我們開始spider之後,傳送的request會首先經過DownloadMiddleware - 可以選擇性的在這個middleware裡面對request進行操作. 2. 當這個request成功的得到目標網站的迴應之後,目標網站會返回一個response, 我們可以在SpiderMiddleware中對這個response進行操作。 3. 當我們得到response之後在middleware中我們可以有兩步不同操作 3.1 從當前response中使用xpath或者beautifulsoap 得到我們想要的資料 3.2 得到新的url 我們可以將他放倒Scheduler中進行 步驟1的操作。

爬蟲的大概工作原理?

爬蟲簡單來說就是一個使用程式碼模擬http get/post 請求的工具,當對目標網站進行請求後我們會得到response,這個response就會包含我們想到爬取的資料或者想要爬取的資料的url.  (另外,建議大家順便看一下什麼是 robots.txt - 每個網站都會有)

如何分析 get/post 請求?

推薦使用 FireFoxDveloperEdition - 推薦理由 : 好用! 右鍵開啟 inspect element -> Network -> XHR  準備工作完成,現在輸入任何你想要開啟的網址你都能看到在開啟的這一過程中都發生了什麼請求. XHR: XMLHttpRequest. 

專案的結果:

本次專案主要的貢獻是 使用scrapy對知乎進行登入,在登入知乎之後大家可以爬取大家感興趣的內容了,我在模擬登入知乎後爬取的內容是  在人工智慧話題 下所有收錄的問題的資訊。 以下是我分析的結果 - 隨便弄一下。。很簡單不要在意。。 該話題下面一共 510 個問題。 (話題下面收錄的是某個問題的最佳回答,當然這個最佳的回答可以是由不同的人回答的。如果某個問題的最佳回答的次數多就是說明這個問題是大家比較關心的,並且有很多大牛在下面回答。)
問題: 如果AI真的統治了地球,人類如何翻盤?  - 出現了 8 次
問題: 2017 年 11 月百度與小米的全面戰略合作有哪些亮點?可能會產生哪些影響?  - 出現了 6 次
問題: 如何看待阿里巴巴釋出“年薪60w+股票”的待遇招聘語言學專家以及translator?  - 出現了 6 次
問題: 如何看待最近一段時間曠視科技Face++、阿里、小米、京東、科大訊飛和地平線等相繼在南京建立研發中心?  - 出現了 5 次
問題: 如何評價 12 月 2日 阿爾法巴無人駕駛電動公交車深圳首發試執行?  - 出現了 5 次
問題: 如何看待 Boston Dynamics 2017.11.16 新發布的機器人 Atlas 視訊?  - 出現了 5 次
問題: 如何評價 2017 年 Jeff Dean 的關於使用 deep learning 做索引的論文?  - 出現了 4 次
問題: 現在什麼職業最容易被人工智慧取代?  - 出現了 4 次
問題: 從鴉片戰爭到如今,我們中國是怎樣一步步獲得現在的國際地位的?  - 出現了 4 次
問題: 你們家的人工智障掃地機器人出現過哪些讓人啼笑皆非的事情?  - 出現了 4 次
問題: 為什麼 AI 發展到今天,圍棋能下過李世石、柯潔,仍不能完成幫人類洗衣物、做飯這種簡單的事?  - 出現了 4 次
問題: NASA 在 2017 年 12 月 14 日宣佈使用機器學習方法發現兩顆新系外行星,有何重要意義?  - 出現了 3 次
問題: 考慮到未來人工智慧的發展,應該學習C++/C語言還是Python語言?  - 出現了 3 次
問題: 如何看待京東金融JDD大賽今年舉辦的豬臉識別比賽?  - 出現了 3 次
問題: 利用ESP32可以實現哪些有趣的功能?  - 出現了 3 次
問題: 冬天太冷,不想動手來換臺,人工智慧電視哪家的比較好,求推薦!?  - 出現了 3 次
問題: 實驗做不出效果是該放棄還是繼續做下去?  - 出現了 3 次
問題: 你從資料中發現了哪些奇妙的不為人知的知識或者見解?  - 出現了 3 次
問題: 文化水平低可以學人工智慧嗎?  - 出現了 3 次
問題: 全球 TOP 網際網路公司及學術界人工智慧方向薪資、高薪的攬才計劃有哪些?  - 出現了 3 次
問題: 如何看待小米旗下智慧家居品牌米家將於11月28日在京召開首屆小米IoT開發者大會?  - 出現了 3 次
問題: 如何評價 Kaiming He 在 ICCV 2017 上拿下雙 Best 的 paper?  - 出現了 3 次
問題: 如何看待科技部公佈的首批國家新一代人工智慧開放創新平臺?  - 出現了 3 次
問題: 極少量樣本圖片分類(如50類,每類3張圖)的方法?  - 出現了 3 次
問題: 如何看待劉慈欣「未來人類必須改變不勞動者不得食的觀念」的觀點?  - 出現了 3 次
問題: 如何自學人工智慧?  - 出現了 3 次
問題: 卷積神經網路工作原理直觀的解釋?  - 出現了 3 次

專案的利用:

在爬取知乎的資料之前首先需要進行登入操作,可以將本專案的登入部分給分離出來,作為一個已有的模組在它的基礎上繼續進行開發,能少造輪子就少造一個輪子。 pull 下來程式碼之後,在 Spider Body 中將 user_name 和 password改成自己的賬戶,將 topic_url  改成自己喜歡的 就ok了。

結語:

謝謝。 如有問題歡迎指出。

被大家發現的問題:

1. 執行報錯,[zhihu] INFO: xsrf token for current login: None
報在這一行:zhihuAPI/zhihu/spiders/spider_body.py", line 69, in post_login
callback=self.after_login -  感謝同學 @ Avaleee. 指出。
問題出現的原因:開發的時候使用的是vpn,當對知乎網站進行請求之後得到的response被自動轉碼。但是如果不使用vpn那麼得到的response將會是被加密的資料,加密的方法就是在http 的header中 ,因為是加密的資料所以xsrf就不存在了(或者說被加密了)。就造成了找不到它的錯誤。
"Accept-Encoding": "gzip, deflate, br"
解決辦法:將header中的accept-encoding 去掉 - 程式碼已經更新.