Ekstrakcja danych ze stron internetowych, znana jako web scraping, to proces pozyskiwania informacji z witryn internetowych w celu wykorzystania ich w konkretnych zastosowaniach.
Wyobraź sobie sytuację, w której chcesz pobrać tabelę z danej strony, przekonwertować ją do formatu JSON, a następnie wykorzystać ten plik do budowy wewnętrznych narzędzi. Web scraping umożliwia pozyskiwanie potrzebnych danych poprzez precyzyjne kierowanie na określone elementy strony. Szczególnie popularne jest wykorzystanie Pythona do tego celu, ze względu na dostępność bibliotek takich jak BeautifulSoup czy Scrapy, które efektywnie wspomagają proces ekstrakcji.
Dla programistów i specjalistów data science umiejętność efektywnego wydobywania danych jest niezwykle istotna. Ten artykuł ma na celu wyjaśnienie, jak skutecznie przeprowadzić web scraping i pozyskać treść niezbędną do dalszej manipulacji. W naszym samouczku skupimy się na pakiecie BeautifulSoup, cenionym w Pythonie narzędziu do scrapingu danych.
Dlaczego Python jest dobrym wyborem do Web Scrapingu?
Python jest często pierwszym wyborem programistów przy tworzeniu skrypterów do zbierania danych ze stron internetowych. Istnieje wiele przyczyn tej popularności, ale w tym artykule omówimy trzy główne argumenty przemawiające za użyciem Pythona w tej dziedzinie.
Wsparcie biblioteczne i społeczność: Dostępność znakomitych bibliotek, takich jak BeautifulSoup, Scrapy czy Selenium, oferuje szeroki zakres funkcji ułatwiających efektywny scraping. Python zbudował silny ekosystem wspierający tę dziedzinę, a dzięki dużej liczbie programistów korzystających z tego języka, szybka pomoc w przypadku problemów jest łatwo dostępna.
Automatyzacja procesów: Python słynie ze swojej zdolności do automatyzacji różnorodnych zadań. Jeśli chcesz stworzyć zaawansowane narzędzie oparte na skrobanym danych, samo pobieranie treści ze stron to za mało. Na przykład, aplikacja monitorująca ceny produktów w sklepach internetowych musi mieć możliwość codziennego śledzenia zmian i zapisywania ich w bazie danych. Python umożliwia prostą automatyzację takich procedur.
Wizualizacja danych: Web scraping jest często wykorzystywany przez specjalistów data science. Analitycy danych regularnie potrzebują pobierać dane ze stron internetowych, a biblioteki takie jak Pandas ułatwiają wizualizację danych, pochodzących z nieprzetworzonych źródeł.
Biblioteki Pythona do Web Scrapingu
Python oferuje bogaty wybór bibliotek, które ułatwiają przeglądanie stron internetowych. Skupimy się na trzech najczęściej wybieranych.
# 1. BeautifulSoup
Jedna z najbardziej popularnych bibliotek do web scrapingu. BeautifulSoup od 2004 roku pomaga programistom w poruszaniu się po stronach internetowych. Umożliwia prostą nawigację, wyszukiwanie i modyfikację drzewa analizy. Dodatkowo, BeautifulSoup dba o kodowanie przychodzących i wychodzących danych. Jest stale rozwijana i ma aktywne wsparcie społeczności.
#2. Scrapy
Kolejny ceniony framework do ekstrakcji danych. Scrapy ma ponad 43 000 gwiazdek na platformie GitHub. Może być również wykorzystywany do pozyskiwania danych z API. Posiada wbudowane funkcje wsparcia, takie jak wysyłanie powiadomień e-mail.
#3. Selenium
Selenium to nie tylko biblioteka do web scrapingu, ale przede wszystkim pakiet do automatyzacji przeglądarek internetowych. Możemy jednak rozszerzyć jego funkcjonalność o scraping. Wykorzystuje protokół WebDriver do zarządzania różnymi przeglądarkami. Selenium jest dostępne na rynku od blisko 20 lat, a dzięki niemu możemy automatycznie pozyskiwać dane ze stron.
Potencjalne Wyzwania podczas Web Scrapingu z wykorzystaniem Pythona
Podczas prób zbierania danych ze stron internetowych można napotkać szereg trudności. Do najczęstszych problemów należą: niska prędkość sieci, narzędzia anty-scrapingowe, blokady oparte na adresie IP oraz zabezpieczenia captcha. Te kwestie mogą utrudnić proces zbierania danych.
Można skutecznie ominąć te przeszkody stosując odpowiednie techniki. Przykładowo, blokada IP jest często aktywowana, gdy strona internetowa odnotowuje zbyt dużą liczbę zapytań z danego adresu w krótkim czasie. Aby uniknąć blokady IP, warto zaprogramować scrapera tak, aby po wysłaniu zapytań odczekał pewien czas.
Twórcy stron internetowych mogą również umieszczać pułapki na skrypty. Te pułapki, niewidoczne dla ludzkiego oka, mogą zostać aktywowane przez skrobaki. Jeśli strona, z której pobierasz dane, używa takiej pułapki, musisz odpowiednio dostosować kod swojego scrapera.
Captcha to kolejny problem w kontekście scrapingu. Obecnie wiele stron internetowych stosuje mechanizmy captcha, aby chronić się przed botami. W takiej sytuacji konieczne może być wykorzystanie rozwiązań do omijania captcha.
Skrobanie strony internetowej w Pythonie
Jak wspomniano wcześniej, do scrapowania strony użyjemy biblioteki BeautifulSoup. W tym samouczku pobierzemy historyczne dane Ethereum z serwisu Coingecko i zapiszemy je w formie pliku JSON. Przejdźmy do budowy skrobaka.
Pierwszym krokiem jest instalacja BeautifulSoup i Requests. W tym samouczku użyjemy Pipenv – menedżera środowisk wirtualnych dla Pythona. Możesz również użyć Venv, jeśli wolisz, ale my zalecamy Pipenv. Szczegółowe omówienie Pipenv wykracza poza zakres tego artykułu. Jeśli chcesz dowiedzieć się więcej o Pipenv, skorzystaj z tego przewodnika. Alternatywnie, jeśli interesuje Cię zagadnienie środowisk wirtualnych, ten przewodnik będzie pomocny.
Uruchom powłokę Pipenv w katalogu projektu, wpisując komendę pipenv shell. Otworzy to podpowłokę w Twoim środowisku wirtualnym. Aby zainstalować BeautifulSoup, użyj poniższego polecenia:
pipenv install beautifulsoup4
Aby zainstalować Requests, użyj podobnego polecenia:
pipenv install requests
Po zakończeniu instalacji, zaimportuj niezbędne biblioteki do głównego pliku. Utwórz plik o nazwie main.py i dodaj następujący kod importujący:
from bs4 import BeautifulSoup import requests import json
Kolejnym krokiem jest pobranie zawartości strony z danymi historycznymi i przeanalizowanie jej za pomocą parsera HTML dostępnego w BeautifulSoup.
r = requests.get('https://www.coingecko.com/en/coins/ethereum/historical_data#panel') soup = BeautifulSoup(r.content, 'html.parser')
W powyższym kodzie uzyskujemy dostęp do strony za pomocą metody get z biblioteki requests. Następnie, przeanalizowana zawartość jest przechowywana w zmiennej zupa.
Teraz przechodzimy do sedna procesu scrapingu. Najpierw musimy precyzyjnie zlokalizować tabelę w DOM. Po otwarciu strony i zbadaniu jej za pomocą narzędzi programistycznych w przeglądarce, zauważymy, że tabela ma klasy: table, table-striped, text-sm, text-lg-normal.
Tabela danych historycznych Coingecko Ethereum
Aby wybrać konkretną tabelę, użyjemy metody find.
table = soup.find('table', attrs={'class': 'table table-striped text-sm text-lg-normal'}) table_data = table.find_all('tr') table_headings = [] for th in table_data[0].find_all('th'): table_headings.append(th.text)
W powyższym kodzie, najpierw wyszukujemy tabelę za pomocą metody soup.find, a następnie za pomocą metody find_all wyszukujemy wszystkie elementy tr wewnątrz tabeli. Te elementy są przechowywane w zmiennej table_data. Tabela zawiera nagłówki. Nowa zmienna o nazwie table_headings będzie przechowywać te nagłówki.
Następnie uruchamiana jest pętla for, która przechodzi przez pierwszy wiersz tabeli. W tym wierszu wyszukujemy wszystkie elementy th, a ich wartości tekstowe dodajemy do listy table_headings. Tekst jest wyodrębniany za pomocą metody text. Jeśli teraz wyświetlimy zmienną table_headings, zobaczymy następujący wynik:
['Date', 'Market Cap', 'Volume', 'Open', 'Close']
Kolejnym krokiem jest wyodrębnienie pozostałych elementów, stworzenie słownika dla każdego wiersza i dodanie go do listy.
for tr in table_data: th = tr.find_all('th') td = tr.find_all('td') data = {} for i in range(len(td)): data.update({table_headings[0]: th[0].text}) data.update({table_headings[i+1]: td[i].text.replace('n', '')}) if data.__len__() > 0: table_details.append(data)
To jest kluczowa część kodu. Dla każdego tr w zmiennej table_data najpierw wyszukiwane są elementy th. Elementem th jest data przedstawiona w tabeli i jest przechowywana w zmiennej th. Podobnie, wszystkie elementy td są przechowywane w zmiennej td.
Następnie inicjowany jest pusty słownik. Po inicjalizacji, przechodzimy przez wszystkie elementy td. Dla każdego wiersza, pierwsze pole słownika jest aktualizowane pierwszym elementem th. Kod `table_headings[0]: th[0].text` przypisuje parę klucz-wartość data i pierwszy element.
Po zainicjowaniu pierwszego elementu, pozostałe elementy są przypisywane za pomocą `data.update({table_headings[i+1]: td[i].text.replace(’n’, )})`. W tym miejscu tekst elementów td jest wyodrębniany, a następnie wszystkie znaki „n” są zastępowane. Wartość ta jest przypisywana do i+1 elementu listy table_headings, ponieważ element i-ty został już przypisany.
Na koniec, jeśli długość słownika danych przekracza zero, dołączamy słownik do listy table_details. Możesz wyświetlić zawartość listy table_details, aby sprawdzić jej zawartość, ale my zapiszemy wartości w pliku JSON. Spójrzmy na ten kod:
with open('table.json', 'w') as f: json.dump(table_details, f, indent=2) print('Data saved to json file...')
Używamy metody json.dump, aby zapisać dane do pliku JSON o nazwie table.json. Po zakończeniu zapisywania, na konsoli wyświetla się komunikat „Data saved to json file…”.
Teraz uruchom plik, wpisując następujące polecenie:
python run main.py
Po chwili, w konsoli pojawi się tekst „Data saved to json file…”. W katalogu roboczym pojawi się nowy plik o nazwie table.json. Jego zawartość będzie zbliżona do poniższego przykładu:
[ { "Date": "2022-11-27", "Market Cap": "$145,222,050,633", "Volume": "$5,271,100,860", "Open": "$1,205.66", "Close": "N/A" }, { "Date": "2022-11-26", "Market Cap": "$144,810,246,845", "Volume": "$5,823,202,533", "Open": "$1,198.98", "Close": "$1,205.66" }, { "Date": "2022-11-25", "Market Cap": "$145,091,739,838", "Volume": "$6,955,523,718", "Open": "$1,204.21", "Close": "$1,198.98" }, // ... // ... ]
Udało Ci się pomyślnie zaimplementować narzędzie do web scrapingu w Pythonie. Pełny kod znajduje się w tym repozytorium GitHub.
Podsumowanie
W tym artykule omówiliśmy, jak zaimplementować podstawowe skrobanie stron internetowych za pomocą Pythona. Pokazaliśmy, jak można użyć biblioteki BeautifulSoup, aby szybko pobrać dane ze strony internetowej. Przybliżyliśmy również inne dostępne biblioteki i wyjaśniliśmy, dlaczego Python jest często wybierany przez programistów do tego celu.
Zachęcamy do zapoznania się z innymi frameworkami do web scrapingu.
newsblog.pl