大家好,今天小編又和大家見面了,我是團隊中的python高級研發工程師,日常工作是開發python代碼;偶爾還要來平臺寫寫文章;最近老闆又給我安排一個活:幫助粉絲解決各種技術問題。
是的,朋友們如果在做項目或者寫代碼的過程中遇到了問題,歡迎私信小編,小編每天都會抽出一定的時間來幫忙解決粉絲朋友們的問題。此外,朋友們還可以私信來索取精美簡歷模板哦。
問題描述
今天這位朋友的問題是,他在window7下面,使用python3.7和scrapy框架抓取百度圖片。由於使用了框架,所以程序很快就開發好了,但是啟動爬蟲之後,發現連第一頁數據都抓取不到,爬蟲就退出了。
由於scrapy框架列印了近百行的錯誤輸出,所以很難定位問題。這位朋友反覆檢查了幾次代碼,又在chrome瀏覽器裡面重新抓包,都找不出來問題的原因所在。
甚至他還用php代碼模擬了scrapy中類似的抓取功能,發現抓取百度圖片的功能代碼運行起來非常的正常。從直覺出發,看來問題還是出在scrapy框架裡面。
問題定位
小編向這位朋友索要了代碼,然後在自己的開發機裡面嘗試運行了一下,也是同樣的結果,抓第一頁數據的時候,爬蟲就出錯退出了。
通過仔細觀察日誌,小編在近百行的出錯日誌裡面很敏捷地就發現了幾個關鍵詞: Forbidden by robots.txt,翻譯成中文,就是「robots.txt禁止爬蟲抓取」。
問題原理
小編又仔細地觀察了一下爬蟲的debug日誌,發現一個規律:爬蟲在請求我們設定的url之前,它會先向伺服器根目錄請求一個txt文件,也就是robots.txt。
robots.txt文件是一個文本文件,使用任何一個常見的文本編輯器,比如Windows系統自帶的記事本,就可以創建和編輯它,它是搜尋引擎訪問網站的時候要查看的第一個文件,它會告訴蜘蛛程序在伺服器上什麼文件是可以被查看的、什麼文件是不允許被查看(抓取)的。
當一個搜索蜘蛛訪問一個站點時,它會首先檢查該站點根目錄下是否存在robots.txt,如果存在,搜索機器人就會按照該文件中的內容來確定訪問的範圍;如果該文件不存在,所有的搜索蜘蛛將能夠訪問網站上所有沒有被口令保護的頁面。
Robots協議用來告知搜尋引擎哪些頁面能被抓取,哪些頁面不能被抓取;可以用來屏蔽一些網站中比較大的文件,如:圖片,音樂,視頻等,節省伺服器帶寬;或者屏蔽站點的一些死連結。也可以方便搜尋引擎抓取網站內容;設置網站地圖連接,方便引導蜘蛛爬取頁面。
因為默認scrapy遵守robots.txt中的協議,所以會先請求這個文件查看自己的權限,而我們現在訪問這個robots.txt得到:
User-agent: * Disallow: /
意思是不允許任何的爬蟲抓取任何的頁面,於是scrapy框架就停止了後續的url請求和頁面解析。
這也就解釋了為何用php寫的代碼抓取起來就非常的正常,因為php並沒有去預先請求robots.txt。
問題解決
知道了問題的原理,解決起來就很順手了:只要讓scrapy框架不去請求robots.txt就可以了。
翻了翻scrapy的官方文檔,很容易就找到了解決辦法:
settings.py中把ROBOTSTXT_OBEY從True改成False就可以了。 撒花。
總結與收穫
遇到問題一定要仔細看日誌!多看多想。另外,如果有時間,多翻翻官方文檔也是很不錯的。