Python – #7 – Pobieranie (zeskrobywanie) danych ze stron www cz. 2

Wprowadzenie.

W części drugiej wpisu o pobieraniu danych ze stron www przedstawiłem, w jaki sposób otrzymać konkretne dane bez “ozdobników”, które mogą być już bezpośrednio użyte przy dowolnych działaniach.

Zakres artykułu.

  • Pobieranie (zeskrobywanie) danych ze stron www

Pobieranie (zeskrobywanie) danych ze stron www

Na chwilę obecną dane, które wyświetliliśmy w poprzedniej części, nie są gotowe do ich przetwarzania, ponieważ jak możemy zobaczyć, wartości opatrzone są tagami html. W związku z tym musimy tak napisać program, aby pozbyć się zbędnych elementów w kodzie.

Przyjrzyjmy się, jak aktualnie wygląda nasza odpowiedź w terminalu.

Jak możemy zobaczyć, poza tagiem table znajdują się takie tagi jak: tr, th, oraz td. Tag tr definiuje jeden rząd w tabeli. Tag th definiuje wartość pola, która nazywa poszczególne kolumny. Natomiast tag td również definiuje wartości pola, z tym że tag ten obejmuje konkretne dane. 

Moduł BeautifulSoup dostarcza nam taką metodę jak select(), która znajduje określone przez nas tagi. W wyniku, który wcześniej otrzymaliśmy, zastosujemy teraz metodę select(), gdzie będziemy chcieli znaleźć jedynie tagi th. Kod reazlizujący to zadanie wygląda następująco.

my_data1 = my_table.select('th')

Wyświetlmy teraz, co zawiera obiekt my_data1 przy pomocy następującego kodu.

print(my_data1)

Wynik, jaki powinniśmy otrzymać, wygląda następująco.

[<th>Data</th>, <th>Otwarcie</th>, <th>Max</th>, <th>Min</th>, <th>Zamknięcie</th>, <th>Wolumen</th>, <th>Obrót</th>]

Dane umieszczone są w liście, a co za tym idzie, możemy je iterować. 

for el in my_data1:
    print(el.text)

Uzyskany wynik prezentuje się teraz następująco.

Data
Otwarcie
Max
Min
Zamknięcie
Wolumen
Obrót

Intuicyjnie spodziewalibyśmy się otrzymać dane w tagach, jednakże metoda select() nie zwraca listy, a obiekt, w którym przy iterowaniu kolejnych elementów, tagi htmla są usuwane.

Identycznie postępujemy z danymi opatrzonymi tagiem td.

my_data2 = my_table.select('td')

for el in my_data2:
    print(el.text)

Niewielki fragment wyniku, jaki powinniśmy otrzymać, wygląda następująco.

23.04.2021
176.98
179.00
167.50
171.14
708 623
121 039 464
22.04.2021
175.70
176.70
172.30

W tym momencie mamy dostępne wszystkie dane jako kolejne elementy co niekoniecznie jest naszym ostatecznym celem. Z danych, które posiadamy, wyodrębnijmy datę oraz kurs na zamknięciu. W celu zrealizowania tego zadania musimy wykonać kilka dodatkowych kroków.

W pierwszej kolejności, gdy iterujemy obiekt my_data1, zliczmy liczbę kolumn.

number_of_columns = 0

for el in my_data1:
    number_of_columns += 1

print(number_of_columns)

Otrzymany wynik powinien wyglądać następująco.

7

 

W następnym kroku zmodyfikujmy pętlę, która iteruje po zmiennej my_data2, tak aby data oraz kurs na zamknięciu były umieszczane w naszych listach.

i = 0
for el in my_data2:
    i += 1
    if i == 1:
        my_date.append(el.text)
    if i == 5:
        my_closing_price.append(el.text)
    if i == number_of_columns:
        i = 0

print(my_date)
print(my_closing_price)

Otrzymany wynik wygląda następująco.

[‘23.04.2021’, ‘22.04.2021’, ‘21.04.2021’, ‘20.04.2021’, ‘19.04.2021’, ‘16.04.2021’, ‘15.04.2021’, ‘14.04.2021’, ‘13.04.2021’, ‘12.04.2021’, ‘09.04.2021’, ‘08.04.2021’, ‘07.04.2021’, ‘06.04.2021’, ‘01.04.2021’, ‘31.03.2021’, ‘30.03.2021’, ‘29.03.2021’, ‘26.03.2021’, ‘25.03.2021’, ‘24.03.2021’, ‘23.03.2021’, ‘22.03.2021’, ‘19.03.2021’, ‘18.03.2021’, ‘17.03.2021’, ‘16.03.2021’, ‘15.03.2021’, ‘12.03.2021’, ‘11.03.2021’, ‘10.03.2021’, ‘09.03.2021’, ‘08.03.2021’, ‘05.03.2021’, ‘04.03.2021’, ‘03.03.2021’, ‘02.03.2021’, ‘01.03.2021’, ‘26.02.2021’, ‘25.02.2021’, ‘24.02.2021’, ‘23.02.2021’, ‘22.02.2021’, ‘19.02.2021’, ‘18.02.2021’, ‘17.02.2021’, ‘16.02.2021’, ‘15.02.2021’, ‘12.02.2021’, ‘11.02.2021’]
[‘171.14’, ‘173.50’, ‘172.60’, ‘173.00’, ‘177.50’, ‘176.76’, ‘187.42’, ‘185.76’, ‘186.50’, ‘186.50’, ‘184.38’, ‘183.00’, ‘191.76’, ‘197.08’, ‘194.58’, ‘190.50’, ‘217.90’, ‘239.70’, ‘212.00’, ‘208.10’, ‘217.10’, ‘220.70’, ‘217.00’, ‘223.20’, ‘220.70’, ‘231.00’, ‘229.50’, ‘229.90’, ‘226.50’, ‘221.00’, ‘210.20’, ‘223.00’, ‘232.00’, ‘232.00’, ‘235.00’, ‘228.30’, ‘241.30’, ‘240.30’, ‘236.60’, ‘251.60’, ‘258.20’, ‘257.70’, ‘258.10’, ‘265.40’, ‘275.00’, ‘271.30’, ‘270.10’, ‘270.00’, ‘263.00’, ‘270.50’]

Tak przygotowane dane możemy teraz swobodnie wykorzystywać do różnych celów, jak na przykład wyświetlenie wartości na wykresie, o czym napiszę w następnym wpisie tej serii.

Na koniec zamieszczam jeszcze cały kod programu.

import requests
from bs4 import BeautifulSoup

my_url = "https://www.biznesradar.pl/notowania-historyczne/CD-PROJEKT"
my_html = requests.get(my_url)

my_soup = BeautifulSoup(my_html.text, 'html.parser')
my_table = my_soup.find_all("table", class_="qTableFull")[0]

my_data1 = my_table.select('th')
my_data2 = my_table.select('td')

number_of_columns = 0

for el in my_data1:
    number_of_columns += 1

my_date = []
my_closing_price = []

i = 0
for el in my_data2:
    i += 1
    if i == 1:
        my_date.append(el.text)
    if i == 5:
        my_closing_price.append(el.text)
    if i == number_of_columns:
        i = 0

print(my_date)
print(my_closing_price)

Autor artykułu
Dominik Bednarski

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.