如何给Playwright添加代理
随着网站实施防止机器人程序的措施,网络抓取工具经常被标记和阻止。这就是代理发挥关键作用的地方。它们充当您和目标网站之间的中介,并显着降低您被阻止的机会。
在本教程中,您将学习如何实现 Playwright 代理。Playwright 是一种流行的无头浏览器,只需几行代码即可实现浏览器自动化。虽然它支持多种语言,但我们将使用 Python。
准备好增强您的网络抓取能力了吗?让我们深入了解吧!
如何向 Playwright 添加代理
我们将按照以下步骤向 Playwright 添加代理:
- 选择代理提供商。选择满足您要求的可靠代理提供商。这包括类型、速度、安全性和结果。
- 在 Playwright 中配置代理设置。在 Python 脚本中,启动浏览器并将代理凭据值作为单独的参数发送。
- 使用您的 Playwright 代理抓取目标网站。使用已配置的代理,您的请求似乎源自代理服务器的 IP 地址。导航到目标网站以提取必要的数据。
让我们获取代理并为上述步骤编写一些代码。
先决条件
要按照本教程进行操作,请使用以下命令安装 Playwright Python 库pip
:
pip install playwright
然后使用安装必要的浏览器install
。
playwright install
安装 Chromium、Webkit 和 Firefox 可能需要一些时间。
接下来,您可以快速设置Playwright 网络抓取工具。就是这样:
如何在 Python 中的 Playwright 中使用代理
Playwright 支持两种变体:同步和异步。前者非常适合并发性不成问题的小规模抓取。对于并发性、可扩展性和性能是重要因素的项目,建议使用第二种方法。
就此而言,本教程重点介绍 Playwright 异步 API。因此,我们需要导入async_playwright
和asyncio
模块。
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创建列表。
首先导入必要的依赖项并定义您的代理池。我们将导入Random
Python 模块,因为我们想为每个请求分配一个随机代理服务器。
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 针对受良好保护的亚马逊产品页面采取的行动。
要使用 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 代理可能是绕过网站封锁的宝贵工具。但是,在某些情况下您可能需要更多。
我们探索了多种选择,并了解到免费代理对于现实世界的用例来说并不可靠。这就是为什么轮换住宅代理是更好的方法。