Skip to content
Snippets Groups Projects
Commit 83c53ba9 authored by ren's avatar ren
Browse files

Files bearbeitet

parent a97a6d6e
Branches
No related tags found
No related merge requests found
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
......@@ -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
......
# 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment