Scrapy架構之如何給你的請求添加代理,scrapy架構
首先做好準備工作,建立一個Scrapy項目,目錄結構如下:
註:spiders目錄下多了3個檔案,db.py,default.init和items.json。db.py是我簡單封裝的一個資料庫訪問的lib檔案,default.init是我的資料庫和代理相關的設定檔,items.json是最後的輸出檔案。
給請求添加代理有2種方式,第一種是重寫你的爬蟲類的start_request方法,第二種是添加download中介軟體。下面會分別介紹這2種方式。
重寫start_request方法
我在我的爬蟲類中重寫了start_requests方法:
比較簡單,只是在meta中加了一個proxy代理。然後可以測試了,那麼問題來了,我怎麼知道我的請求是否帶上了代理呢?可以在測試的時候去爬 "http://ip.filefab.com/index.php" 這個網站,它會顯示你當前訪問ip地址。一切準備就緒了,我在我的intellij控制台中輸入命令: cd /spider和scrapy crawl dmoz,然後控制台列印:
需要注意的一點是,在使用那種Basic認證的代理ip時,scrapy不同於python的requests包,這裡不能直接把使用者名稱和密碼與代理ip放在一起。假設我這裡使用一個基於Basic認證的代理ip,比如:http://username:passwd@180.125.196.155,把上述代碼簡單的改成:meta={'proxy': 'http://username:passwd@180.125.196.155'} 是不正確的:
它會給你報一個407的錯誤(在可為此請求提供服務之前,您必須驗證此Proxy 伺服器。請登入到Proxy 伺服器,然後重試)。正確的做法是將驗證訊息加到header的Proxy-Authorization中:
紅色的部分填使用者名稱和密碼,這樣就解決了,這裡也看到了請求的header資訊也是在這裡添加的~
使用DOWNLOAD中介軟體
在middlewares.py中增加一個類,取名:ProxyMiddleware即代理中介軟體:
這裡的初始化方法可以忽略,是我業務上的需求,主要是看這裡的process_request方法,加了一個代理,然後在settings中配置這個中介軟體:
這裡的數字是中介軟體的一個唯一編號,可以隨意指定,只要不重複就行。然後同樣在控制台中啟動爬蟲,沒有問題~,同樣的,對於Basic認證的代理ip同樣可以在這裡設定,header通過process_request的request方法取到。