1. Wprowadzenie do paginacji
A kto powiedział, że potrzebne ci dane znajdą się na jednej stronie? Bardzo często trzeba je wyrwać z wielu stron, albo są rozrzucone po całej stronie. Więc jednym z pierwszych wyzwań, z którymi się zmierzysz, będzie podział danych na strony (pages). A fascynująca praca polegająca na ich zbieraniu nazywa się pagination (paginacja).
Tak, paginacja — to nie tylko ten moment, kiedy czekasz na przejście do następnej strony wyników Google, ale też wtedy, gdy web scraper pyta sam siebie: "A jak to zautomatyzować, żeby nie robić tego ręcznie?"
Paginacja to sposób organizacji danych na stronie internetowej, aby uniknąć długich stron z zawartością. Zamiast tego strony dzielą dane na strony, dodając linki takie jak "Następna" lub "Dalej", aby przejść z jednej strony na drugą. To ważna koncepcja, ponieważ ty, jako web scraper, nie chcesz powiedzieć szefowi, że coś zgubiłeś, bo było ukryte na "piątej stronie".
2. Problemy z scrapingiem danych z wielu stron
Pierwszy problem, z którym możesz się spotkać, to brak intuicyjnych
i przewidywalnych URL. Niektóre strony nie zmieniają znacznie URL,
kiedy przechodzisz między stronami, co czyni życie dość skomplikowanym
dla automatyzacji. Na przykład, zamiast
page=1
, page=2
, możesz
spotkać x=abc
, x=def
bez wyraźnej reguły.
Drugi problem — ochrona przed botami. Niektóre strony aktywnie śledzą ilość zapytań z jednego adresu IP. Jeśli zobaczą, że robisz ich za dużo, możesz zostać czasowo (lub na stałe) zablokowany.
Ale spokojnie, teraz nauczymy się omijać te trudności jak prawdziwi scraperzy.
3. Obchodzenie paginacji
Techniki i strategie
-
Analiza struktury URL: Zwykle strony używają
parametru w URL do oznaczenia numeru strony, na przykład
?page=2
. Jeśli to znajdziesz, gratulacje, znalazłeś złoty szablon do obchodzenia paginacji! - Szukanie linków "Dalej": Czasami URL nie da się przewidzieć. W takich przypadkach musisz szukać linków "Dalej" lub "Następna" na stronie i podążać za nimi.
- Używanie zapytań AJAX: Niektóre strony pobierają dane za pomocą AJAX bez przeładowania strony. W takim przypadku musisz przechwycić te zapytania i je odtworzyć.
Przejdźmy do praktyki!
Przykład skryptu do obchodzenia paginacji i zbierania danych
Przejrzyjmy przykład skryptu:
import requests
from bs4 import BeautifulSoup
# Funkcja do pobierania danych z jednej strony
def get_data_from_page(url):
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# Tutaj wyciągasz dane z soup — przykład
data = soup.find_all('div', class_='data-class')
for item in data:
print(item.text) # Wyświetl lub zapisz dane
else:
print(f"Nie udało się pobrać strony: {url}")
# Główna logika obchodzenia paginacji
def scrape_all_pages(start_url):
current_url = start_url
while current_url:
get_data_from_page(current_url)
soup = BeautifulSoup(requests.get(current_url).text, 'html.parser')
# Próbujemy znaleźć link "Dalej"
next_button = soup.find('a', text='Dalej')
if next_button:
current_url = next_button['href']
else:
current_url = None
# Zaczynamy scrapowanie od pierwszej strony
start_url = 'http://example.com/page=1'
scrape_all_pages(start_url)
To podstawowy przykład, który pokazuje zasadę działania z paginacją. Musisz dostosować go do struktury strony, z którą pracujesz.
Zarządzanie sesją i używanie user-agent
Kiedy wysyłasz wiele zapytań do strony, przydaje się korzystanie z sesji i zmiana user-agent, aby zmniejszyć ryzyko blokady.
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
session = requests.Session()
session.headers.update(headers)
response = session.get('http://example.com')
Ta konstrukcja pozwala emulować przeglądarkę bardziej niezawodnie niż po prostu wysyłanie zapytań z pustymi nagłówkami.
4. Praktyczna realizacja
Teraz, gdy znamy podstawy, wprowadźmy trochę trudniejsze zadanie. Przyjrzyjmy się przypadkowi, gdy linki do stron zawierają nieprzewidywalne parametry, a my musimy użyć AJAX do pobrania danych.
Realizacja z użyciem AJAX
Czasami dane nie są ładowane na głównej stronie, ale podładowywane przez AJAX. Jeśli odkryjesz, że strona działa w ten sposób, użyj narzędzia w przeglądarce do debugowania sieci, aby określić, jakie zapytania są wysyłane w tle. Następnie odtwórz te zapytania za pomocą Pythona.
# Przykład wywołania AJAX
ajax_url = 'http://example.com/ajax_endpoint'
params = {
'some_param': 'value', # parametry, jeśli potrzebne do zapytania
'page': 1
}
while True:
response = session.get(ajax_url, params=params)
data = response.json()
if not data['has_more']:
break
# Przetwarzanie danych
for item in data['items']:
print(item)
params['page'] += 1 # Przejście do następnej strony
To podejście pomaga, gdy po dokładnej analizie zapytania i odpowiedzi zrozumiesz, jak dane są ładowane w przeglądarce.
Dzisiejszy wykład zanurzył nas w świat fascynującej i często kapryśnej paginacji. Ta umiejętność pozwoli ci pewnie i skutecznie zbierać dane ze stron, nie pomijając żadnej strony. W końcu, podobnie jak w życiu, w web scrapingu liczy się metodyczność i wytrwałość, bo kto wie, jakie ukryte skarby leżą na dwudziestej stronie!
GO TO FULL VERSION