Jeśli myślisz, że strony internetowe to tylko ładne obrazki i tekst, mam dla ciebie nowinę: one są jak cebule — wielowarstwowe i mogą sprawić, że będziesz płakać (z radości, oczywiście!), kiedy dowiesz się, ile danych można z nich wydobyć. Dziś pokopiemy w stronach HTML za pomocą biblioteki BeautifulSoup
. Przygotuj swoją wirtualną łopatę — czas kopać!
1. Analiza dokumentów HTML
Proste strony
Rozważmy kilka prostych dokumentów HTML, aby zrozumieć, z czego są zbudowane i jakie elementy mogą być interesujące dla ekstrakcji danych.
Przykład strony z wiadomością:
<html>
<head>
<title>Wiadomości</title>
</head>
<body>
<h1>Główna wiadomość dnia</h1>
<p>Dziś wydarzyło się coś ważnego!</p>
</body>
</html>
W tym przykładzie h1
zawiera nagłówek artykułu, a p
— główny tekst.
Wpływ struktury HTML na scraping
Zanim użyjesz BeautifulSoup
, ważne jest, aby zrozumieć, jak jest zorganizowany dokument HTML, który chcesz sparsować. To pozwala zidentyfikować, które części strony zawierają potrzebne dane. Na przykład, jeśli szukasz tytułu strony, zwróć uwagę na <h1>
, a do ekstrakcji listy użyj <ul>
i <li>
.
Przygotowanie do scrapingu
Przed rozpoczęciem ekstrakcji danych ważne jest, aby wyróżnić kluczowe tagi i atrybuty. Na przykład, jeśli web-developerzy sami oznaczyli dane w swojej stronie, np. używając atrybutu class="headline"
dla nagłówka, to bardzo ci pomoże. Wykorzystaj narzędzia developerskie w przeglądarce, aby przeanalizować strukturę HTML. Kliknij prawym przyciskiem myszy na elemencie i wybierz "Inspect"
(w Google Chrome).
2. Instalacja i konfiguracja bibliotek
Instalacja BeautifulSoup
i requests
Do pracy z HTML użyjemy biblioteki BeautifulSoup
. Także, aby pobierać strony HTML, przyda nam się requests
. Instalacja jest prosta i wymaga tylko kilku poleceń w konsoli:
pip install beautifulsoup4 requests
Współpraca requests z BeautifulSoup
Requests pozwala nam pobierać HTML ze strony internetowej, a BeautifulSoup
pomoże ją przeanalizować. Zobaczmy, jak to wygląda w praktyce:
import requests
from bs4 import BeautifulSoup
# Pobieramy stronę
url = 'https://example.com'
response = requests.get(url)
# Parsujemy stronę za pomocą BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
# Ekstrakcja tytułu strony
title = soup.title.text
print('Tytuł:', title)
3. Nawigacja i ekstrakcja danych za pomocą tagów
Metody nawigacji
Teraz, gdy już mamy dokument HTML, możemy użyć BeautifulSoup
do nawigacji po nim. Świetna metoda .select()
pozwala wydobywać dane, używając selektorów CSS.
Ekstrakcja danych za pomocą tagów
BeautifulSoup
udostępnia metody, które pozwalają znajdować elementy za pomocą ich tagów, takich jak find
i find_all
. Pomogą ci one znaleźć upragnione fragmenty danych:
# Znajdź pierwszy paragraf
paragraph = soup.find('p').text
print('Pierwszy paragraf:', paragraph)
# Znajdź wszystkie elementy listy
list_items = soup.find_all('li')
for item in list_items:
print('Element listy:', item.text)
Użycie atrybutów do filtrowania
Czasami trzeba będzie wydobywać elementy, które spełniają określone warunki, np. mają specyficzny class
. BeautifulSoup
pozwala zrobić to z łatwością:
# Ekstrakcja elementu o określonej klasie
headline = soup.find('h1', class_='main-headline').text
print('Nagłówek:', headline)
4. Użycie selektorów CSS
Czym są selektory CSS?
Selektory CSS to potężne narzędzie z punktu widzenia programisty Pythona, które daje możliwość ekstrakcji danych według konkretnych kryteriów. Mogą być używane do znajdowania elementów, które mają wspólny styl, co czyni scraping bardziej elastycznym i precyzyjnym.
Użycie selektorów w BeautifulSoup
BeautifulSoup
pozwala używać selektorów CSS za pomocą metody select
. Na przykład:
# Wybierz wszystkie linki
links = soup.select('a')
for link in links:
print('Link:', link['href'])
Możesz nawet łączyć selektory dla bardziej precyzyjnej selekcji. Na przykład, soup.select('div.article h2')
wybierze wszystkie h2
w div
z klasą article
.
Przykłady wyszukiwania za pomocą selektorów CSS
Zastosujmy naszą wiedzę w praktyce. Wybierz wszystkie paragrafy z klasą highlight
i wyświetl ich tekst:
# Ekstrakcja wszystkich paragrafów z klasą 'highlight'
highlighted_paragraphs = soup.select('p.highlight')
for para in highlighted_paragraphs:
print('Podświetlony paragraf:', para.text)
To na razie wszystko, nie zapomnijcie poćwiczyć swoje umiejętności scrapingu przed kolejnym spotkaniem. Powodzenia w ekscytującym świecie parsowania!
GO TO FULL VERSION