diff --git a/ueb05/README.md b/ueb05/README.md index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9ca7e1632c309fdcbb3166989295f25de12245f3 100644 --- a/ueb05/README.md +++ b/ueb05/README.md @@ -0,0 +1,11 @@ +Bevor wir einen Webscraper erstellen können, müssen wir erst herausfinden, wie die Webseite aufgebaut wird, was die Struktur ist, usw, um zu wissen, wonach unser Webscraper suchen soll. Darum haben wir die Webseite besucht und die Source-Datei (HTML Datei) angesehen. Wir merken, dass alle Artikeln zwischen den <div> Tag mit der Klasse "keywordliste" aufgelistet werden. Zusätzlich finden wir jede Überschrift in (oder hinter) einem <header> Tag, der sich auch in einem anderen <div> Tag befindet. Zum Schluss merken wir, dass die Seiten sequentiell numeriert werden, wobei die erste Seite die 0. Seite ist. + +Wir haben einfach die getPage Funktion aus dem Greyhound-Scraper kopiert und benutzt, damit wir ein BeautifulSoup Objekt erstellen können. Wir wissen, dass alle URLs mit "https://www.heise.de/thema/https?seite=" anfangen, deshalb haben wir dies in eine Variable gespeichert. Die Variablen allheaders und allwords werden auch initialisiert. + +Eine while wird erzeugt, damit wir Zugriff auf alle Seiten mit Artikeln haben können. Die 0. Seite wird erst geöffnet, wird direkt zum <div> Tag mit der Klasse "keywordliste" gegangen, und alle <div> Tags darin werden gefunden. Nicht alle dieser <div> Tags haben einen <header> Tag, deswegen sollen wir überprüfen, ob den Wert von <header> nicht None (also nicht leer) ist. Falls nicht, dann kriegen wir die Überschrift und fügen die in der allheaders Liste hinzu. Danach werden alle Wörter in jeder Überschrift mit Hilfe von Regular Expressions gefunden, und die werden in der allwords Liste gespeichert. Da wir später keine Probleme mit Vergleichungen haben wollen, werden alle Wörter klein geschrieben. Dieser Prozess wird für alle Seiten ausgeführt. Die Schleife terminiert, wenn die erste Seite gefunden wird, die keine <div> Tag mit der Klasse "keywordliste" gefunden wird. + +Danach werden alle Wörter sortiert und wird es gezählt, wie oft ein Wort auf der Liste vorkommt. Das entspricht, wie oft dieses Wort in einer Überschrift vorkommt. Am Ende haben wir eine Liste von Tupeln mit dem Wort und der Anzahl. Dies werden wieder sortiert, und die Top 10 Wörter (oder Strings, da einige gefundene Strings keine Wörter der deutschen Sprache sind) werden zurückgegeben. Laut Duden ist "https" kein deutsches Wort (also es gibt keine Definition in Duden für "https", Quelle: http://www.duden.de/suchen/shop/https), deswegen sind unsere Top 3 Deutsche Wörter: + +1. und (36) +2. für (32) +3. mit (28) \ No newline at end of file diff --git a/ueb05/heisescraper.py b/ueb05/heisescraper.py index 408c8721ee672cc846c618b413137156d3f935a0..517358f260e640de5c2690744895c4ff2439da26 100644 --- a/ueb05/heisescraper.py +++ b/ueb05/heisescraper.py @@ -32,12 +32,16 @@ allheaders = [] #alle Überschriften allwords = [] #alle Wörter in Überschriften zippedwordcount = [] #Tupeln von Wörter und wie oft die in Überschriften verwendet werden -for page in range(0,4): +page = 0 +while True: zuoeffnen = heiseurl+str(page) # print("Opening "+zuoeffnen) #nur zum Testen, damit wissen wir, woher den Fehler kommt content = getPage(zuoeffnen).find("div", { "class" : "keywordliste" }) + if content == None: #Schleife hört auf, wenn kein <div class="keywordliste"> Tag gefunden wird + break content = content.findAll("div") getHeaders(content) + page += 1 sortedwords = sorted(allwords) #sortierte Liste von Wörter diff --git a/ueb05/heisescrapernp.py b/ueb05/heisescrapernp.py new file mode 100644 index 0000000000000000000000000000000000000000..fd9193e848d520e5f3a924a129ab904c4858b8c0 --- /dev/null +++ b/ueb05/heisescrapernp.py @@ -0,0 +1,60 @@ +# imports +from bs4 import BeautifulSoup +import requests +import re #für Regular Expressions +import numpy as np #für Numerical Python, damit wir Einträge zählen können, ohne Schleife selbst zu kodieren + +def getPage(url): + """ + Function takes a url and returns a soup page object. Copied from the Greyhound scraper. + """ + r = requests.get(url) + data = r.text + spobj = BeautifulSoup(data, "lxml") + return spobj + +def getHeaders(content): + """ + Function takes some content, parses the article headers and adds them to a list, parses the words in the article headers, converts them to lowercase, then finally adds them to our word list. + """ + for c in content: + if c.header != None: + allheaders.append((c.header).string.strip()) + + for header in allheaders: + words = re.findall("[\w'-]+", header) + for word in words: + madelower = word.lower() + allwords.append(madelower) + +#initialisiert Variablen +heiseurl = "https://www.heise.de/thema/https?seite=" #URL der Seiten +allheaders = [] #alle Überschriften +allwords = [] #alle Wörter in Überschriften +zippedwordcount = [] #Tupeln von Wörter und wie oft die in Überschriften verwendet werden + +page = 0 +while True: + zuoeffnen = heiseurl+str(page) +# print("Opening "+zuoeffnen) #nur zum Testen, damit wissen wir, woher den Fehler kommt + content = getPage(zuoeffnen).find("div", { "class" : "keywordliste" }) + if content == None: #Schleife hört auf, wenn kein <div class="keywordliste"> Tag gefunden wird + break + content = content.findAll("div") + getHeaders(content) + page += 1 + +sortedwords = sorted(allwords) #sortierte Liste von Wörter + +#zählt wie oft ein Wort in Überschriften benutzt wird, zipped das Wort mit der Anzahl in einem Tupel, und speichert die in einer Liste +word, count = np.unique(sortedwords, return_counts=True) +zippedwordcount = list(zip(list(word),list(count))) + +#Quelle für die Sortierung: https://stackoverflow.com/questions/14466068/sort-a-list-of-tuples-by-second-value-reverse-true-and-then-by-key-reverse-fal +sortedcounts = sorted(zippedwordcount,key=lambda x:(-x[1],x[0])) + +#gibt Top 10 benutzte Wörter zurück +#Merke: https ist kein Wort der deutschen Sprache! +print("Top 10 Wörter:") +for i in range(0,10): + print(sortedcounts[i][0]+"\t\t\t"+str(sortedcounts[i][1])) \ No newline at end of file