使用Cheerio与Node.js爬取SoccerWay时无法获取指定Select选项的问题
解决Cheerio爬取Soccerway俱乐部相关国家信息的问题
看起来你遇到的核心问题要么是静态抓取工具无法获取JS动态渲染的元素,要么是选择器因为网站结构更新失效了。我来一步步帮你排查和解决:
第一步:验证目标元素是否存在于静态HTML中
Soccerway的导航栏不少元素是通过JavaScript动态加载的,而request-promise只能抓取页面初始的静态HTML,这会导致你用Cheerio找不到后续渲染出来的元素。
先修改代码把页面保存到本地,确认目标select是否在静态内容里:
const rp = require('request-promise'); const fs = require('fs'); const options = { uri: 'https://uk.soccerway.com/' }; rp(options) .then((body) => { fs.writeFileSync('soccerway-static.html', body); console.log("静态页面已保存,打开后搜索目标select元素是否存在"); }) .catch((err) => { console.log(err); })
如果打开保存的HTML后找不到那个select,说明它是JS动态生成的,这时候Cheerio就无能为力了,需要换用能模拟浏览器的工具。
第二步:用Puppeteer抓取动态渲染的内容
Puppeteer可以模拟真实浏览器加载页面,等待JS渲染完成后再获取元素,是解决动态页面抓取的常用方案:
首先安装Puppeteer:
npm install puppeteer
然后用以下代码获取俱乐部相关的国家选项:
const puppeteer = require('puppeteer'); (async () => { // 启动浏览器(headless: true 为无界面模式,设为false可以看到浏览器窗口) const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); // 访问目标页面,等待网络请求基本完成 await page.goto('https://uk.soccerway.com/', { waitUntil: 'networkidle2' }); // 等待目标select元素加载完成(用data属性定位,比依赖父元素索引更稳定) await page.waitForSelector('select[data-dropdown-current="country"]'); // 在浏览器环境中提取所有非空的option值 const countryList = await page.evaluate(() => { const options = Array.from(document.querySelectorAll('select[data-dropdown-current="country"] > option')); return options.map(opt => opt.value).filter(val => val.trim() !== ''); }); console.log("俱乐部相关的国家信息:", countryList); await browser.close(); })();
这里用data-dropdown-current="country"这个属性定位select,比依赖父元素的位置更可靠,能避免网站结构微调导致选择器失效。
第三步:如果静态页面存在元素,修正Cheerio选择器
如果静态HTML里确实有目标元素,那大概率是你的选择器不正确。Cheerio的:eq()是从0开始计数的,而CSS的:nth-child()是从1开始,网站结构更新后原来的索引可能已经失效。建议用更具体的属性来定位:
rp(options) .then(($) => { // 用data属性定位select,再遍历option $('select[data-dropdown-current="country"] > option').each(function() { const val = $(this).val(); if(val) console.log(val); }); }) .catch((err) => { console.log(err); })
这样不管父元素位置怎么变,只要select的data属性不变,就能稳定定位到目标元素。
内容的提问来源于stack exchange,提问作者Amazingstufff
相关产品推荐
相关产品推荐

