Python切换代理开发指南

代理是一个中间服务器,它隐藏了您的IP,因此您可以匿名和安全地浏览网页。它有许多非常有趣的实用案例,最常见的是定价情报的网络抓取、SEO监控、市场研究的数据收集等。

如果您想了解更多关于网络抓取的代理以及代理服务器是如何运行的,您可以随意浏览我们最近的博客。

在这本开发者指南中,您将了解到如何:

  1. 使用requests库设置一个代理
  2. 以三种不同的方式切换代理
    1. 使用Request库
    2. 使用Scrapy切换代理中间件
    3. 使用2808Proxy的智能代理管理器

让我们开始吧!

环境准备

Requests:这是一个简单而巧妙的Python HTTP库。您只需简单发送HTTP/1.1请求,无需手动向URL添加查询字符串或对POST数据进行格式编码。若要安装该库,请在终端中请运行如下命令。 

python -m pip install requests

Scrapy:这是用Python编写的最强大、最快速的开源网络爬虫框架之一。它用于提取结构化数据,而这些数据可用于广泛的有用应用,如数据挖掘、信息处理或历史归档。如果你刚接触Scrapy,这个关于Scrapy的教程将是一个很好的开始。Scrapy配有一个中间件,一旦您有了一个可运行的代理列表,就可以轻松地切换代理。若要安装scrapy请运行如下命令。

pip install scrapy

2808Proxy智能代理管理器:这是一个代理管理和防禁令的解决方案,它可以管理代理池和处理禁令,这样你就可以专注于提取高质量的数据。按照本指南创建一个智能代理管理器帐户,您可以获得14天的免费试用期。您可以在任何时候取消该服务,并且在试用期间是完全免费的。

如何为Requests设置代理?

首先,导入Requests库,然后创建一个代理字典,将协议–HTTP和HTTPS映射到代理URL。最后,使用requests.get方法设置响应,使用代理字典向URL提出请求。例如:

import requests
    proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', }
    response = requests.get('http://example.org', proxies=proxies)

为不同URL配置不同代理

即使Schema相同,您也可以为不同URL配置不同代理。当你想为你意图抓取的不同网站使用不同的代理时,它就派上了用场。

import requests
    proxies = { 'http://example.org': 'http://10.10.1.10:3128', 'http://something.test': 'http://10.10.1.10:1080', }
    requests.get('http://something.test/some/url', proxies=proxies)

创建会话

有时候你需要创建一个会话并同时使用代理来请求页面。在这种情况下,你必须首先创建一个新的会话对象,并向其添加代理,然后最终通过会话对象发送请求:

`requests.get`本质上在后台使用了`requests.Session`。

import requests
s = requests.Session() 
s.proxies = {"http": "http://10.10.10.10:8000","https": "http://10.10.10.10:8000", }
r = s.get("http://toscrape.com")

如何切换代理?

在互联网上,你的IP地址就是你的身份。一个人只能使用一个IP向网站提出有限的请求。你可以将网站看成是某种监管机构,网站会怀疑来自同一个IP的重复请求,这就是 “IP速率限制”。网站应用的IP速率限制可能会导致阻断、限流或需要验证码问题。解决这个问题的一种方法是使用切换代理。您可以继续阅读为什么需要切换代理的更多理由。

现在让我们进入“如何使用”的部分。本教程演示了三种切换代理的方法:

  • 使用Request库编写一个切换代理逻辑 
  • 使用Scrapy中间件Scrapy – rotate – proxy在python中切换代理
  • 使用2808Proxy智能代理管理器

注意:您不需要用不同的代理来运行本教程中演示的代码。如果您的产品/服务依赖于网页抓取的数据,免费的代理解决方案可能无法满足您的需求。

让我们逐一讨论这些问题。

使用Requests库切换代理

在下列的代码中,我们首先创建一个代理池字典。然后,随机选择一个代理用于我们的请求。如果代理正常运行,我们可以访问给定的网站。如果有出现连接错误,我们不得不从列表中删除此代理,并使用另一个代理重试相同的URL。

import requests
s = requests.Session() 
s.proxies = {"http": "http://1.2.3.4:8883","https": "http://1.2.3.4:8883", }
r = s.get("http://www.2808proxy.com")

Scrapy切换代理

在你的settings.py

ROTATING_PROXY_LIST = [ 
    'Proxy_IP:port', 
    'Proxy_IP:port',
    # ...
]

像这样添加代理列表。

如果您想对IP进行更多的人为控制,你甚至可以像这样从一个文件中加载它。

开启中间件

DOWNLOADER_MIDDLEWARES = { # ...
  'rotating_proxies.middlewares.RotatingProxyMiddleware': 800,
  'rotating_proxies.middlewares.BanDetectionMiddleware': 800,
  # ...
}

现在你的所有请求将自动在代理服务器之间随机切换。

注意:有时您试图使用的代理只是被暂时封禁。在这种情况下,除了将其从代理池中删除,并使用另一个代理重试之外,没有其他的解决办法。但在其他情况下,如果它没有被封禁,只需要等一段时间,然后再使用相同的代理。

使用2808Proxy智能代理管理器

上面讨论的切换代理的方法对于构建演示和最小化可行产品十分有效。但是,一旦您的爬虫项目开始上规模以后,事情就会变得很难。代理池的基础设施管理是相当具有挑战性的、耗费时间和资源的。你很快就会发现自己需要不断刷新代理来维护代理池的健康,管理拦截、管理Session,管理轮换策略等等。代理基础设施还需要配置成与无头浏览器一起工作的模式,以抓取大量的javascript网站。 您的数据提取项目很快就被转化为代理管理项目,这很常见。

如果您采用2808Proxy智能代理管理器,它就会变成一个天然的隧道代理。这一切都将自动完成,所以您可以专注于提取高质量的数据。让我们看看它与您的Scrapy项目集成有多容易。

在Scrapy项目的设置文件中,启用中间件

DOWNLOADER_MIDDLEWARE={'scrapy_proxy2808_smartproxy.SmartProxyMiddleware': 610}

以上讨论设置的演示代码

import scrapy
class DemoSpider(scrapy.Spider):
    name = "whatever"
    proxy2808 = True
    def start_requests(self): 
        urls = [ 'https://www.2808proxy.com/page/1/', 'https://www.2808proxy.com/page/2/', ]
    for url in urls:
        yield scrapy.Request(url=url, callback=self.parse)
    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = f'quotes-{page}.html'
        with open(filename, 'wb') as f:
            f.write(response.body) self.log(f'Saved file {filename}')

这段代码发送了一个成功的HTTP Python请求

您不需要手动处理代理隧道。一切都将自动处理。 

您可以免费试用2808Proxy隧道代理14天。