forked from bfijalkowski/KWT-2024
lab 09-10
This commit is contained in:
parent
78982a4f21
commit
6a0efac373
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user