Przejdź do treści
Web scraping z AI: jak zbierać dane ze stron w Pythonie z pomocą LLMModuł 1 · lekcja 1 z 4
Za darmo4 min czytania

Moduł 1 · Podstawy web scrapingu i środowisko pracy

Jak działa strona: HTTP, HTML i drzewo DOM

Po tej lekcji wyjaśnisz, co dzieje się między Twoim skryptem a serwerem, gdy pobierasz stronę, i odczytasz z kodu HTML miejsce, w którym leżą potrzebne dane. Aktualne na: październik 2026.

Przez cały kurs pracujesz na fikcyjnym sklepie internetowym Palarnia Ziarenko z Krakowa. Jego kopię uruchomisz na własnym komputerze (pliki z modułu 1), więc możesz ćwiczyć bez obciążania cudzych serwerów. Ceny są w złotych, a strona ma celowo wbudowane pułapki, które spotkasz w prawdziwych serwisach: brak ceny, twardą spację w „1 249,00 zł”, link bezwzględny zamiast względnego i treść ładowaną skryptem.

Żądanie i odpowiedź HTTP

Web scraping to automatyczne pobieranie stron i wyciąganie z nich danych. Każde pobranie strony to rozmowa według protokołu HTTP: Twój program wysyła żądanie, serwer odsyła odpowiedź. Żądanie składa się z metody (najczęściej GET, czyli „daj mi zasób”), adresu, nagłówków i czasem treści. Odpowiedź ma kod statusu, nagłówki i treść, na przykład dokument HTML albo JSON.

HTTP
GET /kawa/strona-1.html HTTP/1.1 Host: 127.0.0.1:8000 User-Agent: ZiarenkoKursBot/1.0 (kontakt: twoj-adres@example.com) Accept: text/html HTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/3.12.3 Content-type: text/html Content-Length: 3661

Powyżej masz prawdziwą odpowiedź serwera ćwiczeń (moduł http.server z biblioteki standardowej Pythona), skróconą o datę.

Nagłówki niosą informacje, które szybko okażą się ważne. User-Agent mówi serwerowi, kto pyta. Dobra praktyka to przedstawić się nazwą bota i kontaktem do siebie, a nie udawać przeglądarki. Content-Type mówi, w jakim formacie i kodowaniu jest odpowiedź. Serwer ćwiczeń podaje samo text/html bez informacji o kodowaniu i w lekcji 1.4 zobaczysz, jak to psuje polskie znaki.

Kody statusu, które scraper musi rozumieć, zgodnie z RFC 9110 (semantyka HTTP) i RFC 6585 (kod 429):

Kody odpowiedzi HTTP i reakcja scrapera

Źródło: RFC 9110 i RFC 6585. Szczegóły reakcji w module 6.

Zwróć uwagę na 403 i 429. To nie są przeszkody do „obejścia”, tylko sygnały od właściciela serwera. W module 6 nauczysz się na nie odpowiadać tak, żeby Twój scraper był przewidywalny i nie szkodził serwisowi.

HTML: gdzie leżą dane

Przeglądarka zamienia HTML w wygląd strony. Scraper czyta ten sam HTML, ale interesuje go struktura. Oto karta jednego produktu ze sklepu ćwiczeń:

HTML
<article class="produkt" data-sku="ZK-001" data-kategoria="kawa"> <h2 class="nazwa"><a href="/produkt/zk-001.html">Brazylia Santos 250 g</a></h2> <p class="cena"><span class="cena-stara">49,00 zł</span> <span class="cena-aktualna">42,90 zł</span></p> <p class="dostepnosc" data-stan="12">Dostępny</p> <div class="ocena" data-ocena="4.6">Ocena 4,6 (23 opinii)</div> </article>

Znacznik (tag) to nazwa w nawiasach ostrych, na przykład article, h2, span. Atrybuty dopisują informacje: class grupuje elementy o podobnej roli, id powinien być jeden na stronie, href to adres linku, a atrybuty data-* to własne dane twórców strony. Atrybuty data-* są często najlepszym źródłem: data-stan="12" daje liczbę sztuk bez parsowania słowa „Dostępny”, a data-ocena="4.6" liczbę z kropką zamiast tekstu „Ocena 4,6”.

