Wstęp do Informatyki - Wykład 14 Web scraping
Motywacja działań W wielu przypadkach chcielibyśmy mieć program, który automatycznie pobiera z Internetu różne treści, np.: informacje kontaktowe dane hoteli tekst (do analiz lingwistycznych) oceny produktów (do analiz marketingowych) ...
Python - pobranie treści strony import urllib2 response = urllib2.urlopen("http://wwsse.pl") page_source = response.read() print page_source test.py
Python - pobranie treści strony Tak pobrana strona jest przechowywana w zmiennej stringowej page_source w formie HTML. Co możemy dalej zrobić z tym tekstem? Możemy go przeszukać!
Python - co wypisze ten program? import urllib2, re response = urllib2.urlopen("http://wwsse.pl") page_source = response.read() print re.findall(r"https?://[a-z\.]+", page_source) test.py
Pobieranie danych z wielu podstron Spróbujmy czegoś innego. Wyzwanie - znaleźć jak najwięcej nazw telewizorów dostępnych na rynku. Pomysł - trzeba wykorzystać portal ceneo.pl. Wyszukajmy na nim telewizorów. Sprawdźmy, jaki adres mają poszczególne podstrony:
Pobieranie danych z wielu podstron
Pobieranie danych z wielu podstron Pobierzmy jedną podstronę i zobaczmy, gdzie szukać nazw telewizorów: import urllib2, re response = urllib2.urlopen("http://www.ceneo.pl/;szukaj-telewizor;0020-30-0-0-3.htm") page_source = response.read() print page_source test.py
Pobieranie danych z wielu podstron ... data-source-tag="">LG 43LH500T</a> </strong> wyjście
Pobieranie danych z wielu podstron Widzimy, że nazwa telewizora występuje zawsze po data-source-tag="">, a przed </a> Stwórzmy odpowiednie wyrażenie regularne:
Pobieranie danych z wielu podstron import urllib2, re response = urllib2.urlopen("http://www.ceneo.pl/;szukaj-telewizor;0020-30-0-0-3.htm") page_source = response.read() print re.findall(r'data-source-tag="">([A-Za-z0-9 ]+)</a>', page_source) test.py Funkcja findall zwróci tylko tekst “złapany” w nawiasy, bez kontekstu.
Pobieranie danych z wielu podstron Dokończmy zatem skrypt. Ściągnijmy 5 podstron, wyciągnijmy z nich nazwy telewizorów. Wyciągnięte nazwy będziemy zapisywać na liście telewizory. Na koniec, zamienimy tę listę na zbiór (set), aby pozbyć się możliwych duplikatów.
Pobieranie danych z wielu podstron - wersja końcowa import urllib2, re telewizory = [] for i in range(5): response = urllib2.urlopen("http://www.ceneo.pl/;szukaj-telewizor;0020-30-0-0-%d.htm" % i) page_source = response.read() telewizory += re.findall(r'data-source-tag="">([A-Za-z0-9 ]+)</a>', page_source) print set(telewizory) test.py
Piękna zupa
Piękna zupa
Beautiful Soup Jest to ciekawy moduł Pythonowy do parsowania HTML-a. Spójrzmy na oficjalny tutorial: https://www.crummy.com/software/BeautifulSoup/bs4/doc/
Budowanie korpusów tekstów Korzystając ze wspomnianych narzędzi możemy zbudować korpusy tekstów na potrzeby badań lingwistycznych. Przykład - CommonCrawl: http://commoncrawl.org/2016/10/september-2016-crawl-archive-now-available/
Budowanie korpusów tekstów Szczególnie cennym zasobem lingwistycznym są tzw. korpusy równoległe. Są to zbiory par zdań postaci (zdanie źródłowe, zdanie przetłumaczone). Aby skonstruować korpus równoległy można ręcznie przetłumaczyć tekst…. ...ale można też użyć metod NLP.
Budowanie korpusów tekstów Po pierwsze, należy znaleźć teksty wraz z tłumaczeniami. Gdzie ich szukać? wielojęzyczne strony internetowe, instrukcje obsługi, patenty, tłumaczenia dokumentów, ... W ten sposób uzyskujemy zbiór par dokumentów. Taki zbiór nazywa się często korpusem porównywalnym (comparable corpus).
Budowanie korpusów tekstów Następnym krokiem jest podział tekstów na zdania (segmenty), czyli proces segmentacji. Najlepiej użyć do tego splittera opartego na tzw. regułach SRX (np. https://github.com/emjotde/eserix) Otrzymujemy wtedy dwa ciągi zdań - w języku źródłowym i docelowym. Ostatnim krokiem jest tzw. urównoleglenie. Najlepsze do tego może okazać się narzędzie hunalign (http://mokk.bme.hu/en/resources/hunalign/)
Pobieranie wideo z YouTube Istnieje bardzo ciekawy moduł Pythona, który służy do pobierania filmików z popularnego serwisu YouTube. Moduł nazywa się PyTube.
Pobranie wideo z YouTube import pytube yt = pytube.YouTube("https://www.youtube.com/watch?v=J1j_4BmsqUM") video = yt.filter('mp4')[-1] video.download(r"C:\") test.py
Pobranie wideo z YouTube Funkcja filter zwraca listę filmików w zadanym formacie. Sztuczka [-1] służy do wybrania ostatniego filmiku, czyli tego w najwyższej jakości.
Dziękuję za uwagę!