{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n", "
\n", "

Ekstrakcja informacji

\n", "

2. Wyszukiwarki roboty [ćwiczenia]

\n", "

Jakub Pokrywka (2021)

\n", "
\n", "\n", "![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Wyszukiwarki roboty" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Zadanie\n", "\n", "Opracować w języku Haskell wyspecjalizowanego robota pobierającego dane z konkretnego serwisu.\n", "\n", "Punkty: 80 (domyślnie - niektóre zadanie są trudniejsze, wówczas ich ilość podana jest przy zadaniu)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ogólne zasady:\n", "- pobieramy informacje (metadane) o plikach PDF, DjVU, JPG itp, ale nie same pliki,\n", "- nie pobierajmy całego serwisu, tylko tyle, ile trzeba, by pobrać metadane o interesujących nas zasobach,\n", "- interesują nas tylko teksty polskie, jeśli nie jest to trudne, należy odfiltrować publikacje obcojęzyczne,\n", "- staramy się ustalać datę z możliwie dużą dokładnością." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Instrukcja" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 0. Haskell Stack\n", "\n", "Pobrać Haskell Stack\n", "\n", " curl -sSL https://get.haskellstack.org/ | sh -s - -d ~/bin\n", "\n", "\n", "##### Problemy z fizycznymi komputerami wydziałowymi\n", "Na fizycznych komputerach wydziałowych są błędnie ustawione prawa dostępu na dyskach sieciowych, Haskell Stack musi działać na fizycznym dysku:\n", "\n", " rm -rf /mnt/poligon/.stack\n", " mkdir /mnt/poligon/.stack\n", " mv ~/.stack ~/.stack-bak # gdyby już był... proszę się nie przejmować błędem\n", " ln -s /mnt/poligon/.stack ~/.stack" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Repozytorium z przykładowym rozwiązeniem\n", "\n", "Zrobienie forka repozytorium https://git.wmi.amu.edu.pl/filipg/twilight-library.git\n", "\n", "\n", "![forkowanie repo](./obrazki/02-fork.png)\n", "\n", "Sklonowanie sforkowanego repozytorium na komputer\n", "\n", "![sklonowanie repo](./obrazki/02-fork-clone.png)\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Sprawdzenie czy przykładowy robot działa \n", "\n", "\n", "W katalogu projektu należy odpalić:\n", "\n", " stack install # może trwać długo za pierwszym razem\n", " stack exec almanachmuszyny\n", "\n", "Jeżeli instalacja nie powiedzie się, być może należy zainstalować paczki libpcre3 libpcre3-dev , np. na ubuntu:\n", "\n", " sudo apt install libpcre3 libpcre3-dev\n", " \n", " \n", " \n", "### Metoda opracowania robota z przykładu:\n", "\n", "##### Znalezienie wyszystkich stron z rocznikami:\n", "\n", "W przeglądarce należy znaleźć wszystkie linki do stron z rocznikami. Najłatwiej zrobić to przez podejrzenie źródła strony. Na przykład można kliknąć prawym przyciskiem myszy na link i wybrac \"Inspect Element\" (działa na chrome).\n", "\n", "![inspect](./obrazki/02-inspect.png)\n", "\n", "\n", "Łatwo zauważyć, że wszystkie linki mają klasę \"roczniki\". Dlatego należy odwołać sie w robocie do tej klasy poprzez xpath w pliku app/almanachmuszyny.hs :\n", "\n", " extractRecords = extractLinksWithText \"//a[@class='roczniki']\" -- pary adres-tytuł \n", " \n", "Następna linijka kodu służy oczyszczeniu stringa z tytułem rocznika:\n", "\n", " >>> second (arr $ replace \"\\r\\n \" \" \")\n", "\n", "\n", "Następnie, łatwo zauważyć, że robiąc prostą manipulację linkiem z :\n", "\n", "http://www.almanachmuszyny.pl/index.php?p=spisy/95s\n", "\n", "na \n", "\n", "http://www.almanachmuszyny.pl/index.php?p=spisy/95tr\n", "\n", "dostajemy stronę spis-treści ze wszystkimi pdf-ami. Dlatego robimy podmianę linku:\n", "\n", " >>> first (arr ((++\"tr\") . init)) -- modyfikujemy pierwszy element pary, czyli adres URL\n", " \n", " \n", "Nastęnie ze wszystkich podanych stron ze spisem treści wybieramy wszystkie pdfy korzystając z polecenia:\n", "\n", " >>> first (extractLinksWithText \"//li/a[contains(@href,'.pdf')]\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Opracowanie swojego robota\n", "\n", "Opracuj swojego robota wzorując się na pliku almanachmuszyny.hs. (Ale dodaj swój plik, nie zmieniaj almanachmuszyny.hs!)\n", "Twój robot powinien działać na serwisie wybranym z listy na którą należy się zapisać (na dole tej strony).\n", "\n", "Dopisz specyfikację swojego robota do shadow-library.cabal.\n", "\n", "Pracuj nad swoim robotem, uruchamiaj go w następujący sposób:\n", "\n", " stack build\n", " stack exec mojrobot\n", " \n", "mojrobot to przykładowa nazwa- dla swojego projektu użyj innej, znaczącej nazwy\n", "\n", "Jeśli publikacja (np. pojedynczy numer gazety) składa się z wielu plików, powinien zostać wygenerowany jeden rekord, w finalUrl powinny znaleźć się URL do poszczególnych stron (np. plików JPR) oddzielone //.\n", "\n", "Dla twojego robota przydatne mogą być funkcje zdefiniowane w ShadowLibrary/Core.hs\n", "\n", "\n", "\n", "##### Problemy z https\n", "\n", "W przypadku problemów z https:\n", "\n", "Trzeba użyć modułu opartego na bibliotece curl. Paczka Ubuntu została zainstalowana na komputerach wydziałowych. Na swoim komputerze możemy zainstalować paczkę libcurl4-openssl-dev, a\n", "następnie można sobie ściągnąć wersję twilight-library opartą na libcurl:\n", "\n", " git fetch git://gonito.net/twilight-library withcurl\n", " git merge FETCH_HEAD\n", " \n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Zgłoszenie zadań\n", "\n", "Po opracowaniu robota oddaj zadanie korzystając z panelu MS TEAMS assigments umieszczając jako rozwiązanie link do twojego repozytorium." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Lista serwisów do wyboru" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Na serwis należy zapisywać się korzystając z linka do google doc podanego na ćwiczeniach\n", "\n", "Lista serwisów do wyboru (na każdy serwis 1 osoba):\n", "\n", "1. [Teksty Drugie](http://tekstydrugie.pl)\n", "2. [Archiwum Inspektora Pracy](https://www.pip.gov.pl/pl/inspektor-pracy/66546,archiwum-inspektora-pracy-.html)\n", "3. [Medycyna Weterynaryjna](http://www.medycynawet.edu.pl/archives) — również historyczne zasoby od 1945 roku, **120 punktów**\n", "4. [Polskie Towarzystwo Botaniczne](https://pbsociety.org.pl/default/dzialalnosc-wydawnicza/) — wszystkie dostępne zdigitalizowane publikacje!, **130 punktow**\n", "5. [Czasopisma polonijne we Francji](https://argonnaute.parisnanterre.fr/ark:/14707/a011403267917yQQFAS) — najlepiej w postaci PDF-ów, jak [przykład](https://argonnaute.parisnanterre.fr/medias/customer_3/periodique/immi_pol_lotmz1_pdf/BDIC_GFP_2929_1945_039.pdf), **220 punktów**\n", "6. [Muzeum Sztuki — czasopisma](https://zasoby.msl.org.pl/mobjects/show), **220 punktów**, publikacje, teksty, czasopisma, wycinki\n", "7. [Czas, czasopismo polonijne](https://digitalcollections.lib.umanitoba.ca/islandora/object/uofm:2222545), **140 punktów** S.G.\n", "8. [Stenogramy Okrągłego Stołu](http://okragly-stol.pl/stenogramy/), **110 punktów**\n", "9. [Wiadomości matematyczne](https://wydawnictwa.ptm.org.pl/index.php/wiadomosci-matematyczne/issue/archive?issuesPage=2), **120 punktow**\n", "10. [Alkoholizm i Narkomania](http://www.ain.ipin.edu.pl/archiwum-starsze.html)\n", "11. [Czasopismo Etyka](https://etyka.uw.edu.pl/index.php/etyka/issue/archive), O.K.\n", "13. [Hermes](https://chomikuj.pl/hermes50-1) i https://chomikuj.pl/hermes50-2, **250 punktów**\n", "14. [E-dziennik Województwa Mazowieckiego](https://edziennik.mazowieckie.pl/actbymonths) **150 punktów**\n", "15. [Gazeta GUM](https://gazeta.gumed.edu.pl/61323.html)\n", "16. [Echo Chełmka](http://moksir.chelmek.pl/o-nas/echo-chelmka)\n", "17. [Głos Świdnika](http://s.bibliotekaswidnik.pl/index.php/archwium/116-glos-swidnika) **100 punktów**\n", "18. [Teatr Lalek](http://polunima.pl/teatr-lalek)\n", "19. [Kultura Paryska](https://www.kulturaparyska.com/pl/index), całe archiwum z książkami i innymi czasopismami, **200 punktów**\n", "20. [Gazeta Fabryczna - Kraśnik](https://80lat.flt.krasnik.pl/index.php/gazeta-fabryczna/) **120 punktów**\n", "21. [Artykuły o Jujutsu](http://www.kobudo.pl/artykuly_jujutsu.html)\n", "22. [Wycinki o Taekwon-Do](https://www2.pztkd.lublin.pl/archpras.html#z1996)\n", "23. [Materiały o kolejnictwie](https://enkol.pl/Strona_g%C5%82%C3%B3wna) **180 punktów**\n", "24. [Centralny Instytut Ochrony Pracy](http://archiwum.ciop.pl/), znaleźć wszystkie publikacje typu , wymaga trochę sprytu **130 punktów**\n", "25. [Biblioteka Sejmowa - Zasoby Cyfrowe](https://biblioteka.sejm.gov.pl/zasoby_cyfrowe/), **200 punktów**\n", "26. [Litewska Akademia Nauk](http://www.mab.lt/), tylko materiały w jęz. polskim, takie jak np.\n", " , **170 punktów**\n", "27. [Litewska Biblioteka Cyfrowa](https://www.epaveldas.lt), wyłuskać tylko materiały w jęz. polskim, **190 punktów**\n", "28. [Czasopisma PTTK](https://www.czasopisma.centralnabibliotekapttk.pl/index.php?i3), **120 punktów**\n", "29. [Kilka przedwojennych książek](https://dziemiela.com/documents.htm)\n", "30. [Historia polskiej informatyki](http://klio.spit.iq.pl/a4-wyroby-polskiej-informatyki/a4-2-sprzet/) - wyjątkowo bez datowania\n", "31. [Zeszyty Formacyjne Katolickiego Stowarzyszenia „Civitas Christania”](http://podkarpacki.civitaschristiana.pl/formacja/zeszyty-formacyjne/), tylko niektóre pliki można zdatować\n", "32. [Prasa podziemna — Częstochowa](http://www.podziemie.com.pl), również ulotki i inne materiały skanowane - **180 punktów**\n", "33. [Gorzowskie Wiadomości Samorządowe](http://www.gorzow.pl/archiwum/przystan/media-strona-glowna/gorzowskie-wiadomosci-samorzadowe)\n", "34. [Gazeta Rodnia - Bieruń](https://www.bierun.pl/mieszkancy/archiwum)\n", "35. [Parafia Śrem](https://sremfara.pl/miesiecznik_30.html)\n", "36. [BIP Gdynia](https://bip.um.gdynia.pl/wyszukiwarka-uchwal-rady-miasta,7485/wyszukiwarka-uchwal,504923) do roku 1990!, **120 punktów**\n", "37. [BIP Żyrardów](https://www.bip.zyrardow.pl/4945,uchwaly-rady-miejskiej-zyrardowa?tresc=46185) do roku 1990!, **120 punktów**\n", "38. [Biuletyn Polarny](http://www.geol.agh.edu.pl/~bipo/index.php?menu=BiPo_0021)\n", "39. [Otwarte czasopisma Wydawnictwa UAM](https://pressto.amu.edu.pl), **140 punktów**\n", "40. [Wycinki o kolei gondolowej](http://kolej-szyndzielnia.pl/kolej-gondolowa/) — zob. \"Napisali o Szyndzielni\" na tej stronie\n", "41. [Instytut Radioelektroniki PW](https://www.ire.pw.edu.pl/o-instytucie/raporty-roczne/)\n", "42. [Zagadnienia Ekonomiki Rolnej](http://www.zer.waw.pl/Archive), **100 punktów**\n", "43. [Rozkazy Komendanta Chorągwi Wielkopolskiej ZHP](http://dokumenty.zhp.wlkp.pl/rozkazy.htm), **130 punktów**\n", "46. [Cyfrowe Archiwa Tarnowskie](https://www.agora.tarnow.pl/viewforum.php?f=30), **100 punktów**\n", "47. [Instytut Techniki Górniczej - wycinki](http://www.komag.gliwice.pl/archiwum/historia-komag)\n", "48. [Czasopismo matematyczne Delta](http://www.deltami.edu.pl/), **100 punktów**\n", "49. [Czasopismo Pauza](http://pauza.krakow.pl)\n", "50. [Nowa Dekada](http://nowadekada.pl/nowa-dekada-literacka/archiwum/)\n", "\n" ] } ], "metadata": { "author": "Jakub Pokrywka", "email": "kubapok@wmi.amu.edu.pl", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "lang": "pl", "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.2" }, "subtitle": "2.Wyszukiwarki roboty[ćwiczenia]", "title": "Ekstrakcja informacji", "year": "2021" }, "nbformat": 4, "nbformat_minor": 4 }