Как я могу исправить этот webscrapper, сделанный с использованием кукловода, который ничего не делает после удаления половины данных, но не выдает никакой ошибки? - PullRequest
0 голосов
/ 01 марта 2019

Для моего проекта в колледже я сделал скребок из Википедии, используя nodejs и puppeteer.Это работает для всех, кроме одной ссылки.После удаления почти половины данных таблицы на этой странице (я использую console.log, чтобы увидеть, какие данные были удалены в этот момент), он просто ничего не делает.Это не показывает никакой ошибки.Он не прекращает выполнение, он просто ничего не делает после этого.Браузер кукловода также не закрывается.

В оригинальном редакторе я использовал цикл ссылок для генерации данных.Поскольку это не работало, я сделал отдельный скребок для этой ссылки, но происходит то же самое.Может кто-нибудь мне помочь?

const puppeteer = require('puppeteer');
const fs = require('fs');


(async () => {

try {
    const browser = await puppeteer.launch({
        headless: false
    });
    const page = await browser.newPage();
    await page.setViewport({ width: 1280, height: 800 });

    link = "https://en.wikipedia.org/wiki/List_of_terrorist_incidents_in_June_2016";

    console.log("==============================");
    console.log("Travelling to link:", link);
    console.log("==============================");

    await page.goto(link, {waitUntil: 'networkidle0'});

    let rowArray = await page.$$("table[class='wikitable sortable jquery-tablesorter'] > tbody > tr");

    var dataA = [];

    for(let row of rowArray){
        let date = await row.$eval('td:nth-child(1)', element => element.textContent);
        date = date.substring(0, date.length - 1);
        let type = await row.$eval('td:nth-child(2)', element => element.textContent);
        type = type.substring(0, type.length - 1);
        let dead = await row.$eval('td:nth-child(3)', element => element.textContent);
        dead = dead.substring(0, dead.length - 1);
        let injured = await row.$eval('td:nth-child(4)', element => element.textContent);
        injured = injured.substring(0, injured.length - 1);
        let location = await row.$eval('td:nth-child(5)', element => element.textContent);
        location = location.substring(0, location.length - 1);
        let details = await row.$eval('td:nth-child(6)', element => element.textContent);
        details = details.substring(0, details.length - 1);
        let perpetrator = await row.$eval('td:nth-child(7)', element => element.textContent);
        perpetrator = perpetrator.substring(0, perpetrator.length - 1);
        let partOf = await row.$eval('td:nth-child(8)', element => element.textContent);
        partOf = partOf.substring(0, partOf.length - 1);



        console.log("==============================");
        console.log({date, type, dead, injured, location, details, perpetrator, partOf});
        console.log("==============================");

        dataA.push({date, type, dead, injured, location, details, perpetrator, partOf});
    }

    console.log("==============================");
    console.log("Started writing JSON file");
    fs.writeFileSync(`./june.json`, JSON.stringify(dataA), 'utf-8');
    console.log("Finished writing JSON file");
    console.log("==============================");


    await browser.close();

} catch (error) {
    console.error();
}

})();

1 Ответ

0 голосов
/ 02 марта 2019

Просто взглянув на точку, где он останавливается it stops here

Кажется, что скрипт борется со следующей строкой, в которой нет «закрывающей ячейки»

Я предполагаю, что если вы отредактируете эту страницу и закроете ее, она будет работать (или обновите свой сценарий для обработки этого сценария)

Если посмотреть на источник в Википедии, в этой строке ячейка "часть" отсутствует,таким образом, ваш код просто зависает в разделе 'await'

    let partOf = await row.$eval('td:nth-child(8)', element => element.textContent);

Таким образом, вы не получаете ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...