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/
Facebook Comments