如何给Playwright添加代理

随着网站实施防止机器人程序的措施,网络抓取工具经常被标记和阻止。这就是代理发挥关键作用的地方。它们充当您和目标网站之间的中介,并显着降低您被阻止的机会

在本教程中,您将学习如何实现 Playwright 代理。Playwright 是一种流行的无头浏览器,只需几行代码即可实现浏览器自动化。虽然它支持多种语言,但我们将使用 Python。

准备好增强您的网络抓取能力了吗?让我们深入了解吧!

如何向 Playwright 添加代理

我们将按照以下步骤向 Playwright 添加代理:

  1. 选择代理提供商。选择满足您要求的可靠代理提供商。这包括类型、速度、安全性和结果。
  2. 在 Playwright 中配置代理设置。在 Python 脚本中,启动浏览器并将代理凭据值作为单独的参数发送。
  3. 使用您的 Playwright 代理抓取目标网站。使用已配置的代理,您的请求似乎源自代理服务器的 IP 地址。导航到目标网站以提取必要的数据。

让我们获取代理并为上述步骤编写一些代码。

先决条件

要按照本教程进行操作,请使用以下命令安装 Playwright Python 库pip

pip install playwright

然后使用安装必要的浏览器install

playwright install

接下来,您可以快速设置Playwright 网络抓取工具。就是这样:

如何在 Python 中的 Playwright 中使用代理

Playwright 支持两种变体:同步和异步。前者非常适合并发性不成问题的小规模抓取。对于并发性、可扩展性和性能是重要因素的项目,建议使用第二种方法。

就此而言,本教程重点介绍 Playwright 异步 API。因此,我们需要导入async_playwrightasyncio模块。

from playwright.async_api import async_playwright
import asyncio

之后,定义一个异步函数,您将在其中启动一个新浏览器并将代理值作为单独的参数传递,如下例所示。我们从FreeProxyList获得了免费代理。

from playwright.async_api import async_playwright
import asyncio
async def main():
  async with async_playwright() as playwright:
      browser = await playwright.chromium.launch(
           proxy={
               'server': "181.129.43.3:8080",
               },
       )

接下来,创建一个新的浏览器上下文并在其中打开一个新页面。

context = await browser.new_context()
page = await context.new_page()

最后,导航到您的目标网站,抓取必要的数据,然后关闭浏览器。在此示例中,我们将抓取HTTBin,这是一个 API,其 HTML 内容是请求者的 IP 地址。

await page.goto("https://httpbin.org/ip")
html_content = await page.content()
print(html_content)

await context.close()
await browser.close()

将它们放在一起并调用该函数,我们有以下代码:

from playwright.async_api import async_playwright
import asyncio

async def main():
    async with async_playwright() as playwright:
        browser = await playwright.chromium.launch(
             proxy={
               'server': "181.129.43.3:8080",
               },
        )
        context = await browser.new_context()
        page = await context.new_page()

        await page.goto("https://httpbin.org/ip")
        html_content = await page.content()
        print(html_content)

        await context.close()
        await browser.close()

asyncio.run(main())

这是我们的输出:

##....
{
  "origin": "181.129.43.3"
}

上面的结果是我们的免费代理的IP地址。现在您知道如何设置 Playwright 代理。

playwright代理认证

一些代理提供商,特别是那些提供高级代理的提供商,需要进行身份验证才能访问其服务器。

在方法中添加必要的凭据作为参数browser_type.launch()以验证 Playwright 代理。这是一个例子:

browser = await playwright.chromium.launch(
           proxy={
               'server': "proxy_host:port",
               'username': 'your_username',
       		   'password': 'your_password',

                 },
       )

所以,你的playwright抓取工具现在看起来像这样:

from playwright.async_api import async_playwright
import asyncio

async def main():
    async with async_playwright() as playwright:
        browser = await playwright.chromium.launch(
             proxy={
               'server': 'proxy_host:port',
               'username': 'your_username',
               'password': 'your_password',
              	 },
        )
        context = await browser.new_context()
        page = await context.new_page()

        await page.goto("https://httpbin.org/ip")
        html_content = await page.content()
        print(html_content)

        await context.close()
        await browser.close()


