W internecie znajduje się nieskończona ilość portali i danych. Istnieje też możliwość automatycznego ściągania tych danych z użyciem prostych działań i to właśnie poznamy w tym artykule.

Przed rozpoczęciem tego przykładu warto spojrzeć na wcześniejsze artykuły z działu Python, między innymi

http://analityk.edu.pl/python-requests-biblioteka-do-wykonywania-zapytan-http/
http://analityk.edu.pl/python-pandas/

Zacznijmy od wczytania niezbędnych bibliotek:

import requests
from bs4 import BeautifulSoup
import pandas as pd

Załóżmy, że zależy nam na codziennym ściąganiu danych o produkcji firmy Tesla INC ze strony wikipedia do tabeli i sprawdzania czy nastąpiły zmiany.

Pierwszym krokiem będzie ściągniecie strony html

start_url = "https://en.wikipedia.org/wiki/Tesla,_Inc."
download_html = requests.get(start_url)

następnym krokiem jest zapisanie ściągniętej strony w pliku „downloaded.html” oraz przygotowanie do przetwarzania

soup = BeautifulSoup(download_html.text)
with open('downloaded.html', 'w', encoding="utf-8") as file:
    file.write(soup.prettify())

strony internetowe złożone są z konstrukcji HTML oraz tagów określających funkcję obiektów na stronie. Jednym z takich tagów są tagi określające tabele. Badając stronę Wikipedii, możemy znaleźć tzw. selektor który pozwala nam na identyfikację tabeli

Kliknij na tabeli prawym przyciskiem myszy oraz wybierz opcje „zbadaj element”

full_table = soup.select('table.wikitable tbody')[0]
print(full_table)

Widzimy, że nadal ściągnięte przez nas dane nie są czytelne, w tym celu możemy wykonać kilkę dodatkowych aktywności

Skupmy się na kolejnych tagach. Widzimy, że struktura table zbudowana jest z części „tr th” określających kolejne kolumny

table_head = full_table.select('tr th')
#print(table_head)

print("--------------")
for element in table_head:
    print(element.text)

Jesteśmy coraz bliżej czytelnych i sformatowanych danych, brakuje tylko ostatnich poprawek. W tym celu zamiast połączonych słów stworzymy nazwy podzielone „_” oraz usuniemy elementy [b] oraz [c] z nazw kolumn, które nie są potrzebne wykorzystując metodę moduł regex ( opisany w oddzielnym artykule)

import re
regex = re.compile('_\[\w\]')

table_columns = []
for element in table_head:
    column_label = element.get_text(separator=" ", strip=True)
    column_label = column_label.replace(' ', '_')
    column_label = regex.sub('', column_label)
    table_columns.append(column_label)
    print(column_label)
    
print('-------------')
print(table_columns)

Ostatnim elementem będzie przypisanie wartości danych do odpowiednich kolumn. Iterując znaną już pętlą for przez kolejne wiersze, czyli tag <tr> w języku strony HTML

table_rows = full_table.select('tr')

table_data = []
for index, element in enumerate(table_rows):
    if index > 0:
        row_list = []
        values = element.select('td')
        for value in values:
            row_list.append(value.text.strip())
        table_data.append(row_list)

print(table_data)

Jesteśmy już gotowi wyświetlić całą ściągniętą tabelę korzystając z biblioteki Pandas i dokonując dowolne działania i analizę

df = pd.DataFrame(table_data, columns=table_columns)
df

Podsumowując

Dzięki połączeniu takich bibliotek i działań jak request do ściągnięcia zawartości strony, BeautifulSoup do wyszukiwania oraz formatowania danych oraz biblioteki Pandas do stworzenia konstrukcji tabeli gotowej do analizy jesteśmy w stanie zautomatyzować ściąganie oraz przygotowanie danych w sposób regularny bez ingerencji pracy manualnej.

Rozwinięcie tego wątku znaleźć można poniżej:

https://analityk.edu.pl/web-scraping-z-uzyciem-biblioteki-scrapy-w-pythonie/