python爬虫框架scrapy代理中间件掌握学习教程

Python爬虫框架Scrapy代理中间件掌握学习教程

在进行爬虫开发时,经常需要使用代理来避免IP被封锁或者提高爬取效率。而Scrapy是一个功能强大的Python爬虫框架,也提供了代理中间件这一强大的功能以支持代理。

代理中间件的使用方法

Scrapy提供了一个内置的代理中间件,可以通过在项目设置中设置代理中间件的位置及相应的参数,来让Scrapy使用代理。

以下是在Scrapy项目的settings.py中加入代理中间件的配置方法:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, #禁用默认的代理中间件
    'scrapy_proxy_pool.middlewares.ProxyPoolMiddleware': 610, #启用代理池中间件
    'scrapy_proxy_pool.middlewares.BanDetectionMiddleware': 620, #启用ban检测中间件
}
# scrapy-proxy-pool是一个常用的代理池,可通过pip安装
PROXY_POOL_ENABLED = True

以上配置中,我们禁用了Scrapy默认的代理中间件(内置的HttpProxyMiddleware和RetryMiddleware),启用了第三方的代理池中间件scrapy-proxy-pool,并设置了其在下载器中的顺序。

需要注意的是,要在使用代理之前先安装代理池模块 scrapy-proxy-pool

示例1:使用代理IP池来爬取网站

假设我们要使用代理来爬取一个目标网站,我们可以创建一个新的scrapy项目进行实验。以下是项目的目录结构(省略了一些不必要的文件和目录):

scrapy-proxy-example/
    scrapy.cfg
    proxy_example/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            my_spider.py

首先,我们在settings.py中添加上述代理中间件配置。

然后,我们需要在middlewares.py中编写代理中间件,用来从代理池中获取IP,并添加到请求中:

import requests
from scrapy import signals
from scrapy.exceptions import NotConfigured
from scrapy.http import HtmlResponse
from fake_useragent import UserAgent

class ProxyPoolMiddleware(object):
    proxy_url = 'http://127.0.0.1:5555/random'

    def __init__(self):
        self.proxy = None

    def process_request(self, request, spider):
        if self.proxy and self._check_proxy(self.proxy):
            request.meta['proxy'] = self.proxy
        else:
            self.proxy = requests.get(self.proxy_url).text.strip()
            request.meta['proxy'] = self.proxy

    def process_response(self, request, response, spider):
        return response

    def process_exception(self, request, exception, spider):
        if self.proxy and self._check_proxy(self.proxy):
            request.meta['proxy'] = self.proxy
            return request
        else:
            self.proxy = requests.get(self.proxy_url).text.strip()
            request.meta['proxy'] = self.proxy
            return request

    def _check_proxy(self, proxy):
        try:
            requests.get('https://www.baidu.com/', proxies={'https': 'https://{}'.format(proxy)}, timeout=3)
            return True
        except:
            return False

在这个中间件中,我们定义了一个代理URL(proxy_url),每次发起请求时都会从这个URL获取一个新的代理IP。如果已经有可用的代理IP,则直接使用,否则通过请求获取新的IP,并设置到request.meta['proxy']中。

接下来,我们来创建一个Spider文件(my_spider.py)来爬取目标网站,使用刚刚编写的代理中间件,以下是my_spider.py的代码:

import scrapy
from proxy_example.items import ProxyExampleItem

class MySpider(scrapy.Spider):
    name = 'my_spider'
    allowed_domains = ['target_site.com']
    start_urls = ['https://www.target_site.com/']

    def parse(self, response):
        # 在这里解析网页内容
        pass

在Spider中,我们只关注如何解析目标网站的内容,而不用关心如何获取代理IP。

以上就是使用代理IP池来爬取网站的完整示例,如果需要获取更多代理IP池的使用信息,可以参考文献中提供的相关链接。

示例2:使用隧道代理来爬取网站

使用隧道代理是一种常见的代理方式,它可以让我们通过隧道链接来获取代理IP。以下是如何使用隧道代理来爬取网站的示例:

我们可以使用requests模块来实现一个获取隧道代理的函数:

def get_tunnel_proxy():
    proxy_host = 'https://proxyserver.com'
    proxy_port = 3128
    tunnel_host = 'tunnelserver.com'
    tunnel_port = 8080
    proxy_type = 'http'

    # 构造代理隧道连接
    session = requests.Session()
    session.proxies = {
        'http': 'http://{}:{}/'.format(proxy_host, proxy_port),
        'https': 'http://{}:{}/'.format(proxy_host, proxy_port),
    }
    session.headers.update({'Proxy-Connection': 'Keep-Alive'})
    session.get('http://{}'.format(tunnel_host), timeout=10)

    # 验证隧道代理
    try:
        requests.get('http://httpbin.org/ip', proxies={'http': proxy_type + '://{}:{}'.format(tunnel_host, tunnel_port)}, timeout=2)
        return '{}://{}:{}'.format(proxy_type, tunnel_host, tunnel_port)
    except Exception as e:
        print('Error:', e)
        return None

