Я был счастлив избавиться от R, но нашел его пределы. Пытаясь отбросить краткое изложение дел Верховного суда Аргентины, я обнаружил проблему, на которую не могу найти ответа. Вероятно, это результат обучения путем выполнения --- поэтому, пожалуйста, сделайте , укажите, где мой код работает, но следует довольно плохой практике. В любом случае мне удалось:
- Доступ к странице поиска.
- Введите соответствующий термин таксономии (например, «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!
});