使用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); }); }
注意事项
- 要确保你Wix数据库的集合字段和代码里的字段名一致(比如
quoteText、author),如果字段名不同要对应修改。 - 目标网站的HTML结构可能会更新,要定期检查选择器/正则是否还能匹配。
- 不要频繁爬取,避免触发目标网站的反爬机制,必要时可以加个请求间隔。
内容的提问来源于stack exchange,提问作者user7778555
相关产品推荐
相关产品推荐

