Jak poruszać się po stronach pagera opartych na JavaScript i zbierać linki

Pagination

Zrozumienie wyzwań związanych z paginacją i interfejsami API w oparciu o JavaScript

Witryny internetowe z paginacją opartą na JavaScript mogą utrudniać odwiedzającym nawigację po materiale, zwłaszcza jeśli elementy sterujące paginacją nie ujawniają żadnych parametrów adresu URL. Uniemożliwia to modyfikację lub automatyzację nawigacji strony przy użyciu konwencjonalnych metod, takich jak zmiana zapytań URL. Z takimi pagerami można nawiązać kontakt na różne sposoby.

Jeden z takich problemów pojawia się podczas próby pobrania linków lub danych z tego typu witryn internetowych. Jeśli nie możesz ręcznie poruszać się po setkach stron, lepszym podejściem jest symulacja zdarzeń kliknięcia na pagerze JavaScript. Technologia ta automatyzuje procedurę nawigacji, znacznie upraszczając obowiązki związane z gromadzeniem danych.

W niektórych okolicznościach karta „Sieć” w Narzędziach programistycznych przeglądarki może wyświetlać punkty końcowe API, które dostarczają przydatnych informacji. Jednak bezpośrednia interakcja z tymi punktami końcowymi może czasami powodować problemy, ponieważ mogą one nie zezwalać na określone metody HTTP, takie jak żądania GET, które są powszechnie używane do pobierania danych.

W tym artykule wyjaśniono, jak symulować zdarzenia kliknięcia na pagerze JavaScript witryny i jak radzić sobie z ograniczeniami interfejsu API, które ograniczają bezpośredni dostęp do wymaganych danych. Przyjrzymy się także sposobom obejścia ograniczeń określonych metod interfejsu API, aby zapewnić skuteczne gromadzenie wszystkich ważnych informacji.

