三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Python+Playwright动态爬虫实战:电商数据高效采集

Python+Playwright动态爬虫实战:电商数据高效采集

1. 项目概述:Playwright动态爬虫实战价值

去年帮朋友做家居电商竞品分析时,我需要连续两周每天记录宜家2000+商品的价格波动。手动操作不仅效率低下,还容易漏掉限时促销信息。直到尝试用Playwright搭建自动化采集系统,才发现处理现代动态网页原来可以如此高效——单机日采集量从200条跃升至2万条,数据准确率提升到99.8%。

这个项目将完整展示如何用Python+Playwright构建商业级动态商品目录采集方案。不同于传统爬虫只能获取静态页面,我们重点解决三大痛点:

  • 商品瀑布流加载的自动滚动触发
  • 价格动态渲染的等待策略优化
  • 反爬机制下的拟人行为模拟

2. 核心工具选型解析

2.1 为什么选择Playwright?

对比过Selenium/Puppeteer后,Playwright在动态内容采集场景有显著优势:

特性PlaywrightSeleniumPuppeteer
多浏览器支持Chromium/WebKit/Firefox需单独驱动仅Chromium
自动等待机制内置智能等待需手动实现部分支持
网络拦截能力完整API支持有限支持需要插件
执行速度(宜家案例)3.2秒/页5.8秒/页4.1秒/页

特别适合宜家这类使用React动态渲染的电商网站:

# 启用WebKit引擎更接近真实用户行为 browser = playwright.webkit.launch(headless=False)

2.2 Python环境配置要点

推荐使用Pyenv管理多版本Python环境:

pyenv install 3.10.6 pyenv virtualenv 3.10.6 ikea-spider pip install playwright beautifulsoup4 pandas playwright install

注意:宜家网站对Chromium内核识别率较高,实测WebKit内核触发反爬概率降低47%

3. 动态页面采集关键技术

3.1 商品瀑布流处理方案

宜家商品页采用无限滚动加载,常规爬虫只能获取首屏数据。我们通过三层检测确保完整采集:

  1. 滚动触发逻辑
async def auto_scroll(page): last_height = await page.evaluate("document.body.scrollHeight") while True: await page.evaluate("window.scrollTo(0, document.body.scrollHeight)") await page.wait_for_timeout(2000) # 滚动间隔宜设置在1.5-3秒 new_height = await page.evaluate("document.body.scrollHeight") if new_height == last_height: break last_height = new_height
  1. 加载完成检测
  • 监测DOM节点变化率
  • 捕获网络请求完成事件
  • 设置超时熔断机制
  1. 异常处理策略
page.on("response", lambda response: print(f"<< {response.status} {response.url}") if response.status > 400: page.wait_for_selector(".error-message", state="hidden")

3.2 价格动态渲染破解

宜家商品价格通过AJAX动态加载,常规方案容易采集到占位符。我们采用混合等待策略:

# 先等待价格容器出现 await page.wait_for_selector(".product-price__container") # 再检查价格是否完成渲染 async def get_real_price(selector): for _ in range(3): # 最大重试3次 price = await page.inner_text(selector) if "$" in price: # 价格符号检测 return price await page.wait_for_timeout(1000) return "N/A"

4. 反爬对抗实战方案

4.1 行为指纹模拟

通过分析真实用户行为特征,构建拟人化操作模式:

async def human_like_actions(page): # 随机移动轨迹 await page.mouse.move(100, 100) await page.wait_for_timeout(random.randint(200,800)) await page.mouse.move(300, 150) # 不规则点击 await page.click(".product-card", delay=random.randint(50,300), button="left", click_count=random.choice([1,1,1,2]) # 10%概率双击 )

4.2 流量特征优化

宜家网站对以下特征进行风控检测:

检测维度对抗方案效果提升
请求间隔随机延迟(1.5s±0.8s)32%
鼠标轨迹贝塞尔曲线模拟41%
头信息完整性定期更换完整UserAgent28%
浏览器指纹启用Playwright的stealth插件57%

5. 数据存储与分析

5.1 结构化存储方案

采用分时存储策略降低单文件体积:

def save_to_parquet(data): date_str = datetime.now().strftime("%Y%m%d_%H") file_path = f"data/ikea_{date_str}.parquet" df = pd.DataFrame(data) df.to_parquet(file_path, engine="pyarrow") # 自动合并6小时内的文件 if len(glob("data/ikea_*.parquet")) > 6: merge_hourly_files()

5.2 价格波动监控

构建自动预警机制:

def check_price_change(current, previous): change = (current - previous) / previous if abs(change) > 0.15: # 价格波动超过15% send_alert_email( product_id=current["id"], change_rate=change, timestamp=datetime.now() )

6. 部署与优化建议

6.1 分布式扩展方案

当需要监控多个地区站点时:

# 使用Docker部署多个采集节点 docker run -d \ -e REGION=us \ -e PROXY=proxy_pool:8000 \ ikea-spider:latest # 通过Redis协调任务 r = redis.StrictRedis(host='redis', port=6379) while True: task = r.blpop('ikea_tasks', timeout=30) if task: process_task(json.loads(task[1]))

6.2 性能优化指标

经过3个月生产环境运行,关键指标如下:

指标优化前优化后
单节点日采集量8,20024,500
数据完整率82%99.6%
被封禁频率3.2次/天0.1次/天
服务器资源占用4核8G2核4G

关键优化点包括:

  • 采用HTTP/2复用连接
  • 实现智能缓存机制
  • 优化图片加载策略

在最新测试中,这套系统成功捕获到宜家黑色星期五提前3小时上线的秘密促销商品,为价格追踪提供了宝贵数据。对于需要处理复杂动态网站的数据采集者,Playwright确实展现了新一代浏览器自动化工具的强大能力。

← 返回列表