最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python爬蟲框架scrapy代理中間件掌握學習教程

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

代理的使用場景

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

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

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

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

使用 HttpProxyMiddleware 中間件

本次的測試站點依舊使用 http://httpbin.org/,通過訪問 http://httpbin.org/ip 可以獲取當前請求的 IP 地址。
HttpProxyMiddleware 中間件默認是開啟的,可以查看其源碼重點為 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)了隨機代理獲取。
同步修改 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 讀取配置,所以修改對應配置如下所示:

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']

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

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

相關(guān)文章

  • python基礎之while循環(huán)語句的使用

    python基礎之while循環(huán)語句的使用

    這篇文章主要介紹了python基礎之while循環(huán)語句的使用,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-04-04
  • Python2.7環(huán)境Flask框架安裝簡明教程【已測試】

    Python2.7環(huán)境Flask框架安裝簡明教程【已測試】

    這篇文章主要介紹了Python2.7環(huán)境Flask框架安裝方法,結(jié)合實例形式詳細分析了Python2.7環(huán)境下安裝Flask框架遇到的問題與相關(guān)解決方法、注意事項,并給出了一個基本的測試示例,需要的朋友可以參考下
    2018-07-07
  • 在Django框架中偽造捕捉到的URLconf值的方法

    在Django框架中偽造捕捉到的URLconf值的方法

    這篇文章主要介紹了在Django框架中偽造捕捉到的URLconf值的方法,Django是Python各色人氣框架中最為著名的一個,需要的朋友可以參考下
    2015-07-07
  • python從內(nèi)存地址上加載python對象過程詳解

    python從內(nèi)存地址上加載python對象過程詳解

    這篇文章主要介紹了python從內(nèi)存地址上加載pythn對象過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • Python裝飾器用法實例分析

    Python裝飾器用法實例分析

    這篇文章主要介紹了Python裝飾器用法,結(jié)合實例形式分析了帶參數(shù)裝飾器、無參數(shù)裝飾器等相關(guān)實現(xiàn)與使用技巧,需要的朋友可以參考下
    2019-01-01
  • pycharm 關(guān)掉syntax檢查操作

    pycharm 關(guān)掉syntax檢查操作

    這篇文章主要介紹了pycharm 關(guān)掉syntax檢查操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Queue 實現(xiàn)生產(chǎn)者消費者模型(實例講解)

    Queue 實現(xiàn)生產(chǎn)者消費者模型(實例講解)

    下面小編就為大家?guī)硪黄猀ueue 實現(xiàn)生產(chǎn)者消費者模型(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Python基于Tkinter實現(xiàn)的垃圾分類答題軟件代碼

    Python基于Tkinter實現(xiàn)的垃圾分類答題軟件代碼

    這篇文章主要介紹了基于Tkinter實現(xiàn)的垃圾分類答題軟件代碼,圖形用戶界面是一種人與計算機通信的界面顯示格式,允許用戶使用鼠標等輸入設備操縱屏幕上的圖標或菜單選項,需要的朋友可以參考下
    2023-04-04
  • 詳解Python 字符串相似性的幾種度量方法

    詳解Python 字符串相似性的幾種度量方法

    這篇文章主要介紹了詳解Python 字符串相似性的幾種度量方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • python 修改本地網(wǎng)絡配置的方法

    python 修改本地網(wǎng)絡配置的方法

    今天小編就為大家分享一篇python 修改本地網(wǎng)絡配置的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08

最新評論

金山区| 黄平县| 南昌县| 汨罗市| 新乡县| 济宁市| 钟祥市| 焦作市| 黔南| 宜川县| 息烽县| 舟山市| 大同县| 青海省| 阳原县| 天等县| 沙雅县| 贺州市| 安徽省| 镇康县| 赣榆县| 博白县| 灯塔市| 石城县| 宝鸡市| 长宁区| 儋州市| 文昌市| 南部县| 陆良县| 双江| 莱州市| 金阳县| 仲巴县| 焉耆| 咸阳市| 景洪市| 韶山市| 屏山县| 阳西县| 五莲县|