• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
+1 głos
378 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,693 wizyt
pytanie zadane 3 października 2022 w Offtop przez nielotweb Bywalec (2,240 p.)
+1 głos
1 odpowiedź 346 wizyt
0 głosów
1 odpowiedź 526 wizyt
pytanie zadane 19 sierpnia 2022 w Python przez NewbieProgrammer Początkujący (480 p.)

93,166 zapytań

142,177 odpowiedzi

321,946 komentarzy

62,495 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 688p. - dia-Chann
  2. 676p. - CC PL
  3. 675p. - Łukasz Piwowar
  4. 664p. - Marcin Putra
  5. 662p. - Łukasz Eckert
  6. 649p. - Michal Drewniak
  7. 641p. - rafalszastok
  8. 641p. - rucin93
  9. 629p. - Piotr Aleksandrowicz
  10. 629p. - Adrian Wieprzkowicz
  11. 621p. - Dawid128
  12. 612p. - Mikbac
  13. 611p. - ksalekk
  14. 606p. - Mariusz Fornal
  15. 602p. - Michał Telesz
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...