如何修改axios+cheerio爬虫代码 抓取含jam字符串的Blibli商品名称及链接
代码调整方案
修改后完整代码
const PORT = process.env.PORT || 8000 const express = require('express') const axios = require('axios') const cheerio = require('cheerio') const app = express() const categories = [ { name: 'jamtangan', address: 'https://www.blibli.com/c/2/aksesoris-jam-tangan/AK-1000005/JA-1000225', // 补充站点主域名,用于拼接相对路径的商品链接 base: 'https://www.blibli.com' } ] const products = [] categories.forEach(category => { // 新增UA头,避免被站点反爬拦截 axios.get(category.address, { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } }) .then(response => { const html = response.data const $ = cheerio.load(html) // 先定位商品容器,再提取信息,避免抓取到无关链接 $('.product__item').each(function () { const $currentItem = $(this) const title = $currentItem.find('.product__title').text().trim() // 仅保留标题包含jam的商品,忽略大小写 if (title.toLowerCase().includes('jam')) { const relativeUrl = $currentItem.find('a').attr('href') products.push({ title, // 自动拼接相对路径为可访问的完整链接,比手动拼接更稳妥 url: new URL(relativeUrl, category.base).href, source: category.name }) } }) }) // 新增错误捕获,避免单个分类请求失败影响整体服务 .catch(err => console.log(`分类${category.name}抓取失败:`, err.message)) }) app.get('/', (req, res) => { res.json('欢迎使用商品抓取API') }) app.get('/products', (req, res) => { res.json(products) }) app.listen(PORT, () => console.log(`服务运行在端口${PORT}`))
核心修改点
- 补全
categories配置里的base字段为站点主域名,解决商品链接是相对路径无法直接访问的问题 - 调整DOM选择逻辑:优先定位
.product__item商品容器,再从容器内提取标题和链接,避免原来直接选a标签抓到大量无关内容的问题 - 新增标题过滤逻辑:提取标题后判断是否包含
jam字符串,同时忽略大小写,保证匹配精准度 - 新增请求UA头和错误捕获逻辑,降低反爬拦截概率,提升代码稳定性
- 用
new URL()拼接链接,避免手动拼接时出现斜杠重复/缺失的问题
内容的提问来源于stack exchange,提问作者Shaiful Rizal Shaharudin
相关产品推荐
相关产品推荐

