• 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

Object Storage Arubacloud
+1 głos
272 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 1,158 wizyt
pytanie zadane 3 października 2022 w Offtop przez nielotweb Bywalec (2,240 p.)
+1 głos
1 odpowiedź 165 wizyt
0 głosów
1 odpowiedź 426 wizyt
pytanie zadane 19 sierpnia 2022 w Python przez NewbieProgrammer Początkujący (480 p.)

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...