Dobra zasada: zanim napiszesz selektor, otwórz stronę w przeglądarce, kliknij prawym przyciskiem na cenę i wybierz „Zbadaj” (narzędzia deweloperskie). Zobaczysz element w drzewie i jego klasy. Szukaj klas, które opisują znaczenie (cena-aktualna), a nie wygląd (text-red-500), bo te drugie zmieniają się przy każdym odświeżeniu szablonu.

Drzewo DOM i selektory CSS

Przeglądarka i biblioteki do parsowania budują z HTML drzewo DOM (Document Object Model). Każdy element ma rodzica, dzieci i rodzeństwo: article jest rodzicem h2, a h2 i p.cena są rodzeństwem. Po tym drzewie poruszasz się w kodzie, a elementy wskazujesz selektorami CSS, tymi samymi, których używają projektanci stron.

Selektory CSS na karcie produktu

Selektory sprawdzone na stronie ćwiczeń Palarni Ziarenko.

Najczęstsze formy selektorów: div.produkt (znacznik z klasą), #koszyk (identyfikator), article > h2 (bezpośrednie dziecko), article h2 (potomek na dowolnym poziomie), a[href] (element z atrybutem), p[data-stan="0"] (atrybut o konkretnej wartości). Pseudoklasa :has() wybiera rodzica, który zawiera dany element. BeautifulSoup obsługuje ją przez bibliotekę Soup Sieve, więc w module 2 jednym selektorem wybierzesz wszystkie produkty w promocji.

Na koniec ważna obserwacja: nie każda strona ma dane w HTML wysłanym przez serwer. Strona „Nowości” sklepu ćwiczeń przychodzi z pustą listą, a produkty dorysowuje skrypt JavaScript, który pobiera plik JSON. Zwykłe pobranie przez Pythona zobaczy tylko napis „Ładowanie…”. Takimi stronami zajmiesz się w module 3, a w lekcji 3.4 nauczysz się sięgać od razu po ten JSON.

Najważniejsze w 3 punktach

  1. Każde pobranie strony to żądanie i odpowiedź HTTP; kod statusu mówi, co zrobić dalej, a 403 i 429 to sygnały do zatrzymania lub zwolnienia.
  2. Dane leżą w drzewie DOM: wskazujesz je selektorami CSS, najlepiej po klasach opisujących znaczenie i po atrybutach data-*.
  3. Część stron dorysowuje treść skryptem, więc zanim napiszesz parser, sprawdź, czy dane są w HTML wysłanym przez serwer.

Źródła

Materiały do pobrania

Pliki do ćwiczeń są dostępne w abonamencie.

  • Strona ćwiczeń Palarnia Ziarenko, robots.txt i pierwszy scraperModuł 1: requirements.txt (wersje z 10.2026), sprawdz_srodowisko.py, porównanie parserów robots.txt, pierwszy_scraper.py z rozwiązaniem33 KBDostępne w abonamencie
  • Parsowanie HTML: selektory, tabele, ceny w DecimalModuł 2: ćwiczenia 2.1-2.3 z testami pytest, parser_ziarenko.py z lekcji 2.4, zapisane strony sklepu34 KBDostępne w abonamencie
  • Playwright: formularz, treść ładowana skryptem, przechwytywanie JSONModuł 3: formularz.py, nowosci_playwright.py, podsluch_sieci.py ze śladem, api_bez_przegladarki.py, testy33 KBDostępne w abonamencie
  • Projekt Scrapy: spider, potoki, middleware, eksportModuł 4: projekt ziarenko (Scrapy 2.19) z zapisem JSON, CSV i SQLite oraz testami parsera bez sieci34 KBDostępne w abonamencie
  • Ekstrakcja ofert z LLM: Pydantic, Claude i OpenAI przez atrapęModuł 5: 8 opisów ofert hurtowych, schemat Oferta, atrapa API bez klucza, kalkulator kosztów, skracanie HTML38 KBDostępne w abonamencie
  • Grzeczny klient: robots.txt, Retry-After, ETagModuł 6: serwer ćwiczeń z limitem 429 i 503, grzeczny_klient.py, testy34 KBDostępne w abonamencie
  • Projekt końcowy: monitoring cen i raport marżyModuł 7: pipeline.py (pobieranie, kontrola jakości, SQLite, zmiany cen, raport), 3 wersje sklepu i test całości100 KBDostępne w abonamencie

Następna: Środowisko Pythona i biblioteki do scrapingu

25 lekcji, pliki i certyfikat w abonamencie.

Program kursu

Karta wymagana · anulujesz jednym kliknięciem · Mam już konto