Skip to content
advanced

使用 Dataimpulse 轮换住宅代理和 Playwright 进行高级网页抓取

了解如何将 Dataimpulse 的轮换住宅代理与 Playwright 集成,构建可应对动态内容和反机器人措施的稳健、大规模网页抓取流程。

Linux HTTP(S) 网页抓取

概述

Dataimpulse 提供经济高效的住宅和移动代理,支持 HTTP 和 SOCKS5,非常适合大规模网页抓取。与强大的浏览器自动化库 Playwright 结合使用时,你可以在轮换 IP 以避免封锁的同时抓取动态的、JavaScript 密集型网站。本教程介绍使用 Python 的 asyncio 进行并发抓取,将 Dataimpulse 代理与 Playwright 集成的高级技巧。

前提条件

  • 一个拥有住宅或移动代理(按量付费)的 Dataimpulse 账户。你需要代理主机、端口、用户名和密码。
  • Python 3.8 或更高版本。
  • 已安装 Playwright:pip install playwright 和 playwright install。
  • 具备 Python async/await 基础知识。

步骤

1. 设置你的 Dataimpulse 代理凭据

登录你的 Dataimpulse 仪表板并记下你的代理端点。Dataimpulse 同时支持 HTTP 和 SOCKS5 协议。本教程中我们将使用 HTTP,但如有需要,你可以将协议方案替换为 socks5。

将你的凭据存储在环境变量中,以避免硬编码:

export DI_PROXY_HOST="your-proxy-host.dataimpulse.com"
export DI_PROXY_PORT="12345"
export DI_PROXY_USER="your-username"
export DI_PROXY_PASS="your-password"

将值替换为你实际的 Dataimpulse 凭据。

2. 安装所需的 Python 包

创建一个新的 Python 文件,例如 scraper.py,并安装必要的包:

pip install playwright aiohttp

3. 使用 Dataimpulse 代理启动 Playwright

Playwright 的 proxy 选项允许你指定代理服务器、用户名和密码。以下是如何使用你的 Dataimpulse 代理启动 Chromium:

import os
from playwright.async_api import async_playwright

async def scrape_with_proxy():
    async with async_playwright() as p:
        proxy_settings = {
            "server": f"http://{os.getenv('DI_PROXY_HOST')}:{os.getenv('DI_PROXY_PORT')}",
            "username": os.getenv('DI_PROXY_USER'),
            "password": os.getenv('DI_PROXY_PASS')
        }
        browser = await p.chromium.launch(proxy=proxy_settings, headless=True)
        page = await browser.new_page()
        await page.goto("https://httpbin.org/ip")
        content = await page.content()
        print(content)
        await browser.close()

# Run
import asyncio
asyncio.run(scrape_with_proxy())

运行脚本以验证你的 IP 是代理的 IP。

4. 实现 IP 轮换

Dataimpulse 住宅代理会在每次请求时自动轮换 IP,或者你可以使用粘性会话。要在每次请求时轮换,只需为你抓取的每个 URL 创建一个新的浏览器上下文或页面。为了获得更好的性能,请复用浏览器实例,但为每个请求创建一个新上下文:

async def scrape_urls(urls):
    async with async_playwright() as p:
        proxy_settings = {
            "server": f"http://{os.getenv('DI_PROXY_HOST')}:{os.getenv('DI_PROXY_PORT')}",
            "username": os.getenv('DI_PROXY_USER'),
            "password": os.getenv('DI_PROXY_PASS')
        }
        browser = await p.chromium.launch(proxy=proxy_settings, headless=True)
        
        for url in urls:
            context = await browser.new_context()
            page = await context.new_page()
            try:
                await page.goto(url, timeout=30000)
                # Extract data...
                print(f"Scraped {url} with new IP")
            except Exception as e:
                print(f"Error scraping {url}: {e}")
            finally:
                await context.close()
        
        await browser.close()

5. 使用粘性会话处理多步骤流程

如果你需要在多个请求之间保持相同的 IP(例如,先登录,再导航),Dataimpulse 可能通过在用户名中加入会话标识符来支持粘性会话。请查看 Dataimpulse 文档以了解确切格式。通常,你会将会话 ID 附加到用户名后,例如 username-session-abc123。以下是一个示例:

session_id = "abc123"
proxy_settings = {
    "server": f"http://{os.getenv('DI_PROXY_HOST')}:{os.getenv('DI_PROXY_PORT')}",
    "username": f"{os.getenv('DI_PROXY_USER')}-session-{session_id}",
    "password": os.getenv('DI_PROXY_PASS')
}

6. 处理并发和错误处理

对于大规模抓取,使用 asyncio 并发运行多个抓取器。注意 Dataimpulse 的速率限制和目标网站的容忍度。使用信号量来限制并发数:

import asyncio
from asyncio import Semaphore

async def worker(url, browser, semaphore):
    async with semaphore:
        context = await browser.new_context()
        page = await context.new_page()
        try:
            await page.goto(url, timeout=30000)
            # Extract data...
            return await page.title()
        except Exception as e:
            print(f"Error: {e}")
            return None
        finally:
            await context.close()

async def main(urls):
    semaphore = Semaphore(10)  # limit to 10 concurrent pages
    async with async_playwright() as p:
        proxy_settings = {...}  # as before
        browser = await p.chromium.launch(proxy=proxy_settings, headless=True)
        tasks = [worker(url, browser, semaphore) for url in urls]
        results = await asyncio.gather(*tasks)
        await browser.close()
        return results

urls = ["https://example.com/page1", "https://example.com/page2"]
titles = asyncio.run(main(urls))
print(titles)

故障排除

  • 代理认证失败:仔细检查你的用户名/密码。确保你使用的是来自 Dataimpulse 的正确主机和端口。
  • 超时或响应缓慢:增加 page.goto() 中的超时时间。考虑使用不同的代理位置或降低并发。
  • IP 被封锁:即使是住宅 IP 也可能被封锁。实施延迟、轮换用户代理,并妥善处理 CAPTCHA。
  • Playwright 在 Linux 上崩溃:使用 playwright install-deps 安装缺失的依赖项。

总结

你已经学会了如何将 Dataimpulse 轮换住宅代理与 Playwright 集成,以进行高级网页抓取。通过利用 Playwright 的浏览器自动化和 Dataimpulse 的大型 IP 池,你可以大规模抓取动态网站,同时最大限度地减少封锁。请记住遵守目标网站的服务条款和 robots.txt。