asyncio.run(main())

设置playwright代理的协议:HTTP、HTTPS、SOCKS

Playwright 支持使用 HTTP、HTTPS 和 SOCKS 等协议添加代理。下面总结了使用 Playwright 进行网页抓取的原因和时间。

  • HTTP:当您发出 HTTP 请求时使用它。它们通常用于通过 HTTP 协议与网站交互。
  • HTTPS:发出 HTTPS 请求时使用它。换句话说,对于涉及使用 SSL 或 TLS 加密的网站的网页抓取任务。HTTPS 代理也可与 HTTP 配合使用。
  • SOCKS:当您需要 HTTP 和 HTTPS 支持之外的高级功能时,请使用它。SOCKS 代理通常因其灵活性和处理各种流量(包括非 HTTP 协议)的能力而受到青睐。

总而言之,您的协议选择取决于您的项目需求和代理服务器功能。但是,在设置 Playwright 代理时请考虑目标网站的协议。

使用 Python 在 Playwright 中实现旋转代理

网站可以检测并阻止来自特定地址的请求。但是,您可以通过轮换代理在请求之间动态切换 IP 地址。这样,您的目标网站就会认为请求来自不同的用户。

您需要一个代理池来使用 Python 设置轮换 Playwright 代理。让我们看看如何从FreeProxyList创建列表。

首先导入必要的依赖项并定义您的代理池。我们将导入RandomPython 模块,因为我们想为每个请求分配一个随机代理服务器。

from playwright.async_api import async_playwright
import asyncio
import random

proxy_pool = [
    {"server": "190.61.88.147:8080"},
    {"server": "64.225.4.12:9991"},
    {"server": "213.230.108.208:3128"},
    # Add more proxy servers as needed
]

使用库从代理池中选择服务器Random。然后,将所选代理作为参数传递到方法中browser_type.launch()

async def main():
    proxy = random.choice(proxy_pool)

    async with async_playwright() as playwright:
        browser = await playwright.chromium.launch(proxy=proxy)

最后,添加其余的 Playwright 代码(如我们之前的示例中所示)以完成它。这是我们的完整程序:

from playwright.async_api import async_playwright
import asyncio
import random
 
proxy_pool = [
    {"server": "68.183.185.62:80"},
    {"server": "61.28.233.217:3128"},
    {"server": "213.230.108.208:3128"},
    # Add more proxy servers as needed
]

async def main():
        proxy = random.choice(proxy_pool)

        async with async_playwright() as playwright:
            browser = await playwright.chromium.launch(proxy=proxy)
            context = await browser.new_context()
            page = await context.new_page()

            await page.goto("https://httpbin.org/ip")
            text_content = await page.content()
            print(text_content)

            await context.close()
            await browser.close()

 
asyncio.run(main())

如果您多次手动运行代码,则每次都应使用随机选择的 IP 地址。for但为了自动执行此操作,让我们通过向上述代码添加循环来迭代循环以发出多个请求:

from playwright.async_api import async_playwright
import asyncio
import random
 
proxy_pool = [
    {"server": "68.183.185.62:80"},
    {"server": "61.28.233.217:3128"},
    {"server": "213.230.108.208:3128"},
    # Add more proxy servers as needed
]

async def main():
    for _ in range(5):  # Make 5 requests in this example
        proxy = random.choice(proxy_pool)

        async with async_playwright() as playwright:
            browser = await playwright.chromium.launch(proxy=proxy)
            context = await browser.new_context()
            page = await context.new_page()

            await page.goto("https://httpbin.org/ip")
            text_content = await page.content()
            print(text_content)

            await context.close()
            await browser.close()

 
asyncio.run(main())

这是相应的结果:

{
  "origin": "68.183.185.62"
}
{
  "origin": "61.28.233.217"
}
{
  "origin": "213.230.108.208"
}
{
  "origin": "61.28.233.217"
}
{
  "origin": "68.183.185.62"
}

