使用Puppeteer爬取Tripadvisor数据遭拦截的解决方案咨询
解决TripAdvisor Puppeteer爬取拦截问题
先修正脚本中的明显错误
你的代码存在变量名不匹配问题:定义了all_Language,但调用点击方法时用了all_Languages.click(),这会直接抛出未定义错误,先修正这个基础问题。
针对TripAdvisor反爬的核心优化方案
TripAdvisor的反爬机制会检测浏览器自动化特征、请求频率、行为模式,以下是针对性解决措施:
模拟真实浏览器指纹
启动浏览器时配置更多参数,禁用自动化标识,匹配真实Chrome环境:const browser = await puppeteer.launch({ headless: false, executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-blink-features=AutomationControlled', '--start-maximized' ], defaultViewport: null });同时在页面加载前覆盖
navigator.webdriver,避免被识别为自动化工具:await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); });控制操作节奏,模拟人类行为
在页面跳转、元素点击之间添加随机延迟,避免机械性的快速操作:await page.goto('目标链接', { waitUntil: 'networkidle2' }); await page.waitForTimeout(Math.floor(Math.random() * 2000) + 1000); // 1-3秒随机延迟复用已验证的Cookie
手动完成Captcha验证后,导出浏览器的Cookie,在Puppeteer启动后导入,避免重复触发验证流程:const cookies = [/* 填入你导出的Cookie数组 */]; await page.setCookie(...cookies);使用更稳定的选择器
避免依赖动态生成的类名,改用文本内容或更固定的DOM结构定位“所有语言”选项:// 通过文本内容定位标签 await page.waitForSelector('label:has(span:text("All Languages"))'); await page.click('label:has(span:text("All Languages"))');注意:需要启用Puppeteer的选择器扩展,启动时添加
args: ['--enable-features=CSSSelectorInjection'],或者用page.evaluate直接通过文本查找元素。优化代理使用策略
轮换代理时,每个代理对应一个独立的浏览器实例,确保代理为高匿级别,避免被识别为爬虫代理;同时选择与目标站点地域匹配的代理,减少异常特征。
修正后的完整示例脚本
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ headless: false, executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-blink-features=AutomationControlled', '--start-maximized', '--enable-features=CSSSelectorInjection' ], defaultViewport: null }); const page = await browser.newPage(); // 覆盖自动化标识 await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); }); // 导入已验证的Cookie(可选,需手动导出) // const cookies = [/* 你的Cookie数组 */]; // await page.setCookie(...cookies); await page.goto('https://www.tripadvisor.com/Hotel_Review-g297962-d1804746-Reviews-Megasaray_Westbeach_Antalya-Antalya_Turkish_Mediterranean_Coast.html', { waitUntil: 'networkidle2' }); // 随机延迟 await page.waitForTimeout(Math.floor(Math.random() * 2000) + 1000); // 定位并点击“所有语言”选项 const allLanguageLabel = await page.waitForSelector('label:has(span:text("All Languages"))'); await allLanguageLabel.click(); // 后续爬取逻辑... })();
内容的提问来源于stack exchange,提问作者babeyh
相关产品推荐
相关产品推荐

