[[Использование javascript, cheerio, node.js, запрос-обещание, визуальный студийный код]]
Я занимаюсь веб-скребком в JS и у меня возникает следующая проблема ...
Я написал следующий код, который удаляет все данные таблицы со страницы http://lotrtcgwiki.com/wiki/grand и создает json формы:
[
{
"cardID": "0P1",
"cardTitle": "The Prancing Pony (P)",
"cardType": "Site",
"cardSite": "Site",
"cardUrl": "http://lotrtcgwiki.com/wiki/lotr00001"
},
{
"cardID": "0P2",
"cardTitle": "•Bill the Pony (P)",
"cardType": "Possession",
"cardSite": "Shire",
"cardUrl": "http://lotrtcgwiki.com/wiki/lotr00002"
},
...
Теперь, просматривая каждую строку, я хочу go перейти по ссылке cardUrl
и почистить еще некоторые данные с этой страницы. Это суть вопроса. Как очистить дочернюю страницу при очистке родительской страницы.
Я новичок в JS
и promises
, и я использую request-promise
, но, вероятно, со временем переключусь на axios
.
Вот мой код, не стесняйтесь его запускать:
const axios = require('axios');
const cheerio = require('cheerio');
const fs = require("fs");
const siteUrl = "http://lotrtcgwiki.com";
const wikiUrl = siteUrl + "/wiki";
const grandListUrl = wikiUrl + "/grand";
const cards = []
const scrapeMainPage = async (url) => {
const result = await axios.get(url);
const $ = cheerio.load(result.data);
$("body > div.dokuwiki > div.page > div > div.wrap_indextab.plugin_wrap > div > table > tbody > tr")
.each(async (index, element) => {
if (index === 0) return true;
const tds = $(element).find("td");
const cardID = $(tds[0]).text().trim();
const cardTitle = $(tds[1]).text().trim();
const cardUrl = wikiUrl + $(tds[1]).children("a").attr("href").replace("/wiki", "").trim();
const cardType = $(tds[2]).text().trim();
const cardSite = $(tds[3]).text().trim();
// Scrape the sub page
scrapeSubPage(cardUrl)
const card = { cardID, cardTitle, cardType, cardSite, cardUrl };
cards.push(card);
});
exportResults(cards, "lotrtcgcards.json")
}
const scrapeSubPage = async (cardUrl) => {
console.log(" Scraping " + cardUrl);
const subPage = await axios.get(cardUrl);
console.log("done")
}
const exportResults = (results, outputFile) => {
try {
fs.writeFile(outputFile, JSON.stringify(results, null, 4), (err) => {
if (err) {
console.log(err);
}
console.log('\n' + results.length + ' Results exported successfully to '+ outputFile);
})
} catch (error) {
throw error;
}
}
scrapeMainPage(grandListUrl);