介绍
在本文中,您将研究如何在代理服务器后面使用 Python Requests 库。开发人员使用代理来实现匿名性和安全性,有时甚至会使用多个代理来防止网站禁止其 IP 地址。代理还具有其他一些好处,例如绕过过滤器和审查制度。让我们开始吧!
先决条件和安装
本文适用于那些想在 Python 中使用代理进行抓取的人。为了充分利用材料,有利于:
- 有使用 Python 3 的经验。
- 在本地机器上安装 Python 3。
通过打开终端并键入以下内容来检查是否python-requests
安装了 pacakges:
pip freeze
将显示您当前所有的 python 包及其版本,因此请继续检查它是否存在。如果没有,请运行以下命令安装它:
如何在 Python 请求中使用代理
要在 Python 中使用代理,首先导入requests
包.
接下来创建一个proxies
定义 HTTP 和 HTTPS 连接的字典。此变量应该是将协议映射到代理 URL 的字典。此外,url
为您要从中抓取的网页设置一个变量。
请注意在下面的示例中,字典为两个单独的协议定义了代理 URL:HTTP 和 HTTPS。每个连接映射到一个单独的 URL 和端口,但这并不意味着两者不能相同
- 最后,创建一个
response
使用任何请求方法的变量。该方法将接受两个参数:您创建的 URL 变量和定义的字典。
您可以对不同的 api 调用使用相同的语法,但无论您进行何种调用,都需要指定协议。
import requests
proxies = {
'http': 'http://proxy.example.com:8080',
'https': 'http://secureproxy.example.com:8090',
}
url = 'http://mywebsite.com/example'
response = requests.post(url, proxies=proxies)
请求方法
response = requests.get(url)
response = requests.post(url, data={"a": 1, "b": 2})
response = requests.put(url, data=put_body)
response = requests.delete(url)
response = requests.patch(url, data=patch_update)
response = requests.head(url)
response = requests.options(url)
代理身份验证
如果需要添加身份验证,可以使用以下语法重写代码:
response = requests.get(url, auth=('user', 'pass'))
代理会话
您可能还会发现自己想要从使用会话的网站上抓取数据,在这种情况下,您必须创建一个会话对象。您可以通过首先创建一个session
变量并将其设置为请求Session()
方法来执行此操作。然后与之前类似,您将通过 requests 方法发送会话代理,但这次只传入url
作为参数。
import requests
session = requests.Session()
session.proxies = {
'http': 'http://10.10.10.10:8000',
'https': 'http://10.10.10.10:8000',
}
url = 'http://mywebsite.com/example'
response = session.get(url)
环境变量
您可能会发现自己为每个请求重复使用相同的代理,因此请随时通过设置一些环境变量来 DRY 代码:
export HTTP_PROXY='http://10.10.10.10:8000'
export HTTPS_PROXY='http://10.10.10.10:1212'
如果您决定设置环境变量,则不再需要在代码中设置代理。只要你提出请求,就会进行 api 调用!
阅读回应
如果您想阅读您的数据:
response = requests.get(url)
text_resp = response.text
JSON:对于 JSON 格式的响应,请求包提供了一个内置方法。
response = requests.get(url)
json_resp = response.json()
根据请求轮换代理
还记得我们说过一些开发人员使用多个代理吗?好吧,现在你也可以了!
每当您发现自己反复从网页上抓取时,最好使用多个代理,因为您的抓取工具很可能会被阻止,这意味着您的 IP 地址会被禁止。刮取消文化是真实的!因此,为避免被取消,最好使用轮换代理。旋转代理是一种代理服务器,它从代理池中为每个连接分配一个新的 IP 地址。
要轮换 IP 地址,您首先需要有一个可用的 IP 池。您可以使用在 Internet 上找到的免费代理或商业解决方案。在大多数情况下,如果您的服务依赖于抓取的数据,那么免费代理很可能是不够的。
如何根据请求轮换 IP
为了开始轮换您的 IP 地址,您需要一个能够获取代理IP的API接口。今天您将编写一个脚本,通过代理进行选择和轮换。
首先导入requests
、BeautifulSoup
和choice
库。
接下来定义一个方法get_proxy()
,负责检索 IP 地址供您使用。在此方法中,您将定义您url
选择使用的任何代理列表资源。发送请求 api 调用后,将响应转换为 Beautiful Soup 对象以使提取更容易。使用 html5lib 解析器库来解析网站的 HTML,就像浏览器一样。创建一个proxy
变量,用于choice
从 生成的代理列表中随机选择一个 IP 地址soup
。在 map 函数中,您可以使用一个lambda
函数将 HTML 元素转换为检索到的 IP 地址和端口号的文本。
创建一个proxy_request
接受 3 个参数的方法: the request_type
、 theurl
和**kwargs
。在此方法内,将您的代理字典定义为从该get_proxy
方法返回的代理。与之前类似,您将使用requests
, 传递参数。
import requests
ip_addresses = [ "mysuperproxy.com:5000", "mysuperproxy.com:5001", "mysuperproxy.com:5100", "mysuperproxy.com:5010", "mysuperproxy.com:5050", "mysuperproxy.com:8080", "mysuperproxy.com:8001",
"mysuperproxy.com:8000", "mysuperproxy.com:8050" ]
def proxy_request(request_type, url, **kwargs):
while True:
try:
proxy = random.randint(0, len(ip_addresses) - 1)
proxies = {"http": ip_addresses(proxy), "https": ip_addresses(proxy)}
response = requests.get(request_type, url, proxies=proxies, timeout=5, **kwargs)
print(f"Proxy currently being used: {proxy['https']}")
break
except:
print("Error, looking for another proxy")
return response
您现在可以同时刮擦和旋转所有内容!
结论
虽然立即开始使用您喜欢的新代理进行抓取可能很诱人,但您仍然应该了解一些关键事项。对于初学者来说,并不是所有的代理都是一样的。实际上有不同的类型,主要有三种:透明代理、匿名代理和精英代理。
在大多数情况下,您将使用精英代理,无论是付费的还是免费的,因为它们是避免被发现的最佳解决方案。如果仅出于隐私目的使用代理,匿名代理可能值得您花时间。除非有特殊原因,否则不建议使用透明代理,因为透明代理会泄露您的真实 IP 地址,并且您正在使用代理服务器。
现在我们已经全部清理完毕,是时候开始使用Python 中的代理进行抓取了。所以,开始吧,提出所有你能想到的要求!