Очистите подстраницы при очистке таблицы главной страницы [JS, NodeJS, Cheerio, Request-Promise] - PullRequest
0 голосов
/ 11 апреля 2020

[[Использование 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);

...