代理处理Python请求

如何使用代理服务器处理Python请求

网页抓取时被阻止?使用带有 Python 的代理服务器requests来隐藏您的 IP 并增加提取所需数据的机会。

准备工作

您需要在计算机上安装Python 3 。如果您了解使用 Python 进行网页抓取的基础知识,学习本教程会更容易,请随时查看我们的指南。

Requests是最流行的 Python HTTP 客户端,是实现代理的最佳库。使用以下命令安装它:

pip install requests

如何对Python请求使用代理

在本节中,您将了解如何使用代理执行基本的 Python 请求、从何处获取代理、如何进行身份验证以及其他一些日常机制。

使用代理执行请求

要使用 Python 代理requests,首先导入 HTTP 客户端库:

import requests

然后,从免费代理列表中获取一些有效的代理 ,并定义一个字典,其中包含与 HTTP 和 HTTPS 协议关联的代理 URL:

proxies = {
   'http': 'http://103.167.135.111:80',
   'https': 'http://116.98.229.237:10003'
}

requests将通过代理执行 HTTP 请求http并通过代理处理 HTTPS 流量https

注意:免费代理是短暂的!上面的那些可能不再适合你。用新的免费代理替换它们。

正如您可以在上面推论的那样,我们使用了以下语法:

<PROXY_PROTOCOL>://<PROXY_IP_ADDRESS>:<PROXY_PORT>

requests现在,通过代理服务器使用 Python 执行 HTTP 请求:

# target website
url = 'https://httpbin.org/ip'

# making an HTTP GET request through a proxy
response = requests.get(url, proxies=proxies)

验证它是否有效:

print(response)

您将收到以下响应:

<Response [200]>

这意味着目标服务器的网站响应了一个HTTP 状态代码。也就是说:HTTP请求成功!🥳200

请注意,requests仅支持 HTTP 和 HTTPS 代理。如果您必须路由 HTTP、HTTPS、FTP 或其他流量,则需要SOCKS代理。该库本身不支持它,但您可以安装扩展socks

pip install requests[socks]

然后,您可以指定一个 SOCKS 代理使用。

import requests

proxies = {
    'http': 'socks5://<PROXY_IP_ADDRESS>:<PROXY_PORT>',
    'https': 'socks5://<PROXY_IP_ADDRESS>:<PROXY_PORT>'
}

url = 'https://httpbin.org/ip'
response = requests.get(url, proxies=proxies)

我们的目标页面HTTPBin以 JSON 格式返回调用者的 IP,因此使用该json()方法检索对请求的响应。

printable_response = response.json()

如果是非 JSON 响应,请使用其他方法:

printable_response = response.text

是时候打印响应了。

print(printable_response)

您的 Pythonrequests代理脚本应如下所示:

import requests

proxies = {
   'http': 'http://103.167.135.111:80',
   'https': 'http://116.98.229.237:10003'
}

url = 'https://httpbin.org/ip'
response = requests.get(url, proxies=proxies)
print(response.json())

运行它,你会得到类似这样的输出:

{'origin': '116.98.229.237'}

origin字段包含代理的 IP,而不是您的。这确认requests通过代理发出了 HTTPS 请求。

请求方法

公开的方法与HTTP 方法requests相匹配。最受欢迎的是:

  • GET:从服务器检索数据。

response = requests.get('https://httpbin.org/ip')

  • POST: 向服务器发送数据。

response = requests.post('https://httpbin.org/anything', data={"key1": "a", "key2": "b"})

看看这个库中剩下的 HTTP 方法:

方法 句法 习惯于
put requests.put(url, data=update_data) 更新服务器上的现有资源
patch requests.patch(url, data=partial_update_data) 部分更新服务器上的资源
delete requests.delete(url) 删除服务器上的资源
head requests.head(url) 检索资源的标头
options requests.options(url) 检索 URL 支持的 HTTP 方法

使用 Python 请求进行代理身份验证:用户名和密码

出于安全原因,一些代理服务器受到身份验证的保护,因此只有拥有一对凭据的用户才能访问它们。这通常发生在高级代理或商业解决方案中。

按照以下语法在经过身份验证的代理的 URL 中指定用户名和密码:

<PROXY_PROTOCOL>://<USERNAME>:<PASSWORD>@<PROXY_IP_ADDRESS>:<PROXY_PORT>

看一个例子:

# ...

proxies = {
  'http': 'http://fgrlkbxt:[email protected]:7492',
  'https': 'https://fgrlkbxt:[email protected]:6286'
}

# ...

错误 407:需要代理身份验证

407: Proxy Authentication Required通过需要身份验证的代理服务器发出请求时,会出现HTTP 状态错误代码。此错误表示用户未提供有效凭据。

要修复它,请确保代理 URL 包含正确的用户名和密码。了解有关支持的几种身份验证类型的更多信息。

使用 Python 请求的代理会话

当通过代理服务器发出许多请求时,您可能需要一个会话。一个Session对象可以为多个请求重用相同的 TCP 连接,与发出单个请求相比,这可以节省时间并提高性能。此外,它还会跟踪 cookie。

在 Python 中使用代理会话requests,如下所示:

import requests

# initializate a session
session = requests.Session()
# set the proxies in the session object
session.proxies = {
   'http': 'http://103.167.135.111:80',
   'https': 'http://116.98.229.237:10003'
}

url = 'https://httpbin.org/ip'

# perform an HTTP GET request over the session
response = session.get(url)

