❗ Zastrzeżenie : To jest część 3 naszego sześcioczęściowego cyklu na temat zaawansowanego web scrapingu. Nowość w tym cyklu? Zacznij od początku, czytając część 1 !
W części 2 naszej serii Advanced Web Scraping dowiedziałeś się , jak scrapować dane z SPA, PWA i witryn opartych na sztucznej inteligencji . Teraz powinieneś mieć całą wiedzę potrzebną do zbudowania scrapera, który działa na większości nowoczesnych witryn.
Co dalej? Czas zoptymalizować swój scraper za pomocą kilku profesjonalnych wskazówek i trików scrapowania!
Budowanie web scrapera? Wszystko kręci się wokół skryptów . 👨💻
I bądźmy szczerzy — jeśli kiedykolwiek pisałeś kod, wiesz, że pisanie skryptów nie jest takie trudne w większości przypadków. Kilka linijek tu, a for
i bum, scrapujesz dane jak profesjonalista. Brzmi prosto, prawda? 😄
Ale jest problem: prostota pisania małego scrapera może uśpić twoją czujność. Po co zawracać sobie głowę właściwymi komentarzami, obsługą błędów, logami, a nawet schludnym wcięciem, skoro to tylko kilkanaście wierszy kodu, które każdy może przeczytać?
Rozumiemy — po co przesadzać z czymś, co tego nie potrzebuje? Przesadzanie jest wrogiem postępu. Ale co się dzieje, gdy trzeba skalować scrapery do wielu stron lub nawet całych witryn? 🤔
Wtedy właśnie Twój szybki i brudny, zakodowany spaghetti scraper się rozpada! 🍝
Oto dlaczego potrzebujesz zaawansowanych wskazówek dotyczących scrapowania stron internetowych.
Pewnie już słyszałeś o typowych wskazówkach dotyczących scrapowania stron internetowych: priorytetyzuj najpierw strony z danymi krytycznymi, losuj żądania itd. Świetna rada — ale bądźmy szczerzy, te sztuczki to już stare wieści. 📰
Gdy masz do czynienia z bardziej zaawansowanymi scenariuszami, te podstawy mogą nie wystarczyć. Jeśli naprawdę chcesz podnieść poziom swojej gry w scrapowanie, musisz poznać kilka technik następnego poziomu.
Gotowy? Zapnij pasy — czas przenieść swoje umiejętności web scrapingu na wyższy poziom! 💪
⚠️ Ostrzeżenie: Nie martw się, jeśli niektóre wskazówki wydają się znajome — kontynuuj! Jest mnóstwo ciekawych spostrzeżeń, gdy zagłębisz się w temat! 🤿
Jednym z najczęstszych błędów w web scrapingu jest zapominanie, że Internet nie jest jakąś magiczną, nieomylną technologią. Kiedy wysyłasz żądanie do witryny, cały szereg rzeczy może (i w pewnym momencie pójdzie) nie tak. ❌
Przyjrzyjmy się kilku typowym scenariuszom:
Twoja sieć Wi-Fi lub połączenie mogą chwilowo zawodzić
Serwer hostujący witrynę może być niedostępny
Strona, której szukasz, może już nie istnieć
Witryna docelowa może doświadczać tymczasowego spowolnienia, co może prowadzić do błędu przekroczenia limitu czasu
Dodaj teraz analizę składniową danych, wstępne przetwarzanie i eksportowanie do bazy danych, a otrzymasz przepis na idealny chaos. 💥
Więc jakie jest rozwiązanie? Obsługa błędów ! 🛡️
Obsługa błędów jest Twoim najlepszym przyjacielem w web scrapingu. Twój skrypt prawdopodobnie przetworzy dziesiątki (lub tysiące) stron, a jeden błąd nie powinien spowodować awarii całej operacji.
Pamiętaj, że blok try ... catch
jest Twoim przyjacielem. Używaj go do pakowania żądań i logiki przetwarzania. Pamiętaj również, że większość bibliotek HTTP nie zgłasza wyjątków dla złych odpowiedzi HTTP (takich jak 404
lub 500
). 😲
Jeśli nie jesteś zaznajomiony z kodami statusu HTTP , obejrzyj poniższy film:
Na przykład w bibliotece żądań języka Python należy ręcznie sprawdzić kod statusu odpowiedzi w następujący sposób:
import requests response = requests.get("https://example.com") if response.status_code == 200: # handle the successful response... else: # handle the error response...
Lub, co jest równoważne, użyj metody raise_for_status() :
import requests try: response = requests.get("https://example.com") # raises an HTTPError for bad responses (4xx or 5xx) response.raise_for_status() # handle the successful response... except requests.exceptions.HTTPError as http_err: # handle an HTTP error... except requests.exceptions.RequestException as req_err: # handle a request error...
Twój zaawansowany skrypt web scrapingu powinien nie tylko obsługiwać błędy, ale także je odzyskiwać. Ponieważ większość błędów związanych ze scrapingiem sieci jest związana z tworzeniem żądań sieciowych, możesz znacznie zwiększyć skuteczność swojego scrapera, implementując żądania z możliwością ponownego wykonania .
Koncepcja jest prosta: jeśli żądanie się nie powiedzie, próbujesz je ponownie — jeden, dwa, trzy lub więcej razy — aż do skutku. 🔄
Jest jednak pewien haczyk: ponieważ jedną z najczęstszych przyczyn nieudanego żądania jest tymczasowa niedostępność lub spowolnienie serwera docelowego, nie należy go przeciążać, wysyłając to samo żądanie wielokrotnie w krótkim odstępie czasu.
Jeśli żądanie nie powiedzie się teraz, prawdopodobnie nie powiedzie się ponownie natychmiast. To właśnie tutaj wchodzi w grę wykładniczy backoff !
Zamiast natychmiastowego ponawiania próby, technika ta stopniowo wydłuża czas między kolejnymi próbami, zwiększając szanse powodzenia poprzez umożliwienie serwerowi docelowemu odzyskania danych. ⏳
Podczas gdy możesz ręcznie wdrożyć proste strategie ponawiania prób za pomocą niestandardowego kodu, wielu klientów HTTP ma wbudowane narzędzia lub biblioteki do automatycznego obsługiwania ponawiania prób. Na przykład Axios oferuje bibliotekę axios-retry , której możesz użyć w następujący sposób:
const axios = require("axios"); const axiosRetry = require("axios-retry"); axiosRetry(axios, { retries: 3, retryDelay: axiosRetry.exponentialDelay }); axios.get('https://example.com') .then(response => console.log(response.data)) .catch(error => console.log("Request failed:", error));
Podobnie pakiet urllib3
języka Python zawiera klasę Retry , która bezproblemowo integruje się z większością klientów HTTP języka Python .
Podczas sprawdzania elementów w Narzędziach programistycznych możesz mieć ochotę kliknąć prawym przyciskiem myszy i wybrać opcję „Kopiuj selektor”:
Ale bądź ostrożny, bo wynik może wyglądać mniej więcej tak:
#__next > div > main > div.sc-d7dc08c8-0.fGqCtJ > div.sc-93e186d7-0.eROqxA > h1
To zdecydowanie nie jest idealne rozwiązanie do scrapowania sieci…
Problem? Zbyt szczegółowe selektory, takie jak te, mogą łatwo ulec uszkodzeniu, gdy struktura strony ulega zmianie. Im bardziej szczegółowy jest selektor, tym bardziej staje się kruchy.
Aby uczynić scraping sieci bardziej odpornym, musisz zachować elastyczność selektorów. Zamiast polegać na klasach związanych ze stylem (które zmieniają się cały czas), skup się na atrybutach, które są mniej podatne na zmiany, takich jak id
, data-
lub aria-
. Większość tych atrybutów jest przeznaczona do testowania i dostępności , więc mają tendencję do pozostawania spójnymi w czasie. 💡
A podczas gdy selektory CSS są łatwiejsze do odczytania i zrozumienia, XPath oferuje większą moc. Ale nie martw się — często możesz osiągnąć te same rezultaty za pomocą prostych selektorów CSS, oszczędzając sobie konieczności stosowania złożonego kodu XPath. 😌
Więcej informacji na ten temat znajdziesz w naszym poradniku na temat selektorów XPath i CSS !
Analizowanie stron HTML zajmuje czas i zasoby, szczególnie jeśli masz do czynienia z dużym, zagnieżdżonym DOM. Jeśli twój scraper analizuje tylko kilka stron, to nie jest to aż tak duży problem.
A co się dzieje, gdy Twoja operacja scrapowania się skaluje i musisz pobrać dane z milionów stron? Ten niewielki narzut może szybko wyczerpać zasoby serwera i wydłużyć całkowity czas scrapowania o godziny. ⏳
Aby lepiej zrozumieć temat, zapoznaj się z poniższymi materiałami:
Szukasz pełnego porównania? Przeczytaj nasz artykuł o najlepszych parserach HTML .
Dobra wiadomość? Przełączanie się z jednego parsera na inny nie jest takie trudne. Na przykład w BeautifulSoup jest to po prostu prosta zmiana parametru:
from bs4 import BeautifulSoup # or using html.parser soup = BeautifulSoup(html_content, "html.parser") # or using lxml parser soup = BeautifulSoup(html_content, "lxml")
A co z parserami HTML wbudowanymi w przeglądarki takie jak Chrome? 🤔
Więcej szczegółów znajdziesz w poniższym filmie:
HTTP/2 to zaktualizowana wersja protokołu HTTP, która umożliwia wiele żądań przez jedno połączenie. Zmniejsza to opóźnienie i może poprawić ogólną wydajność zadania scrapowania.
Aby sprawdzić, czy witryna obsługuje protokół HTTP/2, wystarczy otworzyć DevTools w przeglądarce, przejść do zakładki „Sieć” i poszukać kolumny „Protokół” — jeśli jest w niej h2
, witryna używa protokołu HTTP/2:
Niestety nie wszyscy klienci HTTP i biblioteki scrapingowe obsługują protokół HTTP/2. Jednak narzędzia takie jak HTTPX dla Pythona oferują pełne wsparcie dla protokołu HTTP/2 .
Web scraping to w większości zadanie związane z wejściem/wyjściem — wysyłasz żądania do serwera, czekasz na odpowiedź, przetwarzasz dane i powtarzasz. Podczas oczekiwania twój scraper jest zasadniczo bezczynny, co jest nieefektywne.
Rozwiązanie? Paralelizm czy współbieżność !
Wysyłając wiele żądań jednocześnie, możesz zminimalizować czasy bezczynności i zoptymalizować wykorzystanie sieci.
🚨 Ale bądź ostrożny! 🚨
Bombardowanie serwera zbyt wieloma równoczesnymi żądaniami może skutkować ograniczeniem przepustowości lub zablokowaniem adresu IP — są to dwa popularne środki zapobiegające scrapowaniu . 😬
Wskazówka : Możesz również równolegle wykonywać zadania analizy składniowej, zwłaszcza jeśli używasz wielu procesorów, co przyspieszy proces ekstrakcji danych. ⚡
Adaptacyjne algorytmy oparte na sztucznej inteligencji uczą się wzorców w danych i strukturach stron HTML, dostosowując swoje zachowanie w czasie rzeczywistym, aby nadążać za zmianami. 😮
To naprawdę zmienia zasady gry w scrapowaniu stron internetowych! 🤯
Gdy witryny internetowe aktualizują swój układ lub wdrażają środki ochrony przed botami, algorytmy te mogą szybko się dostosować, zapewniając płynne działanie Twojego scrapera. 🧠
Krótko mówiąc, sprawiają, że scrapery stają się inteligentniejsze, pomagając w wydajnym wyodrębnianiu danych — nawet gdy witryna rzuca nieoczekiwane wyzwania. ⚾ Dzięki adaptacyjnym algorytmom to tak, jakby scraper ewoluował w czasie!
Więcej informacji znajdziesz w rozdziale 4 tego filmu autorstwa Forresta Knighta:
Jasne, wszystkie wskazówki i triki, o których wspomnieliśmy do tej pory, mogą sprawić, że Twój scraper będzie szybszy, bardziej niezawodny, solidny i skuteczny. Ale bądźmy realistami — wprowadzają też sporo złożoności. 😅
Dobra wiadomość jest taka, że większość tych lekcji dotyczy zdecydowanej większości projektów scrapingowych. Zamiast kodować wszystko od podstaw, możesz użyć gotowych funkcji do realizacji konkretnych zadań. To właśnie oferują funkcje scrapingowe Bright Data !
Dzięki 73+ gotowym funkcjom JavaScript, użytkownicy zbudowali ponad 38 tys. scraperów działających w 195+ krajach. To ogromna moc scrapowania! 📈
Przyspiesz swój rozwój dzięki środowisku wykonawczemu zaprojektowanemu do bezproblemowego zbierania, odblokowywania i skalowania danych internetowych:
Teraz wiesz, jak udoskonalić swoje narzędzie do scrapowania, korzystając z porad doświadczonych programistów!
Pamiętaj, że to dopiero część 3, więc jesteśmy dopiero w połowie naszej sześcioczęściowej podróży do zaawansowanego scrapowania sieci! Zapnijcie pasy, bo zaraz zanurzymy się w jeszcze bardziej zaawansowanej technologii, sprytnych rozwiązaniach i poufnych wskazówkach.
Następny przystanek? Wykorzystanie mocy zarządzania proxy opartego na sztucznej inteligencji! 🌐