如何使用Node.js开发网页爬虫,运行返回空数组该如何解决?
Node.js 爬虫返回空数组问题排查及解决步骤
- 第一步:校验请求返回的HTML是否为正常页面内容
多数站点会校验请求头的User-Agent字段,缺失该字段的请求会被反爬策略拦截,返回错误页、验证页或空内容。你可以先在拿到返回结果后打印html.data,确认返回内容中是否包含你要抓取的公告文本,请求头补充User-Agent的修改方式如下:return await axios.get('https://web.kangnam.ac.kr', { headers: { Accept: 'text/html', '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' } }); - 第二步:修正Cheerio选择器的语法错误
你的代码存在两处选择器逻辑错误:- Cheerio中类名选择器需要加
.前缀,你写的find("list_txt title")、find("list_txt a")未加类名前缀,Cheerio会将其识别为标签名查找,无法匹配到对应元素 - 你已经通过
$("ul.tab_listl div.list_txt")定位到了div.list_txt节点,后续在遍历的上下文中无需重复查找list_txt节点,直接查找当前节点下的a标签即可
你也可以先打印$allNotices.length验证外层选择器是否匹配到了元素,如果返回值为0,说明ul.tab_listl div.list_txt这个路径和实际页面结构不符,需要重新核对目标页面的DOM类名和层级。
修正后的遍历逻辑如下:
$allNotices.each(function(idx, element) { ulList[idx] = { title : $(this).find("a").text().trim(), url : $(this).find("a").attr('href') }; }); - Cheerio中类名选择器需要加
- 第三步:确认公告是否为客户端动态渲染内容
如果修改后还是无法拿到内容,说明公告是页面加载完成后通过JS异步请求接口渲染的,初始HTML中不存在对应节点。这种情况你可以直接抓取浏览器控制台中公告对应的接口拿结构化数据,或切换使用Puppeteer这类支持JS渲染的爬虫工具处理。
内容的提问来源于stack exchange,提问作者박종준
相关产品推荐
相关产品推荐

