You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Node.js与Wix Code爬取网页:无需Cheerio提取名言存数据库

如何在不使用Cheerio的情况下提取名言并存入Wix数据库?

既然你已经能拿到目标网站的完整HTML响应,不用Cheerio的话,我们可以用原生的字符串处理(正则)或者浏览器的DOMParser来提取内容,再存入Wix数据库。下面给你两种可行的方案:

方案一:正则表达式提取(适合结构简单的场景)

正则虽然不是处理HTML的最佳实践,但对于BrainyQuote这种结构固定的网站,足够好用。先看代码修改:

首先调整客户端代码,拿到HTML后用正则匹配名言和作者:

fetchData().then(function (html) {
  // 匹配名言内容的正则(根据目标网站实际结构调整)
  const quoteRegex = /<a class="b-qt" href="[^"]+">([^<]+)<\/a>/g;
  // 匹配作者的正则
  const authorRegex = /<a class="bq-aut" href="[^"]+">([^<]+)<\/a>/g;
  
  const quotes = [];
  let quoteMatch, authorMatch;
  
  // 循环匹配所有名言和对应的作者
  while ((quoteMatch = quoteRegex.exec(html)) !== null && (authorMatch = authorRegex.exec(html)) !== null) {
    quotes.push({
      quote: quoteMatch[1].trim(),
      author: authorMatch[1].trim()
    });
  }
  
  console.log("提取到的名言:", quotes);
  // 调用函数存入数据库
  saveQuotesToDB(quotes);
});

// 定义存入Wix数据库的函数
function saveQuotesToDB(quotes) {
  // 替换成你自己的集合名称
  const quotesCollection = wixData.collection("HackerQuotes");
  
  // 批量插入数据
  const insertPromises = quotes.map(quote => {
    return quotesCollection.insert({
      quoteText: quote.quote,
      author: quote.author
      // 这里可以添加你集合里的其他字段,比如分类、创建时间等
    });
  });
  
  Promise.all(insertPromises)
    .then(results => {
      console.log("所有名言已成功存入数据库!", results);
    })
    .catch(error => {
      console.error("存入数据库时出错:", error);
    });
}

另外,为了避免被目标网站封禁,建议给你的fetch请求加个User-Agent头,修改后端的option:

let option = { 
  method: "GET",
  headers: {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
  }
};

方案二:用DOMParser解析HTML(更可靠)

如果正则容易因为网站结构小变动失效,前端的DOMParser是更好的选择,它能把HTML转换成DOM对象,像操作网页元素一样提取内容:

fetchData().then(function (html) {
  // 创建DOMParser实例
  const parser = new DOMParser();
  // 把HTML字符串转换成DOM文档
  const doc = parser.parseFromString(html, "text/html");
  
  // 选择所有名言元素(根据目标网站的class选择器)
  const quoteElements = doc.querySelectorAll(".b-qt");
  // 选择所有作者元素
  const authorElements = doc.querySelectorAll(".bq-aut");
  
  const quotes = [];
  
  // 遍历提取内容
  for (let i = 0; i < quoteElements.length; i++) {
    quotes.push({
      quote: quoteElements[i].textContent.trim(),
      // 处理作者可能缺失的情况
      author: authorElements[i] ? authorElements[i].textContent.trim() : "Unknown Author"
    });
  }
  
  console.log("提取到的名言:", quotes);
  saveQuotesToDB(quotes);
});

// 存入数据库的函数和方案一完全一样
function saveQuotesToDB(quotes) {
  const quotesCollection = wixData.collection("HackerQuotes");
  
  const insertPromises = quotes.map(quote => {
    return quotesCollection.insert({
      quoteText: quote.quote,
      author: quote.author
    });
  });
  
  Promise.all(insertPromises)
    .then(results => {
      console.log("所有名言已成功存入数据库!", results);
    })
    .catch(error => {
      console.error("存入数据库时出错:", error);
    });
}

注意事项

  1. 要确保你Wix数据库的集合字段和代码里的字段名一致(比如quoteText、author),如果字段名不同要对应修改。
  2. 目标网站的HTML结构可能会更新,要定期检查选择器/正则是否还能匹配。
  3. 不要频繁爬取,避免触发目标网站的反爬机制,必要时可以加个请求间隔。

内容的提问来源于stack exchange,提问作者user7778555

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:27:29