如何使用代理服务器处理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 代码粘贴到您的脚本中。
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
已准备就绪!
结论
这个循序渐进的教程涵盖了有关requests
Python 代理的最重要的课程。您从基本设置开始,已成为代理大师!
现在你知道了:
- 什么是 Web 代理以及为什么免费代理不可靠。
- 在 Python 中使用代理的基础知识
requests
。 - 如何实现旋转代理。
- 如何使用高级代理。
代理可帮助您绕过反机器人系统。然而,有些代理比其他代理更可靠,有了代理您就可以通过简单的 API 调用访问可靠的轮换代理系统。