From 6a0efac373dad08e494136655b661bdb5833d512 Mon Sep 17 00:00:00 2001 From: Patryk Date: Mon, 27 May 2024 00:53:56 +0200 Subject: [PATCH] lab 09-10 --- lab/lab_09-10.ipynb | 235 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 188 insertions(+), 47 deletions(-) diff --git a/lab/lab_09-10.ipynb b/lab/lab_09-10.ipynb index 683cdfa..a7077b0 100644 --- a/lab/lab_09-10.ipynb +++ b/lab/lab_09-10.ipynb @@ -50,37 +50,36 @@ "name": "stdout", "output_type": "stream", "text": [ - "Nastolatek ukradł znajomemu 4500 złotych. Wcześniej pił z nim alkohol\n", - "Czekają nas kolejne podwyżki rachunków. Tym razem za ogrzewanie i ciepłą wodę\n", - "Nie żyje Piotr Ś. Czyściciel kamienic miał 47 lat\n", - "Maciej Skorża nie zmienił zdania o systemie na mecz z Rakowem. Kolejorz ma szybką okazję do rehabilitacji\n", - "Kto zabił Kazimierę Kurkowiak? Poznańskie Archiwum X wraca do sprawy sprzed 30 lat\n", - "Mieszkańcy osiedla Kwiatowego zyskają nowy chodnik\n", - "Poznańskie ZOO ponownie się otwiera i apeluje o kupowanie biletów online\n", - "1700 zł mandatu dla motocyklisty: nie ma prawa jazdy, jechał za szybko\n", - "Plac Wolności ma tętnić życiem. Jest koncepcja zagospodarowania\n", - "Dzikie wysypisko w Wielkopolskim Parku Narodowym, a w nim paczka z telefonem odbiorcy\n", - "Dobre wieści z Łazarza! \"Zielona Perła\" sprzedana!\n", - "Sokoły wędrowne w gnieździe na kominie poznańskiej elektrociepłowni! Są 4 młode\n", - "720 nowych zakażeń w Wielkopolsce\n", - "Uderzył kobietę w sklepie: \"sprawca będzie rozliczony\"\n", - "Zespół Szkół Geodezyjno- Drogowych. Przyszłość rysuje się w kolorowych barwach!\n", - "Tajemniczy wypadek i pożar pod Kwilczem. Auto spłonęło, w środku nikogo nie było\n", - "Nad Jeziorem Maltańskim powstanie duży hotel? \"Ma uzupełniać infrastrukturę sportową\"\n", - "Śmiertelny wypadek na trasie S8: samochód potrącił rowerzystę\n", - "Specjaliści o poszukiwaniu Natalii Lick: \"niestety trop psa prowadził na Wartostradę\"\n", - "Korki przy skrzyżowaniu Grochowska / Grunwaldzka: ruszyły prace!\n", - "Restauracja w Kaliszu przyjmuje klientów: sanepid i policja \"odwiedzili\" lokal\n", - "Ile kosztuje wywóz odpadów?\n", - "Dachowanie auta na trasie Konin - Turek\n", - "Kierowca BMW pod wpływem narkotyków, pasażer w ich posiadaniu. Obaj zostali zatrzymani\n", - "Leszno: mężczyzna uderzył klientkę sklepu. Poszło o maseczkę?\n", - "Od poniedziałku zapłacimy za parkowanie na kolejnych ulicach\n", - "Włamał się do obiektu handlowego. Grozi mu nawet 15 lat więzienia\n", - "Rondo Śródka: kolizja z udziałem dwóch pojazdów\n", - "Europoseł PSL: oświadczenie Episkopatu ma wpływ na proces szczepień. \"Bardzo dużo ludzi zrezygnowało\"\n", - "Bezcenna wygrana Enea Energetyka. Poznanianki zagrają w fazie play-off\n", - "No to w drogę! Po odmienionych trasach w Wielkopolsce\n" + "W Poznaniu uroczyście odsłonięto monument upamiętniający cmentarz żydowski założony jeszcze w XIX wieku\n", + "Przez ulice Poznania przejdzie Marsz dla Życia. Będą utrudnienia\n", + "Sierść psa zatopiona w żywicy? Taką biżuterię pamiątkową zlecają właściciele czworonożnych pociech\n", + "Nagrał film w jednej z poznańskich \"Biedronek\". Kilka spleśniałych cytryn w kartonie. \"Nikt się tym nie przejmuje\"\n", + "Gniezno: poszkodowani po ulewie będą mogli ubiegać się o pomoc w ZUS i US. Powstała również specjalna infolinia\n", + "Zostawiła jedzenie dla potrzebujących. Coraz więcej głodnych osób, którym nie wystarcza pieniędzy po opłaceniu rachunków\n", + "Kolejne ostrzeżenie I stopnia od IMGW. Oprócz burz może wystąpić również grad\n", + "Lech przegrał Koroną. Na trybunach marsz żałobny i 'mamy k**** dość'\n", + "Warta Poznań po przegranej z Jagielonią Białystok spada do I ligi\n", + "Mieszkańcy skarżą się na właściciela samochodu, w którym notorycznie włącza się alarm. \"Uprzykrza nam to życie!\"\n", + "Leśne Placówki Montessori\n", + "Na autostradzie samochód wpadł w poślizg i stanął w poprzek. Są spore utrudnienia\n", + "Wróciła plaga kradzieży katalizatorów. Zmora dla kierowców, którzy nie mogą garażować auta\n", + "Nowy basen w Kiekrzu? W tunelu wody przybyło po same kolana\n", + "Pierożki Dim Sum z Para Bar Rataje ze specjalną zniżką!\n", + "Wielka głowa Darii Zawiałow zablokowała przez chwilę przejście dla pieszych na jednej z poznańskich ulic\n", + "Fałszywy pożar w centrum Poznania. Kłęby dymu w kamienicy?\n", + "Jest kolejne ostrzeżenie pierwszego stopnia, tym razem hydrologiczne. Gwałtowny wzrost stanu wody\n", + "Uwaga. Utrudnienia na drodze i ograniczenie prędkości. Potrwa to około 5 godzin\n", + "Chcą pobić rekord w kręceniu lodów. Tona lodów w ciągu doby\n", + "Jest ostrzeżenie IMGW dla Wielkopolski. Lepiej schować przedmioty, które mogą przemieścić się pod wypływem silnego wiatru\n", + "Nowe Centrum Medyczne Bizpark już w sprzedaży. Znajdź idealny lokal pod swoją działalność medyczną\n", + "Rondo Obornickie: zderzenie samochodu z motocyklem. Poszkodowany został odwieziony do szpitala. Chwilowe utrudnienia\n", + "Policjanci publikują wizerunek i szukają tego mężczyzny\n", + "Grupa Stonewall będzie miała program na antenie TVP3 Poznań. \"To będzie odtrutka na lata dezinformacji\"\n", + "Ruszył remont ważnego mostu. Co z kłódkami zakochanych?\n", + "Mieszkaniec spotkał wilka w Poznaniu?\n", + "Włamanie do... lokomotywy\n", + "W nadwarciański krajobraz wpisały się... żurawie. \"Jeden jest największy na świecie\"\n", + "Robisz remont? Za to możesz słono zapłacić!\n" ] } ], @@ -108,13 +107,51 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 10, "id": "moving-clothing", "metadata": {}, "outputs": [], "source": [ - "def get_names(article_type):\n", - " return []" + "from bs4 import element\n", + "\n", + "def get_names(article_type, page_nr: int = 0):\n", + " url = 'https://www.ceneo.pl/;szukaj-' + article_type + ';0020-30-0-0-' + str(page_nr) + '.htm'\n", + " page = requests.get(url)\n", + " if page_nr != 0 and url != page.url:\n", + " return []\n", + " soup = BeautifulSoup(page.content, 'html.parser')\n", + " result = []\n", + "\n", + " def is_product_title_container(tag: element.Tag) -> bool:\n", + " if not tag.has_attr('class'):\n", + " return False\n", + "\n", + " classes = tag.attrs['class']\n", + " if len(classes) != 1:\n", + " return False\n", + "\n", + " return classes[0] == 'cat-prod-row__name'\n", + "\n", + " def is_product_title(tag: element.Tag) -> bool:\n", + " if not tag.has_attr('class'):\n", + " return True\n", + "\n", + " classes = tag.attrs['class']\n", + " if len(classes) != 1:\n", + " return False\n", + "\n", + " return classes[0] == 'font-bold'\n", + "\n", + " for tag in soup.find_all(is_product_title_container):\n", + " href = tag.find('a')\n", + " if type(href) is not element.Tag:\n", + " continue\n", + " spans = href.find_all('span')\n", + " for span in spans:\n", + " if is_product_title(span):\n", + " result.append(span.text)\n", + "\n", + " return result" ] }, { @@ -135,13 +172,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "german-dispute", "metadata": {}, "outputs": [], "source": [ "def scrape_names():\n", - " return []" + " result = []\n", + " search = 'laptop'\n", + " page = 0\n", + " while True:\n", + " local_result = get_names(search, page)\n", + " if len(local_result) == 0:\n", + " return result\n", + " result = result + local_result\n", + " page += 1" ] }, { @@ -197,13 +242,39 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "regulation-sheriff", "metadata": {}, "outputs": [], "source": [ "def scrape_wmi():\n", - " return []" + " def get_text(soup_l: BeautifulSoup) -> str:\n", + " for trash in soup_l(['script', 'style']):\n", + " trash.extract()\n", + "\n", + " text = soup_l.get_text()\n", + "\n", + " return re.sub(r'\\s+', ' ', text)\n", + "\n", + " result = []\n", + "\n", + " base_url = 'https://wmi.amu.edu.pl/'\n", + " page = requests.get(base_url)\n", + " soup = BeautifulSoup(page.content, 'html.parser')\n", + " result.append(get_text(soup))\n", + " for href in soup.find_all('a'):\n", + " if type(href) != element.Tag:\n", + " continue\n", + "\n", + " if not href.has_attr('href'):\n", + " continue\n", + "\n", + " if base_url in href.attrs['href']:\n", + " sub_page = requests.get(href.attrs['href'])\n", + " result.append(get_text(BeautifulSoup(sub_page.content, 'html.parser')))\n", + "\n", + "\n", + " return result" ] }, { @@ -222,30 +293,97 @@ "### Ćwiczenie 4: Pobierz jak najwięcej słów w języku albańskim z serwisu glosbe.com." ] }, + { + "cell_type": "markdown", + "id": "706d6cba-c7a7-4d1b-9c2f-eb2119f859b5", + "metadata": {}, + "source": [ + "Nie jest to rozwiązanie zbalansowane, ale pobierze najwięcej słów (Przy odpowiedniej rotacji adresów IP, z których korzystamy, ale założyłem, że kwestia infrastruktury i tego jak strona jest chroniona przed atakami DOS, jest poza zakresem tego zadania)" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "surgical-ozone", "metadata": {}, "outputs": [], "source": [ "def scrape_shqip():\n", - " return []" + " import string\n", + "\n", + " result = []\n", + " letters = list(string.ascii_lowercase)\n", + " letters_count = len(letters)\n", + " longest_sensible_english_word_len = 28\n", + " base_url = 'https://glosbe.com/en/sq/'\n", + "\n", + " def get_words(word_l: str) -> list[str]:\n", + " def is_translated_word(tag: element.Tag) -> bool:\n", + " if not tag.has_attr('id') or not tag.has_attr('lang'):\n", + " return False\n", + "\n", + " if not 'translation__' in tag.attrs['id'] or 'sq' != tag.attrs['lang']:\n", + " return False\n", + "\n", + " return True\n", + "\n", + " result_l = []\n", + " page = requests.get(base_url + word_l)\n", + " soup = BeautifulSoup(page.content, 'html.parser')\n", + " words_l = soup.find_all(is_translated_word)\n", + " for word_l in words_l:\n", + " text = word_l.text\n", + " result_l.append(re.sub(r'\\s+', ' ', text))\n", + "\n", + " return result_l\n", + "\n", + " def trans(word_l: list[int]) -> str:\n", + " result_l = ''\n", + " for letter_l in word_l:\n", + " result_l += letters[letter_l]\n", + "\n", + " return result_l\n", + "\n", + " def increment(word_l: list[int]) -> list[int]:\n", + " done = False\n", + " result_l = []\n", + " for letter_l in word_l:\n", + " if done:\n", + " result_l.append(letter_l)\n", + " continue\n", + " next_letter_l = letter_l + 1\n", + " if next_letter_l == letters_count:\n", + " result_l.append(0)\n", + " continue\n", + "\n", + " result_l.append(next_letter_l)\n", + " done = True\n", + "\n", + " return result_l\n", + "\n", + " for length in range(longest_sensible_english_word_len - 1):\n", + " length += 1\n", + " combos = pow(length, letters_count)\n", + " word = []\n", + " for pos in range(length):\n", + " word.append(0)\n", + " for i in range(combos):\n", + " result.append(get_words(trans(word)))\n", + " word = increment(word)\n", + "\n", + " return result" ] } ], "metadata": { "author": "Rafał Jaworski", "email": "rjawor@amu.edu.pl", - "lang": "pl", - "subtitle": "9,10. Web scraping", - "title": "Komputerowe wspomaganie tłumaczenia", - "year": "2021", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, + "lang": "pl", "language_info": { "codemirror_mode": { "name": "ipython", @@ -256,8 +394,11 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.10" - } + "version": "3.10.4" + }, + "subtitle": "9,10. Web scraping", + "title": "Komputerowe wspomaganie tłumaczenia", + "year": "2021" }, "nbformat": 4, "nbformat_minor": 5