You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:53:22