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. Wymagane pola są oznaczone *