抓取DesktopNexus图片时urls返回空数组,请求代码分析与重写
解决DesktopNexus图片抓取返回空URL数组的问题
我帮你分析下原代码失效的原因,再给你重写可运行的版本——核心问题是原代码的选择器是针对Google Images的页面结构写的,和DesktopNexus的搜索结果页面完全不匹配,所以找不到任何链接,自然返回空数组[]。
原代码的问题点
你原代码里用了$(".image a.link")来定位图片链接,但DesktopNexus的搜索结果页面里,根本没有这个类名的元素。打开目标页面检查DOM结构就能发现,每个图片项的容器是div.thumb-container,里面的图片跳转链接是a.thumb,而且这个链接是相对路径(比如/wallpaper/2467890),直接用的话是无效的,需要补全域名。
重写后的完整代码
function kitsuneimage(message) { // 生成1-60范围内的随机页码,原代码的60+2逻辑不合理,这里修正为常规随机页码逻辑 const randomPage = Math.floor(Math.random() * 60) + 1; const options = { url: `https://www.desktopnexus.com/search/kitsune+girl/${randomPage}/`, method: "GET", headers: { "Accept": "text/html", // 使用更真实的Chrome浏览器UA,降低被反爬拦截的概率 "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" } }; console.log(options.url); request(options, function(error, response, responseBody) { if (error) { console.error("请求出错:", error); return; } // 加载页面内容到cheerio进行解析 const $ = cheerio.load(responseBody); // 定位正确的图片链接元素:每个缩略图容器内的a.thumb标签 const links = $(".thumb-container a.thumb"); // 将相对路径转换为完整URL,同时过滤掉可能的空链接 const urls = links.map((i, el) => { const href = $(el).attr("href"); return href ? `https://www.desktopnexus.com${href}` : null; }).get().filter(Boolean); console.log("抓取到的URL列表:", urls); if (!urls.length) { console.log("未抓取到任何有效图片链接"); return; }; // 发送第一个图片链接到指定频道 message.channel.send(urls[0]); }); }
关键修改说明
- 选择器替换:把
$(".image a.link")改成$(".thumb-container a.thumb"),这是DesktopNexus搜索结果中图片跳转链接的正确DOM路径 - URL补全:原代码拿到的是相对路径,通过拼接域名
https://www.desktopnexus.com生成可直接访问的完整URL - UA优化:用更真实的Chrome浏览器User-Agent字符串,降低被网站反爬机制拦截的概率
- 错误处理增强:增加了请求错误的日志输出,方便后续排查问题
- 空链接过滤:避免因为页面异常导致的空URL被加入数组,提升代码健壮性
内容的提问来源于stack exchange,提问作者user13992262
相关产品推荐
相关产品推荐

