在調試爬蟲的時候,新手都會遇到關於ip的錯誤,好好的程序忽然報錯了,怎麼解決,關於ip訪問的錯誤其實很好解決,可是怎麼知道解決好了呢?怎麼肯定是代理ip的問題呢?因爲筆者主修語言是Java,因此有些解釋可能和Python大佬們的解釋不同,由於我是從Java 的角度看Python。這樣也便於Java開發人員閱讀理解。java
一個scrapy 的項目結構是這樣的python
scrapydownloadertest # 項目文件夾 │ items.py # 定義爬取結果存儲的數據結構 │ middlewares.py # 中間件(能夠理解java的過濾器攔截器) │ pipelines.py # 數據管道,對獲取到的數據作操做 │ settings.py # 項目的配置文件 │ __init__.py # 初始化邏輯 │ ├─spiders # 放置 Spiders 的文件夾 │ │ httpProxyIp.py # 爬取到結果後的處理類 │ │ __init__.py # spider初始化邏輯 scrapy.py 複製代碼
從上圖能夠發現,代理ip的設置確定是在發送請求以前就要設置好,那麼惟一符合條件的地方就是 middlewares.py
,因此關於代理的相關邏輯都寫在這個裏面。直接在其中添加以下代碼:nginx
# Scrapy 內置的 Downloader Middleware 爲 Scrapy 供了基礎的功能,
# 定義一個類,其中(object)能夠不寫,效果同樣 class SimpleProxyMiddleware(object): # 聲明一個數組 proxyList = ['http://218.75.158.153:3128','http://188.226.141.61:8080'] # Downloader Middleware的核心方法,只有實現了其中一個或多個方法纔算自定義了一個Downloader Middleware def process_request(self, request, spider): # 隨機從其中選擇一個,並去除左右兩邊空格 proxy = random.choice(self.proxyList).strip() # 打印結果出來觀察 print("this is request ip:" + proxy) # 設置request的proxy屬性的內容爲代理ip request.meta['proxy'] = proxy # Downloader Middleware的核心方法,只有實現了其中一個或多個方法纔算自定義了一個Downloader Middleware def process_response(self, request, response, spider): # 請求失敗不等於200 if response.status != 200: # 從新選擇一個代理ip proxy = random.choice(self.proxyList).strip() print("this is response ip:" + proxy) # 設置新的代理ip內容 request.mete['proxy'] = proxy return request return response 複製代碼
每一個 Downloader Middleware 定義了一個或多個方法的類,核心的方法有以下三個:數組
而後找到 setting.py
文件中的這塊區域數據結構
修改以下,也就是取消註釋,加上剛剛寫的Middleware 類的路徑dom
以上就已經配置好了一個簡單的代理ip,此時來到 httpProxyIp.py
這個文件, 這個文件是我經過命令 scrapy genspider httpProxyIp icanhazip.com
生成的,建立成功內容以下:scrapy
# -*- coding: utf-8 -*-
import scrapy class HttpproxyipSpider(scrapy.Spider): name = 'httpProxyIp' allowed_domains = ['icanhazip.com'] start_urls = ['http://icanhazip.com/'] def parse(self, response): pass 複製代碼
咱們修改一下,最終代碼以下所示:ide
# -*- coding: utf-8 -*-
import scrapy from scrapy.cmdline import execute class HttpproxyipSpider(scrapy.Spider): # spider 任務名 name = 'httpProxyIp' # 容許訪問的域名 allowed_domains = ['icanhazip.com'] # 起始爬取的url start_urls = ['http://icanhazip.com/'] # spider 爬蟲解析的方法,關於內容的解析都在這裏完成; self表示實例的引用, response爬蟲的結果 def parse(self, response): print('代理後的ip: ', response.text) # 這個是main函數也是整個程序入口的慣用寫法 if __name__ == '__main__': execute(['scrapy', 'crawl', 'httpbin']) 複製代碼
此時運行程序 scrapy crawl httpProxyIp
能夠看到結果輸出函數
很明顯,這裏沒有打印出咱們想要的結果,說明以前 proxyList = ['http://218.75.158.153:3128','http://188.226.141.61:8080']
沒有用,咱們找找有沒有能夠用的,這裏用免費的,因此找起來費點時間 免費代理ip工具
這樣就完成了scrapy的代理設置和驗證調試。
這裏使用的是收費的代理ip了,你可使用快代理或者阿布雲等雲服務商提供的服務,當你註冊並繳費以後,會給你一個訪問url和用戶名密碼,這裏直接看代碼吧! 一樣在 middlewares.py
新建一個類
修改 setting.py
的 DOWNLOADER_MIDDLEWARES
內容
DOWNLOADER_MIDDLEWARES = {
# 註釋掉以前的例子改用AbuyunProxyMiddleware
# 'scrapydownloadertest.middlewares.SimpleProxyMiddleware': 100, 'scrapydownloadertest.middlewares.AbuyunProxyMiddleware': 100, } 複製代碼
其餘地方不動,咱們在啓動看看,這裏換種啓動方式,由於使用的是PyCharm開發工具,因此能夠直接
http://icanhazip.com/
是一個顯示當前訪問者ip的網站,能夠很方便的用來驗證scrapy的代理ip 設置是否成功。