Scrapy框架之如何給你的請求添加代理

最近在學(xué)習(xí)Scrapy爬蟲框架,試著添加代理ip,做了一丟丟總結(jié),歡迎指正。

? ? ? 首先做好準(zhǔn)備工作,創(chuàng)建一個Scrapy項目,目錄結(jié)構(gòu)如下:

? ? ? ?注:spiders目錄下多了3個文件,db.py,default.init和items.json。db.py是我簡單封裝的一個數(shù)據(jù)庫訪問的lib文件,default.init是我的數(shù)據(jù)庫和代理相關(guān)的配置文件,items.json是最后的輸出文件。

? ? ? 給請求添加代理有2種方式,第一種是重寫你的爬蟲類的start_request方法,第二種是添加download中間件。下面會分別介紹這2種方式。

重寫start_request方法

? ? ? 我在我的爬蟲類中重寫了start_requests方法:

? ? ? ?比較簡單,只是在meta中加了一個proxy代理。然后可以測試了,那么問題來了,我怎么知道我的請求是否帶上了代理呢?可以在測試的時候去爬 "http://ip.filefab.com/index.php" 這個網(wǎng)站,它會顯示你當(dāng)前訪問ip地址。一切準(zhǔn)備就緒了,我在我的intellij控制臺中輸入命令: cd /spider和scrapy crawl dmoz,然后控制臺打?。?/p>

? ? ? ?需要注意的一點(diǎn)是,在使用那種Basic認(rèn)證的代理ip時,scrapy不同于python的requests包,這里不能直接把用戶名和密碼與代理ip放在一起。假設(shè)我這里使用一個基于Basic認(rèn)證的代理ip,比如:http://username:passwd@180.125.196.155,把上述代碼簡單的改成:meta={'proxy': 'http://username:passwd@180.125.196.155'} 是不正確的:

? ? ? ?它會給你報一個407的錯誤(在可為此請求提供服務(wù)之前,您必須驗證此代理服務(wù)器。請登錄到代理服務(wù)器,然后重試)。正確的做法是將驗證消息加到header的Proxy-Authorization中:

? ? ? ?紅色的部分填用戶名和密碼,這樣就解決了,這里也看到了請求的header信息也是在這里添加的~

使用DOWNLOAD中間件

? ? ? ?在middlewares.py中增加一個類,取名:ProxyMiddleware即代理中間件:

? ? ? ? 這里的初始化方法可以忽略,是我業(yè)務(wù)上的需求,主要是看這里的process_request方法,加了一個代理,然后在settings中配置這個中間件:

? ? ? ?這里的數(shù)字是中間件的一個唯一編號,可以隨意指定,只要不重復(fù)就行。然后同樣在控制臺中啟動爬蟲,沒有問題~,同樣的,對于Basic認(rèn)證的代理ip同樣可以在這里設(shè)置,header通過process_request的request方法取到。

? ? ? ?ps: 第一次用簡書寫文章,發(fā)現(xiàn)簡書的文章編輯不好用,要是可以直接讓我用Markdown寫就好了~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容