diff --git a/main/src/main.py b/main/src/main.py index 12a699b0384686c9c5e5909c06ec3b77816da2bd..28680e913814290eeb5210fef0f36cd5687dcf4b 100644 --- a/main/src/main.py +++ b/main/src/main.py @@ -1,9 +1,35 @@ -from scraper import scrape_xml_yle +from scraper import scrape_il, scrape_xml_yle, to_json +import sys def main(): - #artikkelit = scrape_xml_yle() - print(len(scrape_xml_yle())) - + ehto = True + while(ehto): + sivusto = str(input('Syötä yle tai iltalehti: ').lower()) + if sivusto == 'yle': + yle_artikkelit = scrape_xml_yle() + nimi = input('Anna nimi tiedostolle johon json data tallenetaan: ') + try: + with open(nimi+'.json', 'xb') as f: + f.write(to_json(yle_artikkelit)) + ehto = False + break + except FileExistsError: + print("Nimi on jo käytössä") + if sivusto == 'iltalehti': + il_artikkelit = scrape_il() + nimi = input('Anna nimi tiedostolle johon json data tallenetaan: ') + try: + with open(nimi+'.json', 'xb') as f: + f.write(to_json(il_artikkelit)) + ehto = False + break + except FileExistsError: + print("Nimi on jo käytössä") + + else: + print("Väärä syöte") + + if __name__ == "__main__": main() \ No newline at end of file diff --git a/main/src/scraper.py b/main/src/scraper.py index 12436c51dc8cf0cbe4de04504f18e67e7fcbf442..5e35ac8949efbb3a1147ca75990a90d567fce46c 100644 --- a/main/src/scraper.py +++ b/main/src/scraper.py @@ -1,7 +1,12 @@ from bs4 import BeautifulSoup import requests import json - +""" +Käytetään requests kirjastoa tekemään HTTP get pyyntö Url:iin. +Beautifulsoup kirjastoa käytetään parsettamaan xml sivu. +Sivusta etsitään yksittäiset uutiset, josta otetaan ylös otsikko, julkaisupäivämäärä sekä teksti. +Artikkelit tallennetaan dict tiedostoon, jotka kootaan listaan +""" def scrape_xml_yle(): url = 'https://feeds.yle.fi/uutiset/v1/recent.rss?publisherIds=YLE_UUTISET' artikkelit_lista = [] @@ -15,7 +20,7 @@ def scrape_xml_yle(): otsikko = art.find('title').text pubDate = art.find('pubDate').text teksti = art.find('content:encoded').text - t_soup = BeautifulSoup(teksti,features='xml').get_text() + t_soup = BeautifulSoup(teksti,features='xml').get_text() # teksti on <p> tagien sisällä, joten parsetetaan uudestaan jolloin jää vain teksti artikkeli = { 'otsikko': otsikko, @@ -26,9 +31,14 @@ def scrape_xml_yle(): except: print("Epäonnistunut imurointi") - print('scrapattu') + print(f'Scrapattu {len(artikkelit_lista)} uutista yleltä, pvm: {list(artikkelit_lista[0].values())[1]}') return artikkelit_lista +""" +Muuten samanlainen, kuten ylen metodi, +mutta iltalehden rss syötteestä joudutaan kaivamaan teksti +menemalla linkin kautta itse uutiseen. +""" def scrape_il(): url = 'https://www.iltalehti.fi/rss/uutiset.xml' sivu = requests.get(url) @@ -54,7 +64,7 @@ def scrape_il(): teksti = '' for p in ps: - teksti = teksti + p.text #Teksti on useissa <p> tageissa, joten ne iteroidaan läpi ja lisätään tekstiin + teksti = teksti + p.text #Teksti on useissa <p> tageissa, joten ne iteroidaan läpi ja lisätään tekstiin artikkeli = { 'otsikko': otsikko, 'pubDate': pubDate, @@ -63,9 +73,10 @@ def scrape_il(): artikkeli_lista.append(artikkeli) except: print("Jotain väärin") - print("Kuinka monta artikkelia",len(artikkeli_lista)) + print(f'Scrapattu {len(artikkeli_lista)} uutista yleltä, pvm: {list(artikkeli_lista[0].values())[1]}') return artikkeli_lista + def to_json(file): data = json.dumps(file,ensure_ascii=False,indent=1).encode('utf8') print("Data enkoodattu json-utf8 muotoon, decode() muuttaa ihmisluettavaksi") diff --git a/tests/test_scraper.py b/tests/test_scraper.py index cc903c387937a214000422991031d1c975a74028..7369787df808cf10a39ac94484458b86c8523b93 100644 --- a/tests/test_scraper.py +++ b/tests/test_scraper.py @@ -1,24 +1,39 @@ import unittest -from main.src.scraper import scrape_xml_yle +from main.src.scraper import scrape_xml_yle, to_json from main.src.scraper import scrape_il +from main.src.scraper import to_json -def test_ylescraper(): - artikkelit = scrape_xml_yle() - #Varmista,että artikkeleja on imuroitu - assert len(artikkelit) > 0 - #Varmista, että palautettu tyyppi on lista, jotta jsoniksi muuttaminen onnistuu - assert type(artikkelit) == list - #Katso, että kaikkiin on tallentunut kaikki tiedot: Otsikko, julkaisupvm, teksti - for art in artikkelit: - assert len(art) == 3 +class TestMethods(unittest.TestCase): + def test_ylescraper(self): + artikkelit = scrape_xml_yle() + #Varmista,että artikkeleja on imuroitu + assert len(artikkelit) > 0 + #Varmista, että palautettu tyyppi on lista, jotta jsoniksi muuttaminen onnistuu + assert type(artikkelit) == list + #Katso, että kaikkiin on tallentunut kaikki tiedot: Otsikko, julkaisupvm, teksti + for art in artikkelit: + self.assertTrue(len(art) == 3) -def test_ilscraper(): - artikkelit = scrape_il() + def test_ilscraperself(self): + artikkelit = scrape_il() - assert len(artikkelit) > 0 + assert len(artikkelit) > 0 + + assert type(artikkelit) == list + + for art in artikkelit: + self.assertTrue(len(art) == 3) + + def test_json(self): + import json + file = scrape_xml_yle() + data = to_json(file) + + self.assertIsInstance(data,bytes) + loaded = json.loads(data) + + + self.assertEqual(file,loaded) #Katsotaan, että jsoniksi muuttaminen ja siitä palauttaminen ei muuta dataa - assert type(artikkelit) == list - for art in artikkelit: - assert len(art) == 3