Skaut czyta internet – scraping w Python bez Scrapy, pip

Internet to dobre miejsce pozyskania duużej ilości danych! Scraping w Python to bajka. Prościzna. Jako przesiadający się z Javy developer oddycham z ulgą. Tu nie muszę dbać o zgraję różnej maści BufferedReaderów które tylko czekają na moją zgubę gdy nie zamknę któregoś albo jak będę konwertował jednego w drugiego

(powyższy hejt dotyczy głównie JDK<7).

Plan architektoniczny

abstrakcja

Skaut ma odczytać fragment strony. Już ostatnio stworzyłem czytacza który czyta abstrakcyjnie tak

fabrycznie i TDD

Teraz czas na implementację tego po stronie czytacza. Na razie fabryka zwracała na sztywno statycznego czytacza który niewiele wnosi. Ale trzeba to zmienić. Fabryka musi zwracać to co przychodzi w misji. Zaimplementowałem ten krótki fragment w TDD, a co! No może takie niepełne TDD. Nie było refaktoringu 🙂 To dwa commity dowody na to:

Czytaj web!

moje rozwiązanie

Czytanie internetu w moim projekcie sprowadziło się do wykorzystania dwóch bibliotek. requests umożliwia mi wykonanie prostych żądań HTTP na endpoint a lxml dostarcza danych które parsuje z otrzymanego tekstu. Wykonanie bardzo proste, a oto one:

Czyż nie jest to piękne? Pisząc kilka linijek zrobiliśmy bardzo dużą pracę.

scrapy

Istnieje dedykowana biblioteka a nawet framework do skrobania internetu. Nazywa się scrapy. Jest super. Udostępniają nawet platformę dla twoich pająków. Ale nie chcę używać z uwagi na asynchroniczne zachowanie a także chcę by skaut był maksymalnie prosty.

Ale czy to działa?

Dobry developer nie uznaje że jest coś skończone bez testów. Nie oddaje kodu który wydaje mu się poprawny i nie świeci na czerwono w IDE! Dlatego powstał też prosty test, czytamy stronę NewYorkTimes i sprawdzamy jeden element – czy zawiera tekst który się spodziewamy.

Instalujemy z PIP

konwencje

O gdyby tak istniał Maven w Pythonie! Nie istnieje. Ale jest coś co w miarę dobrze go zastępuje. To pip. Pip instaluje się tam gdzie trzeba. W folderze twojego Pythona. Żeby zainstalować paczkę wystarczy napisać

Można też wykorzystać plik requirements.txt. Pomyśl o nim jak o ograniczonym pom.xml który zawiera zależności dla projektu. Gdy go masz instalujesz zależności które są tam komendą

trudności

Nie zawsze idzie lekko. Jak w życiu. Jeśli jesteś programistą na Windows to musisz pamiętać że w wypadku niektórych bibliotek łatwiej będzie skorzystać z prekompilowanych plików o rozszerzeniu whl. Najpotrzebniejsze znajdziesz tu, na bardzo ważnej stronie pana Gohlke. Tak właśnie trzeba zainstalować lxml. No chyba że u Ciebie działa bo VisualStudio jest grzeczny..

Podsumowanie

Plan na tydzień 11 wykonany. Kod tutaj. Pozdrawiam.

  • Raczej należy się cieszyć, że nie ma czegoś takiego jak Maven w Pythonie 😀 Swoją drogą, bardzo egzotyczny zapis:
    test_reader_givenWebResourceWithText_canReadIt
    Wygląda trochę jak Javathon 😀

    • Słuszna uwaga:) chętnie przepiszę testy w zgodzie z tym co najlepsze w pajtonie