Python爬蟲Scrapy框架IP代理的配置與調(diào)試
在調(diào)試爬蟲的時候,新手都會遇到關(guān)于ip的錯誤,好好的程序突然報錯了,怎么解決,關(guān)于ip訪問的錯誤其實很好解決,但是怎么知道解決好了呢?怎么確定是代理ip的問題呢?由于筆者主修語言是Java,所以有些解釋可能和Python大佬們的解釋不一樣,因為我是從Java 的角度看Python。這樣也便于Java開發(fā)人員閱讀理解。
代理ip的邏輯在哪里
一個scrapy 的項目結(jié)構(gòu)是這樣的
scrapydownloadertest # 項目文件夾 │ items.py # 定義爬取結(jié)果存儲的數(shù)據(jù)結(jié)構(gòu) │ middlewares.py # 中間件(可以理解java的過濾器攔截器) │ pipelines.py # 數(shù)據(jù)管道,對獲取到的數(shù)據(jù)做操作 │ settings.py # 項目的配置文件 │ __init__.py # 初始化邏輯 │ ├─spiders # 放置 Spiders 的文件夾 │ │ httpProxyIp.py # 爬取到結(jié)果后的處理類 │ │ __init__.py # spider初始化邏輯 scrapy.py
從上可以發(fā)現(xiàn),代理ip的設(shè)置肯定是在發(fā)送請求之前就要設(shè)置好,那么唯一符合條件的地方就是?middlewares.py
?,所以關(guān)于代理的相關(guān)邏輯都寫在這個里面。直接在其中添加如下代碼:
# Scrapy 內(nèi)置的 Downloader Middleware 為 Scrapy 供了基礎(chǔ)的功能, # 定義一個類,其中(object)可以不寫,效果一樣 class SimpleProxyMiddleware(object): # 聲明一個數(shù)組 proxyList = ['http://218.75.158.153:3128','http://188.226.141.61:8080'] # Downloader Middleware的核心方法,只有實現(xiàn)了其中一個或多個方法才算自定義了一個Downloader Middleware def process_request(self, request, spider): # 隨機(jī)從其中選擇一個,并去除左右兩邊空格 proxy = random.choice(self.proxyList).strip() # 打印結(jié)果出來觀察 print("this is request ip:" + proxy) # 設(shè)置request的proxy屬性的內(nèi)容為代理ip request.meta['proxy'] = proxy # Downloader Middleware的核心方法,只有實現(xiàn)了其中一個或多個方法才算自定義了一個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) # 設(shè)置新的代理ip內(nèi)容 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
?文件中的這塊區(qū)域
修改如下,也就是取消注釋,加上剛剛寫的Middleware 類的路徑
以上就已經(jīng)配置好了一個簡單的代理ip,此時來到?httpProxyIp.py
?這個文件, 這個文件是我通過命令?scrapy genspider httpProxyIp icanhazip.com
?生成的,創(chuàng)建成功內(nèi)容如下:
# -*- 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 任務(wù)名 name = 'httpProxyIp' # 允許訪問的域名 allowed_domains = ['icanhazip.com'] # 起始爬取的url start_urls = ['http://icanhazip.com/'] # spider 爬蟲解析的方法,關(guān)于內(nèi)容的解析都在這里完成; self表示實例的引用, response爬蟲的結(jié)果 def parse(self, response): print('代理后的ip: ', response.text) # 這個是main函數(shù)也是整個程序入口的慣用寫法 if __name__ == '__main__': execute(['scrapy', 'crawl', 'httpbin'])
此時運行程序?scrapy crawl httpProxyIp
?可以看到結(jié)果輸出
很明顯,這里沒有打印出我們想要的結(jié)果,說明之前?proxyList = ['http://218.75.158.153:3128','http://188.226.141.61:8080']
?沒有用,我們找找有沒有可以用的,這里用免費的,所以找起來費點時間?免費代理ip
這樣就完成了scrapy的代理設(shè)置和驗證調(diào)試。
如何配置動態(tài)的代理ip
這里使用的是收費的代理ip了,你可以使用快代理或者阿布云等云服務(wù)商提供的服務(wù),當(dāng)你注冊并繳費之后,會給你一個訪問url和用戶名密碼,這里直接看代碼吧! 同樣在?middlewares.py
新建一個類
修改?setting.py
?的?DOWNLOADER_MIDDLEWARES
?內(nèi)容
DOWNLOADER_MIDDLEWARES = { # 注釋掉之前的例子改用AbuyunProxyMiddleware # 'scrapydownloadertest.middlewares.SimpleProxyMiddleware': 100, 'scrapydownloadertest.middlewares.AbuyunProxyMiddleware': 100, }
其他地方不動,我們在啟動看看,這里換種啟動方式,因為使用的是PyCharm開發(fā)工具,所以可以直接
http://icanhazip.com/
是一個顯示當(dāng)前訪問者ip的網(wǎng)站,可以很方便的用來驗證scrapy的代理ip 設(shè)置是否成功。
到此這篇關(guān)于Python爬蟲Scrapy框架IP代理的配置與調(diào)試的文章就介紹到這了,更多相關(guān)Scrapy框架IP代理配置調(diào)試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django后端接收嵌套Json數(shù)據(jù)及解析詳解
這篇文章主要介紹了Django后端接收嵌套Json數(shù)據(jù)及解析詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07Python數(shù)據(jù)分析之繪制ppi-cpi剪刀差圖形
這篇文章主要介紹了Python數(shù)據(jù)分析之繪制ppi-cpi剪刀差圖形,ppi-cp剪刀差是通過這個指標(biāo)可以了解當(dāng)前的經(jīng)濟(jì)運行狀況,下文更多詳細(xì)內(nèi)容介紹需要的小伙伴可以參考一下2022-05-05PyTorch中torch.utils.data.DataLoader實例詳解
torch.utils.data.DataLoader主要是對數(shù)據(jù)進(jìn)行batch的劃分,下面這篇文章主要給大家介紹了關(guān)于PyTorch中torch.utils.data.DataLoader的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09matlab調(diào)用python的各種方法舉例子詳解
為了發(fā)揮matlab的繪圖優(yōu)勢+原先python寫好的功能組合方式,下面這篇文章主要給大家介紹了關(guān)于matlab調(diào)用python的各種方法,需要的朋友可以參考下2023-09-09Keras使用ImageNet上預(yù)訓(xùn)練的模型方式
這篇文章主要介紹了Keras使用ImageNet上預(yù)訓(xùn)練的模型方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05python中dict字典的查詢鍵值對 遍歷 排序 創(chuàng)建 訪問 更新 刪除基礎(chǔ)操作方法
字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號({})中,本文講述了python中dict字典的查詢鍵值對 遍歷 排序 創(chuàng)建 訪問 更新 刪除基礎(chǔ)操作方法2018-09-09