在这个函数中,我们通过构造了一个代理隧道连接,并利用获取的IP地址在隧道代理服务器中建立连接来验证代理的有效性,最终返回一个构造好的隧道代理IP(示例中使用的是HTTP代理)。

使用上述方法获取代理IP的过程可以在爬虫启动时进行,例如,我们可以在Spider类中加入相应的过程:

class MySpider(scrapy.Spider):
    name = 'my_spider'
    allowed_domains = ['target_site.com']
    start_urls = ['https://www.target_site.com/']

    def start_requests(self):
        self.proxy = get_tunnel_proxy() # 获取隧道代理IP
        yield scrapy.Request(
            self.start_urls[0],
            callback=self.parse,
            meta={
                'proxy': self.proxy,
            }   
        )

    def parse(self, response):
        # 在这里解析网页内容
        pass

在这个Spider中,我们重载了start_requests()函数,通过get_tunnel_proxy()方法获取代理IP,并将其设置到请求的meta中。这样,后续的请求都会通过获取的隧道代理IP来发起连接。

以上就是使用隧道代理来爬取网站的完整示例,更多的代理方式可以参考文献中提供的相关链接。

参考文献

  1. Scrapy官方文档中的代理设置
  2. scrapy-proxy-pool: 一款Scrapy代理池的扩展
  3. Python爬虫使用代理池
  4. 隧道代理介绍

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python爬虫框架scrapy代理中间件掌握学习教程 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 浅析python字符串前加r、f、u、l 的区别

    下面是对于《浅析python字符串前加r、f、u、l 的区别》的完整攻略。包括了它们的含义、使用场景以及示例。 r、f、u、l分别代表什么 在Python中,我们可以在字符串的开头添加字母r、f、u、l等前缀,以控制字符串的解释方式。具体含义如下: r:原始字符串。即字符串中的特殊字符均不转义。比如换行符”\n”在原始字符串中表示为”\n”,而非实际的换行符…

    python 2023年5月20日
    00
  • 十个Python中常用的pip命令总结

    十个Python中常用的pip命令总结 pip 是 Python 的官方软件包安装工具,可以很方便地管理 Python 包和依赖项。以下是十个常用的 pip 命令的总结。 1. 安装软件包 用以下命令安装软件包: pip install package_name 示例:安装名为 requests 的软件包 pip install requests 2. 卸载…

    python 2023年5月14日
    00
  • python调用函数、类和文件操作简单实例总结

    Python是一种高级的编程语言,它有非常丰富和强大的标准库,可以帮助我们快速实现各种功能。在Python中,函数和类是非常重要的组成部分,并且文件操作也是我们常常需要用到的功能之一。下面我们就来详细讲解一下Python调用函数、类和文件操作的简单实例。 Python调用函数 在Python中,使用函数可以帮助我们封装一些重复的代码,从而让代码更加简洁、高效…

    python 2023年6月5日
    00
  • python利用pandas将excel文件转换为txt文件的方法

    下面是详细的实例教程。 1. 安装pandas 在开始使用pandas之前必须先安装该库,可以使用如下命令进行安装: pip install pandas 2. 加载excel文件 使用pandas库的read_excel()函数,可以轻松地将excel文件加载到python程序中。以加载名为“example.xlsx”的文件为例: import panda…

    python 2023年5月13日
    00
  • urllib和BeautifulSoup爬取维基百科的词条简单实例

    下面是“urllib和BeautifulSoup爬取维基百科的词条简单实例”的完整攻略。 1. 准备工作 在开始爬取维基百科的内容之前,我们需要做一些准备工作。 首先需要安装BeautifulSoup和urllib库,可以通过以下命令安装: pip install beautifulsoup4 pip install urllib 接下来,我们需要了解维基百…

    python 2023年6月3日
    00
  • 详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法

    关于 Python 中的切片操作,包括 [-1]、[:-1]、[::-1]、[n::-1],我为您提供以下详解。 切片操作简介 在 Python 中,可以对一个序列(比如列表、字符串、元组等)进行切片操作,以取出其中的一部分,切片的语法如下: sequence[start:end:step] 其中,sequence 表示要进行切片的序列,start 表示切片…

    python 2023年6月6日
    00
  • python3 读取Excel表格中的数据

    下面是Python3读取Excel表格中的数据的详细实例教程。 安装依赖库 在开始之前,我们需要先安装以下依赖库: pandas:用于读取Excel表格 xlrd:用于读取xls格式的Excel文件 打开终端,执行以下命令进行安装: pip install pandas xlrd 读取Excel表格 案例一:读取Excel中的全部数据 首先,我们需要准备一个…

    python 2023年5月13日
    00
  • Python基于tkinter canvas实现图片裁剪功能

    Python基于tkinter canvas实现图片裁剪功能的攻略如下: 1. 准备工作 在使用canvas进行图片裁剪之前,我们需要导入必要的库,包括tkinter、PIL(Python Imaging Library,用于处理图片的库)。在命令行中输入以下代码进行安装: pip install tkinter pip install pillow 之后,…

    python 2023年6月13日
    00
合作推广
合作推广
分享本页
返回顶部