如果你做过中大型爬虫项目,就一定知道浏览器自动化这一环节有多“吃资源”。一台机器跑几个浏览器实例还好,一旦规模上百、上千,就成了内存地狱。Playwright 虽然在单机场景下表现优异,但要把它放到分布式架构中稳定运行,就得动点“脑筋”。
这篇文章会带你一步步搭建一个“分布式浏览器栈”——用 Playwright 跑在容器中,配合代理、调度和会话管理,实现对多新闻网站(如 ZAKER 与 第一财经)的高并发抓取。
随着各大网站反爬手段越来越复杂,传统的 requests + BeautifulSoup 模式已经不够用了。越来越多的数据都藏在前端异步加载的 JavaScript 里,只能靠“浏览器级”工具去渲染和执行。
Playwright 就是为这种任务而生的。但 Playwright 自带的问题也不容忽视:
于是,“容器化分布式浏览器栈”成了救命稻草。通过 Docker 把浏览器实例包装成轻量级容器,我们就能像调度服务一样去调度它们,还能方便地进行资源回收。
在开始之前,你需要准备以下环境:
pip install playwright aiohttp asyncio
playwright install chromium代理域名:proxy.16yun.cn
端口:3100
用户名:your_username
密码:your_password我们会在代码中直接使用它。
创建一个简单的 Dockerfile,让每个容器都能独立运行一个 Playwright 实例。
FROM mcr.microsoft.com/playwright/python:v1.47.2-jammy
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["python", "browser_worker.py"]每个容器就是一个“浏览器节点”,主控端通过调度系统(比如 Celery 或自定义 API)来派发任务。
为了防止频繁登录或重复加载 cookie,我们为每个浏览器实例维护独立的“会话池”。
思路如下:
在这里,我们用 Playwright + 代理连接访问两个新闻网站(ZAKER 和 第一财经),并抓取最新的新闻标题与链接。
import asyncio
from playwright.async_api import async_playwright
# 代理配置(参考亿牛云 加强版)
PROXY_HOST = "proxy.16yun.cn"
PROXY_PORT = "3100"
PROXY_USER = "your_username"
PROXY_PASS = "your_password"
# 要采集的目标网站
TARGETS = [
"http://www.myzaker.com",
"https://www.yicai.com"
]
async def fetch_news(url):
"""抓取新闻标题和链接"""
proxy_str = f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"
async with async_playwright() as p:
browser = await p.chromium.launch(
headless=True,
proxy={"server": proxy_str}
)
context = await browser.new_context()
page = await context.new_page()
await page.goto(url, timeout=60000)
# 这里根据网站结构提取新闻标题与链接
if "myzaker" in url:
articles = await page.query_selector_all("a[href*='/article']")
else:
articles = await page.query_selector_all("a[href*='news']")
for a in articles[:10]:
href = await a.get_attribute("href")
title = await a.inner_text()
print(f"[{url}] {title} -> {href}")
await browser.close()
async def main():
await asyncio.gather(*(fetch_news(u) for u in TARGETS))
if __name__ == "__main__":
asyncio.run(main())这段代码会使用 Playwright 打开两个新闻网站,分别提取部分新闻标题和链接,并通过爬虫代理隐藏真实 IP。
http://user:pass@host:port。timeout 参数;await page.wait_for_selector() 确认元素加载完成。--shm-size=1gb 启动容器;通过这次实践,我们完成了一个可扩展的“分布式浏览器采集框架”:
容器化 Playwright,就像给浏览器加上“齿轮和轮轴”——从单机小工具变成一台稳定、高效的分布式采集机器。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。