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_htmlprzydatnym 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