欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python爬蟲框架scrapy代理中間件掌握學(xué)習(xí)教程

 更新時間:2021年11月15日 10:10:16   作者:夢想橡皮擦  
這篇文章主要介紹了python爬蟲框架scrapy代理中間件掌握學(xué)習(xí)教程,為大家說明一下 scrapy 中代理相關(guān)知識點,有需要的朋友可以借鑒參考下,希望能夠有所幫助

代理的使用場景

編寫爬蟲代碼的程序員,永遠(yuǎn)繞不開就是使用代理,在編碼過程中,你會碰到如下情形:

網(wǎng)絡(luò)不好,需要代理;

目標(biāo)站點國內(nèi)訪問不了,需要代理;

網(wǎng)站封殺了你的 IP,需要代理。

使用 HttpProxyMiddleware 中間件

本次的測試站點依舊使用 http://httpbin.org/,通過訪問 http://httpbin.org/ip 可以獲取當(dāng)前請求的 IP 地址。
HttpProxyMiddleware 中間件默認(rèn)是開啟的,可以查看其源碼重點為 process_request() 方法。

python scrapy 代理中間件,爬蟲必掌握的內(nèi)容之一

修改代理的方式非常簡單,只需要在 Requests 請求創(chuàng)建的時候,增加 meta 參數(shù)即可。

import scrapy
class PtSpider(scrapy.Spider):
    name = 'pt'
    allowed_domains = ['httpbin.org']
    start_urls = ['http://httpbin.org/ip']

    def start_requests(self):
        yield scrapy.Request(url=self.start_urls[0], meta={'proxy': 'http://202.5.116.49:8080'})
    def parse(self, response):
        print(response.text)

接下來通過獲取一下 https://www.kuaidaili.com/free/ 網(wǎng)站的代理 IP,并測試其代理是否可用。

import scrapy
class PtSpider(scrapy.Spider):
    name = 'pt'
    allowed_domains = ['httpbin.org', 'kuaidaili.com']
    start_urls = ['https://www.kuaidaili.com/free/']

    def parse(self, response):
        IP = response.xpath('//td[@data-title="IP"]/text()').getall()
        PORT = response.xpath('//td[@data-title="PORT"]/text()').getall()
        url = 'http://httpbin.org/ip'
        for ip, port in zip(IP, PORT):
            proxy = f"http://{ip}:{port}"
            meta = {
                'proxy': proxy,
                'dont_retry': True,
                'download_timeout': 10,
            }
            yield scrapy.Request(url=url, callback=self.check_proxy, meta=meta, dont_filter=True)
    def check_proxy(self, response):
        print(response.text)

接下來將可用的代理 IP 保存到 JSON 文件中。

import scrapy
class PtSpider(scrapy.Spider):
    name = 'pt'
    allowed_domains = ['httpbin.org', 'kuaidaili.com']
    start_urls = ['https://www.kuaidaili.com/free/']
    def parse(self, response):
        IP = response.xpath('//td[@data-title="IP"]/text()').getall()
        PORT = response.xpath('//td[@data-title="PORT"]/text()').getall()
        url = 'http://httpbin.org/ip'
        for ip, port in zip(IP, PORT):
            proxy = f"http://{ip}:{port}"
            meta = {
                'proxy': proxy,
                'dont_retry': True,
                'download_timeout': 10,
                '_proxy': proxy
            }
            yield scrapy.Request(url=url, callback=self.check_proxy, meta=meta, dont_filter=True)
    def check_proxy(self, response):
        proxy_ip = response.json()['origin']
        if proxy_ip is not None:
            yield {
                'proxy': response.meta['_proxy']
            }

同時修改 start_requests 方法,獲取 10 頁代理。

class PtSpider(scrapy.Spider):
    name = 'pt'
    allowed_domains = ['httpbin.org', 'kuaidaili.com']
    url_format = 'https://www.kuaidaili.com/free/inha/{}/'
    def start_requests(self):
        for page in range(1, 11):
            yield scrapy.Request(url=self.url_format.format(page))

實現(xiàn)一個自定義的代理中間件也比較容易,有兩種辦法,第一種繼承 HttpProxyMiddleware,編寫如下代碼:

from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware
from collections import defaultdict
import random
class RandomProxyMiddleware(HttpProxyMiddleware):
    def __init__(self, auth_encoding='latin-1'):
        self.auth_encoding = auth_encoding

        self.proxies = defaultdict(list)
        with open('./proxy.csv') as f:
            proxy_list = f.readlines()
            for proxy in proxy_list:
                scheme = 'http'
                url = proxy.strip()
                self.proxies[scheme].append(self._get_proxy(url, scheme))
    def _set_proxy(self, request, scheme):
        creds, proxy = random.choice(self.proxies[scheme])
        request.meta['proxy'] = proxy
        if creds:
            request.headers['Proxy-Authorization'] = b'Basic ' + creds

代碼核心重寫了 __init__ 構(gòu)造方法,并重寫了 _set_proxy 方法,在其中實現(xiàn)了隨機(jī)代理獲取。
同步修改 settings.py 文件中的代碼。

DOWNLOADER_MIDDLEWARES = {
   'proxy_text.middlewares.RandomProxyMiddleware': 543,
}