您已经创建了第一个 Playwright 代理轮换器。

然而,需要注意的是,免费代理并不可靠,仅用于测试目的。对于实际的网页抓取项目,您需要高级代理或可以自动为您提供和轮换代理的网页抓取 API。

接下来让我们探讨这些选项。

网页抓取代理

虽然免费代理很容易获得,但它们很容易被检测到和阻止。为了避免这个问题,您需要高级代理,特别是住宅代理,它们是分配给真实设备的 IP 地址。如果您想查看,我们列出了最佳网络抓取代理服务。

然而,在许多情况下,需要的不仅仅是轮换住宅代理。这就是 ZenRows 的用武之地。它是一种解决方案,使您能够绕过任何反机器人措施来检索您想要的数据。

让我们看看 ZenRows 针对受良好保护的亚马逊产品页面采取的行动。

medium_amazon_page_977e2f8b7b

要使用 ZenRows,请注册以获取免费的 API 密钥。它会出现在屏幕顶部。

之后,使用pip命令安装客户端:

pip install zenrows

然后,在 Python 脚本中导入 ZenRows 客户端并使用 API 密钥创建一个新实例。

from zenrows import ZenRowsClient

client = ZenRowsClient("Your_API_key")

接下来,定义您的目标 URL 并将高级代理参数设置为true。要绕过任何反机器人措施,请设置 JavaScript 渲染和反机器人措施。

最后,提出一个GET要求。

url = "https://www.amazon.com/Bose-QuietComfort-45-Bluetooth-Canceling-Headphones/dp/B098FKXT8L?th=1"
params = {"js_render":"true","antibot":"true","premium_proxy":"true"}

response = client.get(url, params=params)

结合上面的步骤,我们有以下代码:

#import the ZenRows client
from zenrows import ZenRowsClient

#create new ZenRows instance using your API key
client = ZenRowsClient("Your_API_key")

#specify target URL and parameters
url = "https://www.amazon.com/Bose-QuietComfort-45-Bluetooth-Canceling-Headphones/dp/B098FKXT8L?th=1"
params = {"js_render":"true","antibot":"true","premium_proxy":"true"}

#make get request to target URL
response = client.get(url, params=params)

通过打印响应来验证其是否有效:

print(response.text)

这是我们的结果:

//...
<title>Amazon.com: Bose QuietComfort 45 Bluetooth Wireless Noise Cancelling Headphones - Triple Black : Clothing, Shoes & Jewelry</title>
//...
<span class="a-size-base a-text-bold"> This item: </span><span class="a-size-base"> Bose QuietComfort 45 Bluetooth Wireless Noise Cancelling Headphones - Triple Black </span></div></div><div class="a-section a-spacing-none a-spacing-top-micro _p13n-desktop-sims-fbt_fbt-desktop_display-flex__1gorZ"><div class="_p13n-desktop-sims-fbt_fbt-desktop_price-section__1Wo6p"><div class="a-row"><div class="_p13n-desktop-sims-fbt_price_p13n-sc-price-animation-wrapper__3ROfY"><div class="a-row"><span class="a-price" data-a-size="medium_plus" data-a-color="base"><span class="a-offscreen">$279.00</span><span aria-hidden="true"><span class="a-price-symbol">$</span><span class="a-price-whole">279<span class="a-price-decimal">.</span></span><span class="a-price-fraction">00</span></span></span></div></div></div></div></div><div class="a-section a-spacing-none _p13n-desktop-sims-fbt_fbt-desktop_shipping-info-show-box__17yWM"><div><div></div><div><div class="a-row"><span class="a-color-error">Only 2 left in stock - order soon.</span></div></div><span class="a-size-base a-color-secondary">Sold by WORLD WIDE STEREO and ships from Amazon Fulfillment.</span>

结论

设置 Playwright 代理可能是绕过网站封锁的宝贵工具。但是,在某些情况下您可能需要更多。

我们探索了多种选择,并了解到免费代理对于现实世界的用例来说并不可靠。这就是为什么轮换住宅代理是更好的方法。

类似文章