1. Dynamiczna zawartość i JavaScript
Jeśli już opanowałeś podstawy web scrapingu przy użyciu bibliotek takich jak BeautifulSoup i requests, czas zanurzyć się w ciekawsze aspekty tego zajęcia. Dziś porozmawiamy o tym, jak można pracować z zawartością, która ładowana jest dynamicznie dopiero podczas przewijania strony. Twój przeglądarka może nie być jedynym fanem nieskończonych list, teraz możesz tego nauczyć także swoje skrypty! 🤖
Internet jest pełen dynamicznie ładowanych stron, gdzie zawartość aktualizuje się i pojawia dopiero po interakcji z JavaScript, który, swoją drogą, „robi magię” po stronie klienta. Może to być zarówno błogosławieństwo, jak i przekleństwo dla osoby zajmującej się web scrapingiem. Z jednej strony takie strony mogą być bardziej interaktywne i przyjazne dla użytkowników, z drugiej – zeskrobywanie takich stron staje się trudniejsze, bo biblioteka requests nie rozumie JavaScript.
2. Biblioteka requests_html
Na szczęście, jak już wiesz, na tym świecie istnieje
requests_html
— biblioteka, która łączy siłę
requests z możliwościami renderowania podobnego do przeglądarki,
zapewnianymi przez Pyppeteer. Ta biblioteka pozwala ładować i
renderować strony z dynamiczną zawartością, dając możliwość
wykonywania JavaScript, a nawet przewijania stron.
Instalacja requests_html
Aby rozpocząć pracę, musisz zainstalować bibliotekę. Jeśli tego jeszcze nie zrobiłeś, wykonaj komendę:
pip install requests-html
Praca z requests_html
Po zainstalowaniu, przeanalizujmy, jak można używać
requests_html
do ładowania i pracy z dynamiczną
zawartością.
Przykład: Ładowanie i renderowanie strony
Zacznijmy od prostego przypadku: ładowania strony, wykonywania JavaScript i wyodrębniania danych. Rozważmy przykład, w którym ładujemy stronę i otrzymujemy tekst elementu, który pojawia się dopiero po wykonaniu JavaScript.
from requests_html import HTMLSession
# Tworzymy sesję
session = HTMLSession()
# Ładujemy stronę
response = session.get('https://example.com/dynamic-page')
# Wykonujemy JavaScript w celu renderowania strony
response.html.render()
# Wyodrębniamy tekst elementu pojawiającego się po renderowaniu
content = response.html.find('#dynamic-content', first=True)
print(content.text)
W tym przykładzie używamy metody render()
,
aby pozwolić requests_html
wykonać JavaScript na
stronie i renderować zawartość, która może być ukryta
przed standardowym ładowaniem.
3. Automatyczne przewijanie stron
Czasami dynamiczna zawartość nie ładuje się od razu, lecz
pojawia się dopiero podczas przewijania strony. requests_html
może pomóc i tutaj, umożliwiając symulację przewijania strony i
ładowanie większej ilości danych.
Przykład automatycznego przewijania
Załóżmy, że masz stronę z nieskończoną listą wiadomości i chcesz wyodrębnić jak najwięcej elementów. Oto jak można to zrobić:
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://example.com/infinite-scroll')
# Renderujemy i przewijamy stronę
response.html.render(scrolldown=5, sleep=1)
# Wyodrębniamy wszystkie elementy wiadomości
news_items = response.html.find('.news-item')
for news_item in news_items:
print(news_item.text)
Tutaj metoda render()
została uzupełniona o
parametry scrolldown
i sleep
, które
określają, ile razy przewiniemy stronę w dół i jak długo poczekamy
między przewinięciami.
4. Praktyczne zastosowanie
Dlaczego w ogóle warto zajmować się czymś takim jak automatyczne przewijanie? 🤔
- Badania marketingowe: Wiele firm używa takich stron do ciągłego wyświetlania danych, które mogą być przydatne do analizy trendów i zachowań konsumentów.
-
Monitorowanie mediów społecznościowych: Wiele platform
społecznościowych używa nieskończonych list, co czyni
requests_html
przydatnym narzędziem do monitorowania i zbierania danych z takich źródeł. - Wiadomości i aktualizacje: Wyodrębnianie nagłówków wiadomości i artykułów z nieskończonych list na stronach informacyjnych pozwala na uzyskanie szybkiej informacji do analizy.
5. Typowe błędy i ich rozwiązania
Podczas pracy z dynamicznymi stronami i requests_html często mogą pojawiać się błędy. Rozważmy kilka najczęstszych:
Problem z renderowaniem
Czasem metoda render()
może nie zakończyć się
powodzeniem, szczególnie jeśli strona jest zbyt duża lub
skomplikowana. W takich przypadkach pomaga zwiększenie czasu
renderowania za pomocą parametru timeout
, lub
zmniejszenie liczby przewinięć.
response.html.render(timeout=30)
Niechciane wykonanie skryptu
Mogą zdarzyć się sytuacje, gdy JavaScript na stronie blokuje
wykonanie skryptu lub powoduje problemy. Możesz spróbować
użyć parametru wait
, aby poczekać na pojawienie
się potrzebnych elementów.
response.html.render(wait=2)
Rozdzielczość ekranu i rodzaj urządzenia
Niektóre strony mogą udostępniać zawartość w zależności od rozdzielczości ekranu lub rodzaju urządzenia. Sprawdź, z jakim user-agent wykonywane jest żądanie i jak zawartość jest renderowana.
response.session.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'
6. Co jeszcze przeczytać
requests_html
— potężne narzędzie, ale aby w pełni
wykorzystać jego możliwości i unikać typowych błędów,
zapoznaj się z
oficjalną dokumentacją. Pomoże ona lepiej zrozumieć,
jak można zarządzać przewijaniem i skutecznie renderować
skomplikowane strony.
W tym momencie masz już wszystko, co potrzebne, by nie bać się dynamicznej zawartości i nieskończonych list. Uważaj, nie zapomnij zaznaczyć, że Twój skrypt to biały haker, lubiący pomagać ludziom automatyzować ich zadania, a nie złośliwiec! 😇
GO TO FULL VERSION