創(chuàng)建一個新的代理中間件類

class NRandomProxyMiddleware(object):
    def __init__(self, settings):
        # 從settings中讀取代理配置 PROXIES
        self.proxies = settings.getlist("PROXIES")
    def process_request(self, request, spider):
        request.meta["proxy"] = random.choice(self.proxies)
    @classmethod
    def from_crawler(cls, crawler):
        if not crawler.settings.getbool("HTTPPROXY_ENABLED"):
            raise NotConfigured
        return cls(crawler.settings)

可以看到該類從 settings.py 文件中的 PROXIES 讀取配置,所以修改對應(yīng)配置如下所示:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': None,
    'proxy_text.middlewares.NRandomProxyMiddleware': 543,
}
# 代碼是前文代碼采集的結(jié)果
PROXIES = ['http://140.249.48.241:6969',
           'http://47.96.16.149:80',
           'http://140.249.48.241:6969',
           'http://47.100.14.22:9006',
           'http://47.100.14.22:9006']

如果你想測試爬蟲,可編寫一個隨機(jī)返回請求代理的函數(shù),將其用到任意爬蟲代碼之上,完成本博客任務(wù)。

以上就是python爬蟲框架scrapy代理中間件掌握學(xué)習(xí)教程的詳細(xì)內(nèi)容,更多關(guān)于scrapy框架代理中間件學(xué)習(xí)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python圖像處理之圖像的讀取、顯示與保存操作【測試可用】

    Python圖像處理之圖像的讀取、顯示與保存操作【測試可用】

    這篇文章主要介紹了Python圖像處理之圖像的讀取、顯示與保存操作,結(jié)合實例形式分析了Python使用PIL模塊、scipy和matplotlib模塊進(jìn)行圖像讀寫、顯示等相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01
  • Python使用Selenium實現(xiàn)瀏覽器打印預(yù)覽功能

    Python使用Selenium實現(xiàn)瀏覽器打印預(yù)覽功能

    在Web開發(fā)中,打印預(yù)覽是一個常見的功能需求,通過打印預(yù)覽,我們可以預(yù)覽和調(diào)整網(wǎng)頁的打印布局、樣式和內(nèi)容,Python的Selenium庫是一個強(qiáng)大的工具,可以自動化瀏覽器操作,包括打印預(yù)覽,本文將介紹如何使用Python Selenium庫來實現(xiàn)瀏覽器的打印預(yù)覽功能
    2023-11-11
  • python使用標(biāo)準(zhǔn)庫根據(jù)進(jìn)程名如何獲取進(jìn)程的pid詳解

    python使用標(biāo)準(zhǔn)庫根據(jù)進(jìn)程名如何獲取進(jìn)程的pid詳解

    Python有一套很有用的標(biāo)準(zhǔn)庫(standard library)。標(biāo)準(zhǔn)庫會隨著Python解釋器,一起安裝在你的電腦中的,所以下面這篇文章主要給大家介紹了關(guān)于python使用標(biāo)準(zhǔn)庫根據(jù)進(jìn)程名如何獲取進(jìn)程pid的相關(guān)資料,需要的朋友可以參考下。
    2017-10-10
  • spark dataframe 將一列展開,把該列所有值都變成新列的方法

    spark dataframe 將一列展開,把該列所有值都變成新列的方法

    今天小編就為大家分享一篇spark dataframe 將一列展開,把該列所有值都變成新列的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python 數(shù)據(jù)處理更容易的12個輔助函數(shù)總結(jié)

    Python 數(shù)據(jù)處理更容易的12個輔助函數(shù)總結(jié)

    Python的產(chǎn)生似乎就是專門用來處理數(shù)據(jù)的,順理成章的成為大數(shù)據(jù)的主流語言,本文介紹十二個函數(shù)輔助你更容易更便捷的用Python進(jìn)行數(shù)據(jù)處理
    2021-11-11
  • 詳解Python 切片語法

    詳解Python 切片語法

    Python的切片是特別常用的功能,主要用于對列表的元素取值。這篇文章主要介紹了詳解Python 切片語法,需要的朋友可以參考下
    2019-06-06
  • 深入淺析Python 命令行模塊 Click

    深入淺析Python 命令行模塊 Click

    這篇文章主要介紹了Python 命令行模塊 Click的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Python?實現(xiàn)多表和工作簿合并及一表按列拆分

    Python?實現(xiàn)多表和工作簿合并及一表按列拆分

    這篇文章主要介紹了Python?實現(xiàn)多表和工作簿合并及一表按列拆分,文章圍繞主題展開詳細(xì)的資料介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • python 判斷是否為正小數(shù)和正整數(shù)的實例

    python 判斷是否為正小數(shù)和正整數(shù)的實例

    這篇文章主要介紹了python 判斷是否為正小數(shù)和正整數(shù)的實例的相關(guān)資料,這里提供實例,實例注釋說明很清楚,需要的朋友可以參考下
    2017-07-07
  • python圖像填充與裁剪/resize的實現(xiàn)代碼

    python圖像填充與裁剪/resize的實現(xiàn)代碼

    這篇文章主要介紹了python圖像填充與裁剪/resize,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08

最新評論