Rozkaz Przykład użycia
document.querySelector() Metoda ta służy do wybrania pierwszego elementu pasującego do danego selektora CSS. Skrypt używa go do wyboru kontenera stronicowania (const pagerContainer = document.querySelector('.pagination')) i sterowania przyciskami pagera.
Array.from() Konwertuje obiekt podobny do tablicy lub obiekt iterowalny na odpowiednią tablicę. Skrypt konwertuje listę węzłów linków reklam na tablicę w celu łatwiejszej manipulacji i mapowania (Array.from(document.querySelectorAll('.ad-link-selector')).
puppeteer.launch() W przypadku użycia tego polecenia z Puppeteerem polecenie to uruchamia nową instancję przeglądarki bezgłowej. Obsługuje zautomatyzowane działania przeglądarki, takie jak nawigacja po stronie i symulowanie interakcji użytkownika (const Browser = Wait Puppeteer.launch()).
page.evaluate() In Puppeteer, this method allows you to run JavaScript code in the context of the web page you are controlling. It is used here to extract ad links from the DOM (await page.evaluate(() =>W Puppeteer ta metoda pozwala na uruchomienie kodu JavaScript w kontekście kontrolowanej strony internetowej. Służy tutaj do wyodrębniania linków reklamowych z DOM (await page.evaluate(() => {...})).
page.waitForSelector() Przed kontynuowaniem czeka na pojawienie się określonego selektora na stronie, upewniając się, że wszystkie elementy dynamiczne zostały załadowane. Jest to szczególnie ważne podczas przeglądania treści podzielonych na strony, ponieważ przy każdej zmianie strony pojawiają się nowe reklamy (await page.waitForSelector('.ad-link-selector').
axios.post() Wysyła żądanie HTTP POST na podany adres URL. W przykładzie podjęto próbę uniknięcia problemu 405, uzyskując dane za pomocą metody POST, a nie GET (stała odpowiedź = oczekiwanie na axios.post()).
console.error() Służy do zapisywania komunikatów o błędach w konsoli. Pomaga w debugowaniu, wyświetlając informacje o błędach, gdy niektóre elementy lub żądania API nie powiodą się (console.error('Nie znaleziono przycisku strony!').
$() Skrót do wybierania elementów w Puppeteer, porównywalny z document.querySelector(). Ten skrypt używa przycisku „Następna strona” do wygenerowania zdarzenia kliknięcia z podziałem na strony (const nextButton = oczekuj na stronę.$('.pagination-next').
click() To podejście replikuje kliknięcie elementu HTML. W skryptach służy do programowego poruszania się po pagerze poprzez kliknięcie odpowiedniego przycisku strony.

Opanowanie paginacji opartej na JavaScript i nawigacji API

Pierwszy wprowadzony skrypt wykorzystuje czysty JavaScript do dynamicznego przeglądania strony z paginacją opartą na JavaScript. Podstawową ideą tej metody jest imitacja użytkownika uderzającego w przyciski pagera poprzez wybieranie i aktywowanie zdarzeń kliknięcia na odpowiednich elementach HTML. Identyfikując kontener stronicowania za pomocą polecenia, możemy uzyskać dostęp do różnych przycisków strony i zautomatyzować nawigację. To podejście jest idealne w przypadkach, gdy ręczna zmiana adresu URL nie wchodzi w grę i potrzebny jest szybki interfejs front-end do współpracy z mechanizmem paginacji.

W drugim skrypcie wykorzystaliśmy Puppeteer, pakiet Node.js do sterowania przeglądarką bezgłową. Skrypt ten nie tylko symuluje naciśnięcia przycisku pagera, ale także automatyzuje cały proces podróżowania po wielu stronach, zbierając wszystkie linki do reklam przy każdej iteracji. Puppeteer umożliwia zeskrobywanie dynamicznie ładowanej zawartości poprzez bezpośrednią interakcję z elementami DOM, podobnie jak zrobiłby to prawdziwy użytkownik. Jednym z głównych elementów jest tutaj , który umożliwia wykonanie kodu JavaScript w kontekście strony. Jest to idealne rozwiązanie do gromadzenia danych, takich jak linki reklamowe na stronach podzielonych na strony.

Obydwa skrypty wymagają obsługi błędów, aby mieć pewność, że zautomatyzowany proces działa dobrze, nawet jeśli brakuje określonych elementów lub interfejs API zachowuje się nieoczekiwanie. Na przykład, rejestruje wszelkie błędy napotkane podczas wykonywania, na przykład brak docelowego przycisku na stronie. Dodatkowo Lalkarz polecenie gwarantuje, że komponenty dynamiczne, takie jak linki do reklam, zostaną w pełni załadowane, zanim skrypt podejmie próbę interakcji. Dzięki temu jest niezwykle przydatny podczas pracy ze stronami internetowymi, które w dużym stopniu opierają się na JavaScript do renderowania treści, ponieważ pozwala uniknąć problemów spowodowanych brakującym lub niekompletnym ładowaniem stron.

Gotowy skrypt korzysta z backendu Axios, klienta HTTP Node.js opartego na obietnicach. Tutaj próbujemy pobrać dane bezpośrednio z punktu końcowego API, który zgodnie z błędem HTTP 405 nie akceptuje zapytania. Aby tego uniknąć, skrypt wysyła plik żądanie, które może zostać zatwierdzone przez serwer. Ta metoda jest bardziej odpowiednia dla użytkowników, którzy chcą wyodrębnić dane bez konieczności poruszania się po interfejsie, ale wymaga zrozumienia struktury i zachowania interfejsu API serwera. Obsługa błędów gwarantuje raportowanie wszelkich niepowodzeń żądań API, co ułatwia rozwiązywanie problemów z pobieraniem danych po stronie serwera.

Rozwiązanie 1: Emulowanie kliknięć na pagerze JavaScript przy użyciu Vanilla JavaScript

To podejście wykorzystuje waniliowy JavaScript do programowego wyzwalania zdarzenia kliknięcia na przyciskach pagera poprzez wybranie odpowiednich elementów DOM. Można to zastosować do dowolnego scenariusza dynamicznego frontonu, w którym elementy są renderowane za pomocą JavaScript.

// Select the pagination container
const pagerContainer = document.querySelector('.pagination');

// Function to trigger a click event on a pager button
function clickPageButton(pageNumber) {
  const buttons = pagerContainer.querySelectorAll('button');
  const targetButton = [...buttons].find(btn => btn.textContent === String(pageNumber));
  if (targetButton) {
    targetButton.click();
  } else {
    console.error('Page button not found!');
  }
}

// Example usage: clicking the 2nd page button
clickPageButton(2);

Rozwiązanie 2: Użycie Puppeteera do automatyzacji nawigacji pagera i przeglądania reklam.

Puppeteer, narzędzie Node.js, które zapewnia API wysokiego poziomu do obsługi przeglądarki bezgłowej, służy w ten sposób do poruszania się po pagerze JavaScript i zbierania linków ze wszystkich reklam. Jest to rozwiązanie zaplecza, które jest często używane do zautomatyzowanych zadań skrobania.

const puppeteer = require('puppeteer');

// Function to scrape all ad links from a paginated website
async function scrapeAds() {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://www.supralift.com/uk/itemsearch/results');

  let ads = [];
  let hasNextPage = true;

  while (hasNextPage) {
    // Scrape the ad links from the current page
    const links = await page.evaluate(() => {
      return Array.from(document.querySelectorAll('.ad-link-selector')).map(a => a.href);
    });
    ads.push(...links);

    // Try to click the next page button
    const nextButton = await page.$('.pagination-next');
    if (nextButton) {
      await nextButton.click();
      await page.waitForSelector('.ad-link-selector');
    } else {
      hasNextPage = false;
    }
  }

  await browser.close();
  return ads;
}

// Call the scraping function and log results
scrapeAds().then(ads => console.log(ads));

Rozwiązanie 3: Pobieranie danych z API za pomocą Axios w Node.js

Ta metoda skupia się na wykorzystaniu Axios w Node.js do pobierania danych bezpośrednio z API. Błąd 405 wskazuje, że metoda GET jest niedozwolona, ​​dlatego strategia ta wykorzystuje POST lub inne nagłówki w celu obejścia ograniczenia. Jest to odpowiednie w przypadku scenariusza zaplecza, w którym wymagane są interakcje interfejsu API.

const axios = require('axios');

// Function to fetch data from the API using POST instead of GET
async function fetchData() {
  try {
    const response = await axios.post('https://www.supralift.com/api/search/item/summary', {
      headers: {
        'Content-Type': 'application/json'
      },
      data: { /* Add necessary POST body if applicable */ }
    });

    console.log(response.data);
  } catch (error) {
    console.error('Error fetching data:', error.response ? error.response.data : error.message);
  }
}

// Invoke the fetchData function
fetchData();

Optymalizacja paginacji JavaScript pod kątem przeglądania stron internetowych i gromadzenia danych

Eksplorując strony internetowe z systemem paginacji opartym na JavaScript, niezwykle ważne jest zapoznanie się z kilkoma metodami szybkiego wyodrębniania danych. Czasami ignorowaną opcją jest przechwytywanie żądań sieciowych wysyłanych przez mechanizm stronicowania. Uważnie przeglądając zapytania wykonywane w Narzędziach programistycznych przeglądarki, zwłaszcza na karcie „Sieć”, możesz określić punkty końcowe wykorzystywane do pobierania danych dla każdej strony. Mogą korzystać systemy oparte na JavaScript Lub żądania dynamicznego ładowania danych bez zmiany adresu URL, w przeciwieństwie do tradycyjnej paginacji, która wymaga zmiany parametrów adresu URL.

Aby wyodrębnić linki lub dane z takich witryn, przechwytuj żądania i pobieraj zwracane przez nie dane. Puppeteer i inne narzędzia umożliwiają monitorowanie ruchu sieciowego i zbieranie przydatnych danych. Gdy ta strategia nie jest wykonalna ze względu na ograniczenia po stronie serwera, zrozumienie zachowania interfejsu API staje się krytyczne. Niektóre interfejsy API, np , może zabronić określonych metod, takich jak i tylko pozwalaj zapytania. Dostosowanie zapytań do zamierzonej metody interfejsu API jest skutecznym obejściem tych ograniczeń.

Wreszcie, podczas skrobania danych podzielonych na strony, ważne jest, aby uwzględnić odpowiednie przerwy między żądaniami. Wiele witryn internetowych wykorzystuje algorytmy ograniczające szybkość, aby zapobiec nadużyciom, a wysyłanie zbyt wielu żądań w krótkim odstępie czasu może spowodować tymczasowe umieszczenie Twojego adresu IP na czarnej liście. Aby uniknąć wykrycia i zapewnić pomyślną ekstrakcję danych, uwzględnij losowe opóźnienie między zapytaniami lub ogranicz liczbę jednoczesnych żądań. Korzystanie z narzędzi takich jak w Node.js, a właściwa obsługa stawek to wspaniałe podejście do osiągnięcia tego celu.

  1. Co to jest paginacja oparta na JavaScript?
  2. Paginacja oparta na JavaScript to sposób, w jaki przyciski stronicowania wykorzystują JavaScript do dynamicznego ładowania nowego materiału, często bez zmiany adresu URL.
  3. Jak mogę zeskrobać dane ze strony internetowej z stronicowaniem JavaScript?
  4. Możesz użyć narzędzi takich jak Lub do automatyzacji kliknięć przycisków paginacji lub przechwytywania żądań sieciowych podczas paginacji.
  5. Dlaczego interfejs API zwraca błąd 405 Metoda niedozwolona?
  6. Dzieje się tak, ponieważ interfejs API obsługuje tylko niektóre metody HTTP. Może na przykład blokować prośby, jednocześnie pozwalając upraszanie.
  7. Czy mogę zmodyfikować adres URL, aby nawigować po stronach?
  8. W przypadku stronicowania opartego na JavaScript często nie można bezpośrednio zmienić adresu URL. Aby nawigować, musisz wywołać zdarzenia JavaScript lub użyć punktów końcowych API.
  9. Jakich narzędzi mogę użyć do skrobania danych podzielonych na strony?
  10. Popularne programy skrobania obejmują do automatyzacji przeglądarki i dla żądań HTTP. Obydwa skutecznie radzą sobie z treściami podzielonymi na strony.

Praca z paginacją opartą na JavaScript wymaga połączenia rozwiązań front-end i back-end. Niezależnie od tego, czy używasz Puppeteera do automatyzacji działań przeglądarki, czy Axios do bezpośredniego łączenia się z punktami końcowymi API, wydajne skrobanie wymaga starannego projektu i wykonania.

Zrozumienie, w jaki sposób witryna internetowa ładuje i przetwarza dane, pozwala na pisanie wydajnych skryptów wydobywających niezbędne informacje. Aby uniknąć częstych zagrożeń, takich jak błąd 405, należy uważnie monitorować ruch sieciowy, zarządzać limitami szybkości i używać odpowiednich metod HTTP.

  1. Szczegółowe informacje na temat wykorzystania Puppeteera do skrobania stron internetowych znajdują się w oficjalnej dokumentacji Puppeteera. Dokumentacja lalkarza
  2. Wyjaśnienie metod HTTP i obsługi żądań API, szczególnie w związku z błędem 405 „Metoda niedozwolona”, zostało zaczerpnięte z Dokumenty internetowe MDN .
  3. Informacje na temat Axios dotyczące tworzenia żądań HTTP w Node.js uzyskano od urzędnika Dokumentacja Axis .
  4. W przypadku manipulacji DOM JavaScript i zdarzeń takich jak click(), do treści odwoływano się z pliku Dokumenty internetowe MDN .