使用普通浏览器Cookie爬虫遇检测失效,求自动化解决方案
我用Python的pyppeteer写了一个爬取coches.net的脚本,但网站每隔几分钟就会把我识别为机器人。目前唯一能绕过检测的方法是从常规浏览器提取Cookie导入脚本,但这些Cookie几分钟就失效,得手动重新提取导入。有没有办法自动化这个过程或者其他解决方案?
我试过让脚本自动更新Cookie,但只有常规浏览器的Cookie才有效。也考虑过网站检测到我时用Selenium提取Cookie,但就算用非无头模式和undetected-chromedriver,还是会被检测到。
我的代码
import asyncio import random import json import traceback from pyppeteer import launch from pyppeteer_stealth import stealth async def puppeteer_cochesnet_scraper(start_url): print("Starting coches.net scrap...") browser = await launch(headless=True, executablePath='C:/Program Files/chrome-win/chrome.exe') context = await browser.createIncognitoBrowserContext() page = await context.newPage() with open('cookies_cochesnet.json', 'r') as f: cookies = json.load(f) await page.setCookie(*cookies) await page.setUserAgent( 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36') await page.setViewport({'width': 1280, 'height': 800}) await page.setExtraHTTPHeaders({'Accept-Language': 'es-ES'}) await page.evaluateOnNewDocument( 'navigator.geolocation.getCurrentPosition = function(success) {' 'success({coords: {latitude: 41.55049678876526, longitude: 2.447197735379941}});}' ) await stealth(page) try: await page.goto(start_url, {'waitUntil': 'networkidle2'}) await asyncio.sleep(random.uniform(2, 5)) except Exception as ex: print(f"Exception while navigating to URL: \n{ex}\nPassing URL...") print(f"Traceback details:\n{traceback.print_exc()}") finally: cookies = await page.cookies() with open("cookies_cochesnet.json", 'w') as f: json.dump(cookies, f) await browser.close()
解决方案
1. 复用常规浏览器的用户数据目录
直接让pyppeteer挂载你日常使用的Chrome用户数据目录,脚本会自动继承常规浏览器的会话(包括已认证Cookie、缓存和真实指纹),无需手动提取Cookie:
browser = await launch( headless=False, # 先以非无头模式测试,后续可尝试优化参数后切换无头 executablePath='C:/Program Files/chrome-win/chrome.exe', userDataDir='C:/Users/你的用户名/AppData/Local/Google/Chrome/User Data' # 替换为你的Chrome用户数据路径 )
注意:使用该方法时需确保常规Chrome未启动,否则会触发进程冲突。如需同时使用,可复制一份用户数据目录作为脚本专用。
2. 强化浏览器指纹伪装
在现有pyppeteer_stealth基础上,补充更多抗检测参数:
browser = await launch( headless=True, executablePath='C:/Program Files/chrome-win/chrome.exe', args=[ '--no-sandbox', '--disable-setuid-sandbox', '--disable-webgl', '--disable-dev-shm-usage', '--disable-accelerated-2d-canvas', '--disable-gpu', '--start-maximized', '--window-size=1280,800' ] )
同时在页面初始化时覆盖Canvas指纹:
await page.evaluateOnNewDocument(""" HTMLCanvasElement.prototype.toDataURL = function() { return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg=="; }; """)
3. 模拟真实用户行为
网站会通过行为模式识别机器人,需补充更贴近真人的操作:
- 扩大随机停留时间范围(5-15秒)
- 添加鼠标移动、滚动、随机点击等操作:
# 模拟滚动页面 await page.evaluate('window.scrollTo(0, document.body.scrollHeight)') await asyncio.sleep(random.uniform(1, 3)) # 模拟随机鼠标移动 await page.mouse.move(random.randint(0, 1280), random.randint(0, 800))
- 避免连续批量请求,每次请求后添加随机间隔。
4. 代理IP轮换
如果你的IP被网站标记,轮换代理IP是有效手段。可结合代理池,在启动浏览器时指定代理:
browser = await launch( executablePath='C:/Program Files/chrome-win/chrome.exe', args=['--proxy-server=http://你的代理IP:端口'] )
5. 处理人机验证页面
若网站弹出验证码,可集成第三方打码服务自动识别,或在检测到验证页面时暂停脚本,手动完成验证后继续执行。
内容的提问来源于stack exchange,提问作者Viada
相关产品推荐
相关产品推荐

