Разбиение на страницы, когда нет кнопки "следующая страница", но есть несколько страниц с "номерами страниц" - PullRequest
0 голосов
/ 21 июня 2020

Я был счастлив избавиться от R, но нашел его пределы. Пытаясь отбросить краткое изложение дел Верховного суда Аргентины, я обнаружил проблему, на которую не могу найти ответа. Вероятно, это результат обучения путем выполнения --- поэтому, пожалуйста, сделайте , укажите, где мой код работает, но следует довольно плохой практике. В любом случае мне удалось:

  1. Доступ к странице поиска.
  2. Введите соответствующий термин таксономии (например, «DECRETO DE NECESIDAD Y URGENCIA») в #voces, нажмите «Поиск» и удалите .datosSumarios, где находится нужная мне информация (название дела, дата, репортер и т. д.). Код ниже:

const puppeteer = require('puppeteer');

let scrape = async () => {
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();

    await page.goto('https://sjconsulta.csjn.gov.ar/sjconsulta/');

  // wait until element ready  
    await Promise.all([
        page.type('#voces', 'DECRETO DE NECESIDAD Y URGENCIA'),
        page.waitForSelector('.ui-menu-item')
    ]);

    await page.click('.ui-menu-item');

    await Promise.all([
    page.click('.glyphicon-search'),
    page.waitForNavigation({ waitUntil: 'networkidle0' }),
  ]);

    //Here we are in the place we want to be, and then capture what we need:     
    
    const result = await page.evaluate(() => {

        let data = []; // Create an empty array that will store our data
        
        let elements = document.querySelectorAll('.row'); // Select all Products

        for (var element of elements){ // Loop through each proudct
            
            let title = document.querySelector('.datosSumario').innerText;

            data.push({title}); // Push an object with the data onto our array

        }

        return data; // Return our data array
        
    });

    //review -> 
    
    await page.click('#paginate_button2')  

    browser.close();
    return result;
};

scrape().then((value) => {
    console.log(value); // Success!
});

То, что я не могу сделать, так это go через разные страницы. Если вы проследите за страницей, то увидите, что разбивка на страницы довольно странная: нет кнопки «следующая страница», но есть несколько «кнопок с номерами страниц», которые я могу нажать, но не могу повторить раздел отсечения в приведенном выше коде. Я пробовал функцию al oop (заставить ее работать не удалось). Я просмотрел несколько руководств по разбиению на страницы, но не смог найти ни одного, которое сталкивается с этой конкретной проблемой.

# Обновление

Мне удалось решить проблему разбиения на страницы, но в настоящее время я не могу Кажется, это функция для фактического удаления текста, который мне нужен для работы с разбивкой на страницы (он работает снаружи, на одной странице). Поделиться на случай, если кто-то сможет указать на очевидную ошибку, которую я, вероятно, делаю.

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

let scrape = async () => {
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();

    await page.goto('https://sjconsulta.csjn.gov.ar/sjconsulta/');

  // wait until element ready  
    await Promise.all([
        page.type('#voces', 'DECRETO DE NECESIDAD Y URGENCIA'),
        page.waitForSelector('.ui-menu-item')
    ]);

    await page.click('.ui-menu-item');

    await Promise.all([
    page.click('.glyphicon-search'),
    page.waitForNavigation({ waitUntil: 'networkidle0' }),
  ]);

    var results = []; // variable to hold the "sumarios" I need
    var lastPageNumber = 2; // I am using 2 to test, but I can choose any number and it works (in this case, the 31 pages I need to scrap)
    for (let index = 0; index < lastPageNumber; index++) {
        // wait 1 sec for page load
        await page.waitFor(5000);
        // call and wait extractedEvaluateCall and concatenate results every iteration.
        // You can use results.push, but will get collection of collections at the end of iteration
        results = results.concat(await MyFunction); // I call my function but the function does not work, see below 
        if (index != lastPageNumber - 1) {
            await page.click('li.paginate_button.active + li a[onclick]'); //This does the trick 
            await page.waitFor(5000);
        }
    }

    browser.close();
    return results;

};

    async function MyFunction() {
    
        const data = await page.evaluate( () => // This bit works outside of the async function environment and I get the text I need in a single page

            Array.from( 

                document.querySelectorAll('div[class="col-sm-8 col-lg-9 datosSumario"]'), element => element.textContent) 
    
            );

    }

scrape().then((results) => {
    console.log(results); // Success!
    
});

1 Ответ

1 голос
/ 21 июня 2020

Вы можете попробовать document.querySelector('li.paginate_button.active + li a[onclick]') как эквивалент кнопки следующей страницы. После щелчка по нему можно дождаться ответа с URL, начинающимся с 'https://sjconsulta.csjn.gov.ar/sjconsulta/consultaSumarios/paginarSumarios.html?startIndex='.

# Для обновления

На первый взгляд, есть некоторые проблемы:

  1. MyFunction не вызывается: нужно await MyFunction() вместо await MyFunction.

  2. Вам нужно перенести page в MyFunction() scope:

  results = results.concat(await MyFunction(page));
//...
async function MyFunction(page) {
// ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...