如何结合使用代理和 HTTPX

通过未经身份验证的代理、经过身份验证的代理、轮换代理和后备代理的示例了解 HTTPX 代理设置。
3 min read
如何在 HTTPX 中使用代理

今天,我们将学习如何将代理与 HTTPX 一起使用。代理位于您的抓取工具和您要抓取的网站之间。您的抓取工具向代理服务器发送请求,要求访问目标网站。然后,代理会提取目标网站并将其返回给您的抓取工具。

如何使用未经身份验证的代理

总的来说,我们所有的请求都会发往 proxy_url。下面是使用未经身份验证的代理的示例。未经身份验证说明我们没有使用用户名或密码。此示例的灵感来自相关文档

import httpx

proxy_url = "http://localhost:8030"


with httpx.Client(proxy=proxy_url) as client:
    ip_info = client.get("https://geo.brdtest.com/mygeo.json")
    print(ip_info.text)

如何使用经过身份验证的代理

代理需要用户名和密码时,就称为“经过身份验证的”代理。这些凭据用于验证您的帐户并让您连接到代理。

有身份验证时我们的 proxy_url 如下所示:http://<username>:<password>@<proxy_url>:<port_number>。在下面的示例中,我们同时使用区域用户名来创建用户部分的身份验证字符串。

我们正使用数据中心代理作为基础连接。

import httpx

username = "your-username"
zone = "your-zone-name"
password = "your-password"

proxy_url = f"http://brd-customer-{username}-zone-{zone}:{password}@brd.superproxy.io:33335"

ip_info = httpx.get("https://geo.brdtest.com/mygeo.json", proxy=proxy_url)

print(ip_info.text)

上面的代码非常简单。这是您要设置的任何代理类型的基础。

  • 首先,我们创建配置变量:用户名区域密码
  • 我们使用这些来创建我们的 proxy_urlf"http://brd-customer-{username}-zone-{zone}:{password}@brd.superproxy.io:33335"
  • 我们向 API 发出请求以获取有关代理连接的一般信息。

您的响应应类似于:

{"country":"US","asn":{"asnum":20473,"org_name":"AS-VULTR"},"geo":{"city":"","region":"","region_name":"","postal_code":"","latitude":37.751,"longitude":-97.822,"tz":"America/Chicago"}}

如何使用轮换代理

使用轮换代理时,我们会创建一个代理列表并从中随机选择。在下面的代码中,我们创建了一个国家/地区列表。发出请求时,我们使用 random.choice() 从列表中随机选择一个国家/地区。我们的 proxy_url 已调为适当的格式,以匹配此国家/地区。

以下示例创建了一个轮换代理的小列表。

import httpx
import asyncio
import random


countries = ["us", "gb", "au", "ca"]
username = "your-username"
proxy_url = "brd.superproxy.io:33335"

datacenter_zone = "your-zone"
datacenter_pass = "your-password"


for random_proxy in countries:
    print("----------connection info-------------")
    datacenter_proxy = f"http://brd-customer-{username}-zone-{datacenter_zone}-country-{random.choice(countries)}:{datacenter_pass}@{proxy_url}"

    ip_info = httpx.get("https://geo.brdtest.com/mygeo.json", proxy=datacenter_proxy)

    print(ip_info.text)

这个示例实际上与您的第一个示例并没有太大不同。以下是主要区别。

  • 我们创建一个国家/地区数组:["us", "gb", "au", "ca"]
  • 我们不只发出一个请求,而是发出多个请求。每次创建新请求时,我们都会在创建 proxy_url 时使用 random.choice(countries) 随机选择一个国家/地区。

如何创建后备代理连接

在以上示例中,我们仅使用了数据中心代理和免费代理。免费代理不太可靠。数据中心代理往往会在遇到更难访问的网站时被屏蔽。

在此示例中,我们创建了一个名为 safe_get() 的函数。调用此函数时,我们首先尝试使用数据中心连接获取 url。此方法失败时,我们退回使用住宅连接。

import httpx
from bs4 import BeautifulSoup
import asyncio


country = "us"
username = "your-username"
proxy_url = "brd.superproxy.io:33335"

datacenter_zone = "datacenter_proxy1"
datacenter_pass = "datacenter-password"

residential_zone = "residential_proxy1"
residential_pass = "residential-password"

cert_path = "/home/path/to/brightdata_proxy_ca/New SSL certifcate - MUST BE USED WITH PORT 33335/BrightData SSL certificate (port 33335).crt"


datacenter_proxy = f"http://brd-customer-{username}-zone-{datacenter_zone}-country-{country}:{datacenter_pass}@{proxy_url}"

residential_proxy = f"http://brd-customer-{username}-zone-{residential_zone}-country-{country}:{residential_pass}@{proxy_url}"

async def safe_get(url: str):
    async with httpx.AsyncClient(proxy=datacenter_proxy) as client:
        print("trying with datacenter")
        response = await client.get(url)
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, "html.parser")
            if not soup.select_one("form[action='/errors/validateCaptcha']"):
                print("response successful")
                return response
    print("response failed")
    async with httpx.AsyncClient(proxy=residential_proxy, verify=cert_path) as client:
        print("trying with residential")
        response = await client.get(url)
        print("response successful")
        return response

async def main():
    url = "https://www.amazon.com"
    response = await safe_get(url)
    with open("out.html", "w") as file:
        file.write(response.text)

asyncio.run(main())

此示例比我们在本文中探讨过的其他示例稍微复杂一些。

  • 我们现在有两组配置变量,一组用于数据中心连接,一组用于住宅连接。
  • 这次,我们使用 AsyncClient() 会话来介绍 HTTPX 的一些更高级的功能。
  • 首先,我们尝试使用 datacenter_proxy 发出请求。
  • 如果未能获得适当响应,我们会使用 residential_proxy 重新发送请求。另请注意代码中的 verify 标志。使用我们的住宅代理时,您需要下载并使用我们的 SSL 证书
  • 一旦我们获得可靠的响应,我们会将页面写入 HTML 文件。我们可以在浏览器中打开此页面,查看代理实际访问并发回给我们什么内容。

如果您试着使用了上述代码,您的输出和生成的 HTML 文件应该非常类似于:

trying with datacenter
response failed
trying with residential
response successful
Amazon 主页截图

Bright Data 产品如何提供帮助

您可能已经在本文中注意到,我们的数据中心代理非常实惠,并且我们的住宅代理在数据中心代理无法使用时提供了出色的后备方案。我们还提供各种其他工具来协助您满足数据收集需求。

  • Web Unlocker:绕过最困难的反机器人机制。Web Unlocker 会自动识别并求解页面上的任何验证码。一旦突破反机器人机制,它就会将网页发回给您。
  • Scraping Browser:本产品具有更多功能。Scraping Browser 实际上允许您通过代理集成自动验证码求解器来控制远程浏览器。
  • Web Scraper API:借助这些 API,我们可以代您执行抓取。您需要做的就是调用 API 并解析响应中收到的 JSON 数据。
  • 数据集:探索我们的数据集市场,查找数百个预先收集的数据集,或请求/构建自定义数据集。您可以选择刷新率并仅筛选您需要的数据点。

结语

将 HTTPX 与我们的代理结合使用时,您将获得一种私密、高效且可靠的网络抓取方法。如果您想要轮换代理,就像使用 Python 内置的随机库一样简单。通过结合使用数据中心代理和住宅代理,您可以构建能够绕过大多数屏蔽系统的冗余连接。

正如您所了解的,Bright Data 为您的网络抓取项目提供了全套解决方案。立即