使用Cheerio爬取naukri.com未获取预期页面文本问题求助
解决Naukri.com爬取仅返回GTM/Akamai内容的问题
我来帮你搞定这个爬取问题!你遇到的情况是因为Naukri.com做了多层反爬防护,直接用Axios+Cheerio请求静态HTML根本拿不到实际的招聘内容,下面给你拆解原因和解决方案:
为什么会只拿到GTM和Akamai像素?
- 反爬检测拦截:Naukri用了Akamai的反爬系统,你的请求没有携带浏览器常用的请求头(比如User-Agent),被识别成了非人类爬虫,返回的是验证用的占位内容,而不是真实页面。
- 静态HTML局限性:Cheerio只能解析页面初始加载的静态HTML,但Naukri的招聘信息是通过JavaScript动态渲染出来的,初始HTML里只有加载脚本和跟踪代码,没有实际的职位数据。
解决方案1:添加浏览器请求头尝试绕过基础检测
先给你的Axios请求加上模拟浏览器的请求头,看看能不能通过基础验证:
'use strict'; const { default: axios } = require('axios'); const cheerio = require('cheerio'); async function jobUrls() { try { const siteUrl = 'https://www.naukri.com/cse-jobs?k=cse'; const { data } = await axios({ method: 'GET', url: siteUrl, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://www.naukri.com/' }, }); const $ = cheerio.load(data); console.log($.text()) } catch (er) { console.log(er) } } jobUrls();
不过这个方法不一定能长期生效,因为Akamai的检测逻辑会不断更新。
解决方案2:用Puppeteer模拟真实浏览器(推荐)
如果基础请求头不管用,就用Puppeteer这类工具模拟真实浏览器,它会执行页面的JavaScript,渲染出完整的页面内容,完美解决动态加载和反爬问题。
步骤1:安装Puppeteer
npm install puppeteer
步骤2:修改你的爬取代码
'use strict'; const puppeteer = require('puppeteer'); const cheerio = require('cheerio'); async function jobUrls() { try { // 启动浏览器(headless模式不弹出窗口) const browser = await puppeteer.launch({ headless: 'new' }); const page = await browser.newPage(); // 设置浏览器的User-Agent,模拟真实Chrome 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'); // 导航到目标页面,等待网络空闲确保内容加载完成 await page.goto('https://www.naukri.com/cse-jobs?k=cse', { waitUntil: 'networkidle2' }); // 获取渲染后的完整HTML const html = await page.content(); const $ = cheerio.load(html); // 现在可以提取你需要的招聘信息了,比如职位标题 console.log('=== 职位列表 ==='); $('.title').each((index, element) => { console.log(`${index + 1}. ${$(element).text().trim()}`); }); // 关闭浏览器 await browser.close(); } catch (error) { console.error('爬取出错:', error); } } jobUrls();
重要提醒
- 不要频繁发送请求,建议在请求之间加延迟(比如
await page.waitForTimeout(1000)),避免被网站封禁IP。 - 务必遵守Naukri.com的使用条款和
robots.txt规则,非法爬取可能会引发法律问题。
内容的提问来源于stack exchange,提问作者Go For Pro
相关产品推荐
相关产品推荐