Pythonrequests代理的环境变量

如果您的 Python 脚本对每个请求使用相同的代理,您可以DRY一些代码。默认情况下,requests依赖于这些环境变量定义的 HTTP 代理配置:

  • HTTP_PROXY:对应字典http的键proxies
  • HTTPS_PROXY:对应字典https的键proxies

打开终端,这样设置两个环境变量:

export HTTP_PROXY="http://103.167.135.111:80"
export HTTPS_PROXY="http://116.98.229.237:10003"

然后,从您的脚本中删除代理逻辑,您将得到:

import requests

url = 'https://httpbin.org/ip'
response = requests.get(url)

对 Python 请求使用旋转代理

当您的脚本在短时间内发出许多请求时,服务器可能会认为可疑并禁止您的 IP。但这不会发生在多代理策略中。轮换代理背后的想法是在一段时间后使用一个新的代理,或者每次请求多次以不同的用户身份出现。

让我们看看如何在真实场景中使用请求在 Python 中实现代理旋转器!

使用免费解决方案轮换 IP

和以前一样,您需要检索代理池。如果您不知道从哪里获得它,请查看我们的最佳列表 用于网络抓取的代理提供商

看看这里的 Python 逻辑:

import random
import requests

# some free proxies
HTTP_PROXIES = [
    'http://129.151.91.248:80',
    'http://18.169.189.181:80',
    # ...
    'http://212.76.110.242:80'

]
HTTPS_PROXIES = [
    'http://31.186.239.245:8080',
    'http://5.78.50.231:8888',
    # ...
    'http://52.4.247.252:8129'
]

# a function to perform an HTTP request
# over a rotating proxy system
def rotating_proxy_request(http_method, url, max_attempts=3):
    response = None

    attempts = 1
    while attempts <= max_attempts:
        try:
            # get a random proxy
            http_proxy = random.choice(HTTP_PROXIES)
            https_proxy = random.choice(HTTPS_PROXIES)
            proxies = {
                'http': http_proxy,
                'https': https_proxy
            }

            print(f'Using proxy: {proxies}')

            # perform the request over the proxy
            # waiting up to 5 seconds to connect to the server
            # through the proxy before failing
            response = requests.request(http_method, url, proxies=proxies, timeout=5)

            break
        except Exception as e:
            # log the error
            print(e)
            
            print(f'{attempts} failed!')
            print(f'Trying with a new proxy...')
            
            # new attempt
            attempts += 1

    return response

上面的代码片段用于random.choice()从池中提取随机代理。然后,它通过它执行所需的 HTTP 请求requests.method(),该函数允许您指定要使用的 HTTP 方法。

免费代理很容易失败。因此,rotating_proxy_request()在返回之前最多尝试三次None。另外,免费代理通常很慢,所以你应该设置参数timeout

注意:请记住,这只是轮换 IP 的一种简单方法。查看我们的完整指南,了解有关在 Python 中轮换代理的更多信息。

让我们针对实施反机器人措施的真实目标尝试 IP 旋转器功能:

免费领取1000次ZenRows API网页爬取
response = rotating_proxy_request('get', 'https://www.g2.com/products/zenrows/reviews')
print(response.status_code)

输出:

403

看起来服务器响应了403 Unauthorized错误响应,这意味着目标服务器将您的旋转代理请求检测为机器人。正如一个真实世界的例子所证明的那样,免费代理是不可靠的,所以你应该避免使用它们!

忽略 SSL 证书

默认情况下,requests验证HTTPS 请求的 SSL 证书。而且,在处理代理时,认证验证可能会导致SSLError错误。

为避免这些错误,请禁用 SSL 验证verify=False

# ...
response = requests.request(
    http_method, 
    url, 
    proxies=proxies, 
    timeout=5
    # disable SSL certificate verification
    verify=False
)

注意: verify=False是采用高级代理时推荐的配置。

高级代理以避免被阻止

多年来,高级代理一直是避免被封锁的流行解决方案。然而,它们曾经很昂贵,但随着 代理等解决方案的兴起,这种情况发生了变化。

进入以下 Request Builder 后,勾选Premium Proxy左侧以启用该功能,然后选择Proxy右侧的模式。然后,单击“复制到剪贴板”按钮并将 Python 代码粘贴到您的脚本中。

免费领取1000次ZenRows API网页爬取
import requests

proxy = 'http://<YOUR_ZENROWS_API_KEY>:@proxy.zenrows.com:8001'
proxies = { 
    'http': proxy, 
    'https': proxy
}

url = 'https://httpbin.org/anything'
response = requests.get(url, proxies=proxies, verify=False)
print(response.text)

verify=False请注意,使用高级代理时,这是强制性的。

origin每次运行时,您都会在HTTPBin 生成的 JSON 返回的字段中看到不同的 IP 。恭喜!您的带有 Python 脚本的高级代理requests已准备就绪!

结论

这个循序渐进的教程涵盖了有关requestsPython 代理的最重要的课程。您从基本设置开始,已成为代理大师!

现在你知道了:

  • 什么是 Web 代理以及为什么免费代理不可靠。
  • 在 Python 中使用代理的基础知识requests
  • 如何实现旋转代理。
  • 如何使用高级代理。

代理可帮助您绕过反机器人系统。然而,有些代理比其​​他代理更可靠,有了代理您就可以通过简单的 API 调用访问可靠的轮换代理系统。

类似文章