從接觸爬蟲到現在也有一年半了,在這里總結一下一個新人入門爬蟲需要了解的種種。作為實用向入門教程,我不會講太多細枝末節的東西。最重要的就是能爬到東西不是嗎?
那好,作為一個爬蟲新人,要爬一個網站時,應該怎么開始呢?
首先,確定要爬的內容。是要整個網站的所有內容還是只是部分?需要的爬取的數據在網頁源代碼里有嗎(涉及到模擬js發送請求)?需要的爬取的數據在網頁上有嗎(要用API爬嗎)?確定要爬的內容之后,緊接着就需要考慮如下問題。
1.API爬蟲和網頁爬蟲?
嗯,我一般習慣把爬蟲分為API爬蟲和網頁爬蟲。首先簡要介紹一下兩種爬蟲:
API爬蟲:
- 某些網站(一般是比較大的網站)會提供API接口供開發者調用,然后我們這些可惡的“數據小偷”(笑) 就可以通過調用這些API來獲取想要的數據。所謂網站API,通俗來說就是一個url。帶上身份驗證數據和一些參數,訪問這個url,即可獲得想要的數據。通常,網站在提供API的同時也會提供實現好的類庫供我們使用,幫助我們擺脫煩人的http請求操作。
網頁爬蟲:
- 模擬瀏覽器的行為訪問網頁,並從獲得的頁面的源代碼中解析出需要的數據。
那么,我們應該寫哪種爬蟲呢?選用哪種爬蟲取決於你想要爬的東西。
- 如果要爬的是整個網站的話,別無選擇,那就選網頁爬蟲。
- 否則,就是爬部分網頁數據了(比如用戶數據等)。如果要爬的網站提供API調用的話,那肯定首先API爬蟲了,因為調用API或者類庫比手寫網頁爬蟲通常更簡單:)。如果網站不提供API或者要爬的數據API中沒有,那么就只好選網頁爬蟲了。
2.爬下來的數據怎么存,存在哪?
急着去寫爬蟲之前,讓我們先好好考慮數據存放的問題。
首先,是存數據庫還是文件里?一般來說建議存數據庫中,便於之后的更新和查找。如果真的數據量比較小或者之后很少有更新和查找的話,那也可以存在文件中(畢竟代碼寫起來比較簡單)。
如果存在數據庫中,那么選哪種數據庫?這個就跟爬下來的數據相關啦。可以選擇通用的MySql,也可以選擇與網絡數據高度契合的Mongodb。要是爬的是社交網絡的話,還可以選擇圖形數據庫,比如Neo4j,Orientdb,Arangodb等。但是圖形數據庫其較慢的插入速度實在是不適用於實時存儲爬蟲數據,只推薦在之后做數據分析時使用。 關於圖形數據庫的插入速度我在之前的一篇博文中提過,有興趣的可以看看Neo4j安裝&入門&一些優缺點。
3.爬蟲該怎么寫
現在,我們可以坐下來開始爬蟲程序的編寫了。考慮到“實用向”三個字,我將通過兩個例子來展示基本的爬蟲程序怎么寫。
3.1 API爬蟲
3.2 網頁爬蟲
4.如何提高爬取的速度
在寫完能跑的爬蟲后,這是最讓人在意的問題了。
對於API爬蟲的話,只需要申請更多的應用,提高API的可調用次數即可。而對於網頁爬蟲的話,因為涉及到待爬隊列的共享問題,不能只是簡單地多開爬蟲,可能要考慮分布式的爬取方案了,如scrapy-redis。
最后,祝爬蟲愉快:)。