• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Node Js - Puppeteer - Web Scraping - Wyciąganie konkretnych danych z ofert OLXa

+1 głos
618 wizyt
pytanie zadane 19 grudnia 2022 w JavaScript przez Czang Kai Shrek Obywatel (1,990 p.)

Cześć, piszę puppetera w Node JS, w bibliotece puppeteer, dedykowanej do skrobania*.
Natrafiłem na problem przy próbie skrobania OLXa:

 

await page.goto('https://www.olx.pl/d/motoryzacja/samochody/');

    const result = await page.evaluate(() => {
        let data = [];
        let elements = document.querySelectorAll('a');

        for (var element of elements){ 
            let xxx = element.innerText;

            data.push({xxx}); 
        }

        return data; 
    });

Jak widać, ściągam dane w nazwijmy to: kontenerach, na podstawie znacznika - a. Efekt:
{
    xxx: 'Mercedes-Benz Klasa V Auto w super stanie serwisowane regularnie ,polecam\n' +
      '\n' +
      '209 000 zł\n' +
      'do negocjacji\n' +
      '\n' +
      'Warszawa, Praga-Południe - Dzisiaj o 19:06\n' +
      '\n' +
      '2016 - 121 000 km\n' +
      'Obserwuj'
  },
...
Potrzebuję pozyskać wybrane elementy z tego, np: cena, rocznik z przebiegiem i tytuł. Nie mogę wejść głębiej w htmla (w elementy w a), ponieważ musiałbym korzystać z selektorów css, a one się zmieniają po załadowaniu strony.

Można NA PEWNO to zrobić za pomocą childNodes i tu jest problem, bo jakiej kombinacji nie próbowałem: 

hasChildNodes, childNodes[...], children[...], firstChild, lasttChild

no nie potrafię tego wyciągnąć, podejrzewam, że to głupi błąd w implementacji. 
Pomoże Ktoś? Czy są inne pomysły?
(nie chcę pobierać jsona, tylko wyświetlać to na konsoli*)

1 odpowiedź

0 głosów
odpowiedź 19 grudnia 2022 przez ScriptyChris Mędrzec (190,190 p.)

Z tego co widzę, to skrótowe informacje o każdym ogłoszeniu są dostępne, jako JSON, w skrypcie o ID "listing-json-ld". Wystarczy, że pobierzesz ten skrypt i sparsujesz jego zawartość:

const scriptWithOffers = document.querySelector('#listing-json-ld');
const offersData = JSON.parse(scriptWithOffers.textContent);

Przykładowe dane odnośnie jednego z ogłoszeń na screenie: https://imgur.com/a/A1IR8OI

komentarz 19 grudnia 2022 przez Czang Kai Shrek Obywatel (1,990 p.)
 const result = await page.evaluate(() => {
        let data = []; 
        //let elements = document.querySelectorAll('a');
        const scriptWithOffers = document.querySelector('#listing-json-ld');

        for (var element of scriptWithOffers){
            const offersData = JSON.parse(scriptWithOffers.textContent);
            data.push({offersData});
        }

        return data; 
    });

Ze skryptu pobieramy wszystkie ogłoszenia czy skrypt tyczy się jednego i trzeba je przeiterować?

komentarz 19 grudnia 2022 przez ScriptyChris Mędrzec (190,190 p.)

Wspomniany obiekt, z tego co widzę, zawiera wszystkie ogłoszenia z danej strony. Nie iteruj po scriptWithOffers, bo to nie jest tablica, tylko ten skrypt. Tablicą będzie offersData.mainEntity.itemListElement (z mojego skryptu) i po tym iteruj.

komentarz 19 grudnia 2022 przez Czang Kai Shrek Obywatel (1,990 p.)

Rozumiem, choć coś wcześniej jest nie tak, bo nawet nie mogę wyświetlić jednorazowo skryptu scriptWithOffers

await page.goto('https://www.olx.pl/d/motoryzacja/samochody/');

    const result = await page.evaluate(() => {
        let data = []; 
        //let elements = document.querySelectorAll('a');
        const scriptWithOffers = document.querySelector('#listing-json-ld');
        const offersData = JSON.parse(scriptWithOffers.textContent);
         
        data.push({scriptWithOffers});
        

        return data; 
    });

 

komentarz 19 grudnia 2022 przez ScriptyChris Mędrzec (190,190 p.)

Jeśli chcesz zwrócić tablicę z obiektem DOM, to spróbuj użyć page.evaluateHandle. Tyle, że ja bym zwrócił offersData (albo nawet zmapowane obiekty konkretnych ogłoszeń), a nie sam skrypt, bo to raczej szczegół implementacyjny; tj. on jest źródłem danych ogłoszeń, a na zewnątrz nie powinno Cię to interesować.

Podobne pytania

0 głosów
5 odpowiedzi 3,210 wizyt
pytanie zadane 3 października 2022 w Offtop przez nielotweb Bywalec (2,240 p.)
+1 głos
1 odpowiedź 789 wizyt
0 głosów
1 odpowiedź 750 wizyt
pytanie zadane 19 sierpnia 2022 w Python przez NewbieProgrammer Początkujący (480 p.)

93,599 zapytań

142,524 odpowiedzi

322,993 komentarzy

63,082 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...