使用Python+pyppeteer爬虫时如何处理隐私授权弹窗?
解决JustWatch隐私授权弹窗关闭问题
你之前的尝试存在几个关键问题:误用了Playwright的locator语法(Pyppeteer不支持该写法)、选择器未精准匹配目标元素,还在异步函数里用了同步的time.sleep,这些都会导致弹窗处理失效。下面是修正后的可行方案:
核心修正要点
- 替换错误API:改用Pyppeteer原生的
waitForSelector+click组合定位按钮 - 异步等待替代同步sleep:避免阻塞异步事件循环,保证页面元素加载完成
- 精准匹配选择器:根据弹窗结构,用更可靠的属性选择器定位"Accept All"按钮
完整修改代码
import asyncio from pyppeteer import launch from datetime import datetime, timedelta import pandas as pd async def filter_by_url(url): browser = await launch( { "headless": False, 'args':['--start-maximized'], # 'executablePath':'/usr/bin/google-chrome' } ) page = await browser.newPage() await page.setViewport({'width': 1920, 'height': 1080}) await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3') await page.goto(url) # 处理隐私弹窗:容错式等待并点击 try: # 等待按钮加载,超时10秒 await page.waitForSelector('button[data-testid="uc-accept-all-button"]', {'timeout': 10000}) await page.click('button[data-testid="uc-accept-all-button"]') print("隐私弹窗已关闭") await asyncio.sleep(1) except Exception as e: print("未检测到隐私弹窗或加载超时:", e) # 滚动到底部逻辑 while True: await page.evaluate("window.scrollBy(0, document.body.scrollHeight);") await asyncio.sleep(2) end_point = await page.querySelector(".timeline__end-of-timeline") if end_point: print("已滚动至页面底部") break await browser.close() # 运行爬虫 urls = [ 'https://www.justwatch.com/ca/provider/netflix?sort_by=trending_7_day' ] for url in urls: asyncio.get_event_loop().run_until_complete(filter_by_url(url))
额外提示
- 如果上述选择器仍不生效,可打开浏览器开发者工具,右键"Accept All"按钮选择「复制选择器」,替换代码中的选择器内容
- 用
try-except包裹弹窗逻辑,避免因弹窗未出现导致爬虫直接终止
内容的提问来源于stack exchange,提问作者Smit Patel
相关产品推荐
相关产品推荐

