pyspider是一個國人編寫的強大的網絡爬蟲系統並帶有強大的WebUI。採用Python語言編寫,分佈式架構,支持多種數據庫後端,強大的WebUI支持腳本編輯器,任務監視器,項目管理器以及結果查看器。官方文檔地址:http://docs.pyspider.org/en/l...。css
首先確保已有python與pip,如若沒有自行安裝python環境以及pip模塊。
pyspider同時支持linux與windows環境,但做者說了因爲他本身也沒有windows的工做環境因此windows下pyspider沒法保證性能與正常工做(反正我在windows下的pyspider無法兒用),因此推薦使用linux運行。
官方文檔上有一鍵配置環境的指令,這些都是運行pyspider所必要的環境。
apt-get install python python-dev python-distribute python-pip \
libcurl4-openssl-dev libxml2-dev libxslt1-dev python-lxml \
libssl-dev zlib1g-dev
不過對於ubuntu系統,貌似其實只須要libcurl4-openssl-dev和libssl-dev就能夠了。
完成基本環境配置,運行pip install pyspider便可安裝pyspider。html
在命令行中輸入指令pyspider便可,通常默認端口爲5000。以後在瀏覽器中輸入localhost:5000便可看到web UI界面。
選擇右側的「create」按鈕,能夠新建爬蟲腳本並設置初始的URL,完成建立後進入查看
左側能夠顯示抓取的信息。"web"即直接在下方白色區域顯示網頁,"html"即顯示html文件,"follow"表示在執行完全部「第一輪」回調函數後還有多少url待爬取
點擊網址右側的「play」按鈕,便可針對該網址進行爬取,並輸出想要的信息。
這一界面主要用來調試,畢竟你不可能手動把那麼多按鈕全按一遍。調試無問題後,返回到以前的界面,將「TODO」改成「running」,並點擊右側的「run」按鈕,便可開始運行爬蟲。點擊"active task"能夠查看爬蟲的運行狀況,點擊「result」則可查看結果,結果保存的是你在爬蟲腳本中return的信息。更多基礎內容請查看http://docs.pyspider.org/en/l...
可是這個web ui有的時候會有問題(反正我這邊如今就有問題),可能你調試時沒有任何問題,但使用webui運行卻遲遲沒有結果。這時能夠考慮轉用命令行運行,python
pyspider one spiderfile.py
便可開始運行你的爬蟲程序。更多關於命令行的命令,請查看http://docs.pyspider.org/en/l...linux
有時咱們所需的內容是包含在html文件中的,有時則是由AJAX異步加載獲得的,原始的html文件中並無咱們要的數據,而爬下來的html又不會執行js腳本。使用phatomjs是一種方法,但也能夠去查看異步加載的請求網址,轉而設置對該url進行爬取。
查看方法即打開「開發者工具」的「網絡」部分,刷新網頁,便可看到全部的請求信息,找到你須要的數據對應的請求便可。web
爬蟲能夠爬取到網頁信息,但顯然咱們並不須要全部的網頁信息,不然使用urllib2進行http訪問就好了。在回調函數的返回值response中,你能夠調用多個方法將它轉換成不一樣的便於刪選的類再進行操做,這裏咱們使用response.doc將其轉爲pyquery對象。
pyquery對象最簡單也最好用的,就是使用css selector進行篩選。若是你想的數據是標籤是某個class,就加入.classname的selector;有某種id,則加入#idname的selector;屬於某種標籤,則加入tagname的selector;有某種屬性值則加入[attr="xxx"],或者簡單點屬性值開頭是某個字段則加入[attr^="xxx"]。
常規的篩選如response.doc('.class #id tag [attr=]'),這樣寫表示標籤或類並列或後面的嵌套在前面裏,這樣返回的是符合條件的pyquery對象,response.doc('')則能夠直接將整個html文件內容轉爲pyquery並返回。
若符合條件的pyquery有多個條目,可使用pyquery.items()返回每一個條目進行處理,返回的item仍然是pyquery對象,pyquery.text()能夠獲取html標籤內的內容,pyquery.attr.attrname能夠得到對應標籤的屬性值。
pyspider提供了方便的css selector判斷工具,在以前的詳情頁點擊最左側的"enable css selector",在web頁面中選中某一區域,便可顯示該區域含有的css selector中最少重疊的部分(不大懂怎麼形容,就是用顯示的便可選中該元素同時選中最少的其餘元素),同時會顯示根據這個selector選中的其餘元素,加粗部分的css即所需部分。
有的時候,沒法根據CSS來進行甄別該元素是否爲所需元素(有些網頁就是這樣),這時可使用parents、siblings等方法查看其父標籤、兄弟標籤等的內容來進行篩選。更多pyquery的方法請查看http://pythonhosted.org/pyque...。數據庫
大多數網站如今都有反爬蟲機制,因此簡單的爬蟲若是打算爬取大量數據則會被臨時甚至永遠禁止訪問。但所謂道高一尺魔高一丈,有反爬蟲天然也有反反爬蟲。
反爬蟲機制首先是你被髮如今明顯以很是規的頻率訪問,因此最簡單粗暴也最有效的方法就是將爬蟲運行設置的慢一點,頻率第一點。在web ui中設置rate/burst或者在腳本文件開頭使用註釋的方式進行設置。rate表示每秒中進行的請求數,小於1時表示數秒請求1次;burst則是最大併發數。ubuntu
# rate: 1.0 # burst: 3
但有時這樣確實太太太慢了,並且並非全部網站都有很嚴格的反爬蟲機制。不少網站使用的方式是檢查請求的headers或cookie,非瀏覽器在默認狀況下請求的headers是跟瀏覽器不同的,同時也沒有cookie。headers和cookie能夠在Handler類的crawl_config中進行設置,也能夠在執行self.crawl時對對應參數進行設置。windows
crawl_config = { 'headers': { 'key': 'value', }, 'cookie': { 'key': 'value' }, # ...... }
or後端
self.crawl(url, headers={}, cookie={}, callback=xxx_page)
還能夠考慮使用代理,輪換IP進行請求爬取,設置方式與headers和cookie相似,key爲proxy,值爲IP地址的字符串。api
pyspider還有更多更強大的功能,有待有興趣的各位去探尋。