社區活躍度或者貢獻愈來愈受到重視,每每會做爲得到工做或者承接項目的加分項。爲了方便用戶展現本身的社區資料,雨點兒網中增長了一個社區爬蟲功能。html
當前只爬取了用戶主頁上一些簡單的信息,若是有需求請提到咱們的項目議題中java
效果以下:python
代碼放在了github上,源碼git
如圖所示,在以前的架構上(http://segmentfault.com/a/1190000003808733),我增長了橙色虛線框
內的部分,包括:github
scrapy是一個python爬蟲框架,想要快速實現爬蟲推薦使用這個。chrome
能夠參考以下資料自行學習:json
一個簡單明瞭的入門博客,注意:博客中scrapy的安裝步驟能夠簡化,直接使用 pip install scrapy
,安裝過程當中可能會缺乏幾個lib,ubuntu使用 apt-get install libffi-dev libxml2-dev libxslt1-dev -y
mongo很是適合存儲爬蟲數據,支持異構數據。這意味着你能夠隨時改變爬蟲策略抓取不一樣的數據,而不用擔憂會和之前的數據衝突(使用sql就須要蛋疼的修改表結構了)。
經過scrapy的pipline來集成mongo,很是方便。
安裝mongo
apt-get install mongodb pip install pymongo
在編寫爬蟲的過程當中須要使用xpath表達式來提取頁面數據,在chrome中可使用XPath Helper來定位元素,很是方便。使用方法:
打開XPath Helper插件
鼠標點擊一下頁面,按住shift鍵,把鼠標移動到須要選取的元素上,插件會將該元素標記爲黃色,並給出對應的xpath表達式,以下圖:
在爬蟲程序中使用這個表達式selector.xpath(..../text()").extract()
編寫好爬蟲後,我門能夠經過執行scrapy crawl spidername
命令來運行爬蟲程序,但這還不夠。
一般咱們經過手動或者定時任務(cron)來執行爬蟲,而這裏咱們須要經過web應用來觸發爬蟲。即,當用戶更新綁定的社交帳號時,去執行一次爬蟲。來分析一下:
爬蟲執行過程當中會阻塞當前進程,爲了避免阻塞用戶請求,必須經過異步的方式來運行爬蟲。
可能有多個用戶同時更新資料,這就要求可以同時執行多個爬蟲,而且要保證系統不會超載。
能夠擴展成分佈式的爬蟲。
鑑於項目當前的架構,準備使用celery來執行異步爬蟲。可是碰到了兩個問題:
scrapy框架下,須要在scrapy目錄下執行爬蟲,不然沒法獲取到settings,這個用起來有點彆扭,不過還能解決。
celery中反覆運行scrapy的爬蟲會報錯:raise error.ReactorNotRestartable()
。緣由是scrapy用的twisted調度框架,不能夠在進程中重啓。
stackoverflow上有討論過這個問題,嘗試了一下,搞不定,放棄這個方案。若是你有解決這個問題的方法,期待分享:)
scrapy文檔中提到了可使用scrapyd來部署,scrapyd是一個用於運行scrapy爬蟲的webservice,使用者可以經過http請求來運行爬蟲。
你只須要使用scrapyd-client將爬蟲發佈到scrapyd中,而後經過以下命令就能夠運行爬蟲程序。
$ curl http://localhost:6800/schedule.json -d project=myproject -d spider=spider2 {"status": "ok", "jobid": "26d1b1a6d6f111e0be5c001e648c57f8"}
這意味什麼:
爬蟲應用和本身的web應用徹底解耦,只有一個http接口。
因爲使用http接口,爬蟲能夠放在任何可以被訪問的主機上運行。一個簡易的分佈式爬蟲,不是嗎?
scrapyd使用sqlite隊列來保存爬蟲任務,實現異步執行。
scrapyd能夠同時執行多個爬蟲,最大進程數可配,防止系統過載。
歡迎使用咱們的爬蟲功能來收集社交資料。
成爲雨點兒網用戶,進入用戶主頁,點擊編輯按鈕
填寫社交帳號,點擊更新按鈕
爬蟲會在幾秒內完成工做,刷新我的主頁就能看到你的社區資料了,你也能夠把我的主頁連接附在電子簡歷中喲:)