在OLX页面用querySelectorAll无结果,排查Puppeteer反爬问题
问题描述
我尝试使用querySelectorAll方法,但通过Puppeteer执行该操作时无法获取任何结果。请问是否有方法检测该网站是否存在反机器人防护措施?
附上我的代码:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ // headless: 'new', headless: false, slowMo: true, args: ['--start-maximized'] }) const page = await browser.newPage() await page.setViewport({ width: 1366, height: 768}); const url = 'https://www.olx.pl/moda/akcesoria/' await page.goto(url, { waitUntil: 'networkidle0'}) const cookies = await page.waitForSelector('#onetrust-accept-btn-handler', { timeout: 5000 }) cookies.click() await page.waitForSelector('.css-oukcj3') const grid = await page.evaluate( () => document.querySelector('.css-oukcj3') ) console.log(grid) const elements = await page.evaluate( () => document.querySelectorAll('.css-1sw7q4x') ) console.log('elements: ', elements) await browser.close() })();
解决思路与方案
一、先修正代码本身的问题
你的代码存在一个关键误区:page.evaluate运行在浏览器环境,返回的结果需要能被序列化才能传递到Node.js环境。document.querySelectorAll返回的NodeList无法直接序列化,所以你看到的elements输出是空值。要拿到有效数据,需要在浏览器环境里把NodeList转成数组并提取具体属性,比如:
const elements = await page.evaluate( () => Array.from(document.querySelectorAll('.css-1sw7q4x')).map(el => ({ title: el.querySelector('h6')?.textContent.trim(), link: el.querySelector('a')?.href, price: el.querySelector('.css-10b0gli')?.textContent.trim() })) ) console.log('elements: ', elements)
二、检测网站反机器人防护的方法
1. 可视化验证
在无头模式下对页面截图,查看是否出现验证码、Cloudflare验证墙或空白页面——这些都是反爬的典型表现:
await page.screenshot({path: 'page_check.png', fullPage: true})
2. 监控请求状态
监听页面的请求和响应,若频繁出现403、503等状态码,或请求被重定向到验证页面,说明触发了反爬:
page.on('response', response => { if ([403, 503].includes(response.status())) { console.log('触发反爬拦截,状态码:', response.status()) } })
3. 检查页面实际渲染内容
在浏览器环境打印页面源码,验证目标选择器对应的元素是否真的存在。如果源码里没有目标元素,要么是内容未加载完成,要么是被反爬拦截:
const pageHtml = await page.evaluate(() => document.body.innerHTML) console.log('目标元素是否存在:', pageHtml.includes('css-1sw7q4x'))
4. 模拟真实用户行为
反爬系统会识别自动化工具的机械行为,可通过以下方式模拟真人操作:
- 在关键操作间添加随机延迟,比如点击Cookie按钮后:
await page.waitForTimeout(Math.random() * 1000 + 500) - 模拟页面滚动:
await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight)) - 使用真实的User-Agent:
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36')
5. 隐藏自动化指纹
Puppeteer默认的浏览器特征容易被识别,可借助puppeteer-extra和stealth插件隐藏自动化痕迹,减少被检测的概率。
三、针对OLX网站的额外提示
OLX确实有反爬机制,除了上述方法,还需注意:
- 控制请求频率,避免短时间内重复访问同一页面
- 不要批量创建浏览器实例,模拟正常用户的访问节奏
- 若仍被拦截,可尝试使用代理IP分散请求来源
内容的提问来源于stack exchange,提问作者jean d'arme
相关产品推荐
相关产品推荐

