首先做好准備工作,創建一個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的錯誤(在可為此請求提供服務之前,您必須驗證此代理服務器。請登錄到代理服務器,然后重試)。正確的做法是將驗證消息加到header的Proxy-Authorization中:
紅色的部分填用戶名和密碼,這樣就解決了,這里也看到了請求的header信息也是在這里添加的~
使用DOWNLOAD中間件
在middlewares.py中增加一個類,取名:ProxyMiddleware即代理中間件:
這里的初始化方法可以忽略,是我業務上的需求,主要是看這里的process_request方法,加了一個代理,然后在settings中配置這個中間件:
這里的數字是中間件的一個唯一編號,可以隨意指定,只要不重復就行。然后同樣在控制台中啟動爬蟲,沒有問題~,同樣的,對於Basic認證的代理ip同樣可以在這里設置,header通過process_request的request方法取到。