Python爬蟲Scrapy框架IP代理的配置與調試
在調試爬蟲的時候,新手都會遇到關於ip的錯誤,好好的程序突然報錯瞭,怎麼解決,關於ip訪問的錯誤其實很好解決,但是怎麼知道解決好瞭呢?怎麼確定是代理ip的問題呢?由於筆者主修語言是Java,所以有些解釋可能和Python大佬們的解釋不一樣,因為我是從Java 的角度看Python。這樣也便於Java開發人員閱讀理解。
代理ip的邏輯在哪裡
一個scrapy 的項目結構是這樣的
scrapydownloadertest # 項目文件夾 │ items.py # 定義爬取結果存儲的數據結構 │ middlewares.py # 中間件(可以理解java的過濾器攔截器) │ pipelines.py # 數據管道,對獲取到的數據做操作 │ settings.py # 項目的配置文件 │ __init__.py # 初始化邏輯 │ ├─spiders # 放置 Spiders 的文件夾 │ │ httpProxyIp.py # 爬取到結果後的處理類 │ │ __init__.py # spider初始化邏輯 scrapy.py
從上可以發現,代理ip的設置肯定是在發送請求之前就要設置好,那麼唯一符合條件的地方就是 middlewares.py
,所以關於代理的相關邏輯都寫在這個裡面。直接在其中添加如下代碼:
# 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 定義瞭一個或多個方法的類,核心的方法有如下三個:
- process_request(request, spider)
- process_response(request,response, spider)
- process_exception(request, exception, spider)
然後找到 setting.py
文件中的這塊區域
修改如下,也就是取消註釋,加上剛剛寫的Middleware 類的路徑
以上就已經配置好瞭一個簡單的代理ip,此時來到 httpProxyIp.py
這個文件, 這個文件是我通過命令 scrapy genspider httpProxyIp icanhazip.com
生成的,創建成功內容如下:
# -*- 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
我們修改一下,最終代碼如下所示:
# -*- 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
這裡使用的是收費的代理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 設置是否成功。
到此這篇關於Python爬蟲Scrapy框架IP代理的配置與調試的文章就介紹到這瞭,更多相關Scrapy框架IP代理配置調試內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python Scrapy爬蟲框架使用示例淺析
- 一文讀懂python Scrapy爬蟲框架
- scrapy-splash簡單使用詳解
- Scrapy 之中間件(Middleware)的具體使用
- 爬蟲進階-JS自動渲染之Scrapy_splash組件的使用