Hey,
Corona schenkt manchen von uns viel Zeit zu Hause. Daher überlege ich momentan mal einen Python-Regelwiki Crawler zu schreiben.
Hat irgendwer schon nen Ansatz auf seiner Festplatte rumfliegen?
Um schreiben oder kommentieren zu können, benötigst du ein Benutzerkonto.
Du hast schon ein Benutzerkonto? Melde dich hier an.
Jetzt anmeldenHier kannst du ein neues Benutzerkonto erstellen.
Neues Benutzerkonto erstellenHey,
Corona schenkt manchen von uns viel Zeit zu Hause. Daher überlege ich momentan mal einen Python-Regelwiki Crawler zu schreiben.
Hat irgendwer schon nen Ansatz auf seiner Festplatte rumfliegen?
Ein einfacher Grabber den ich geschrieben habe. Er ist multithreaded, baut eine Ordnerstruktur auf und auch wenn die Dateien als .html gespeichert werden, wird nicht alles an html mitgenommen, sondern nur der Wiki "Eintrag". Diese Rohdaten sollten dann natürlich mit einem Parser weiter verarbeitet werden.
from queue import Queue
import requests
import os
import re
import threading
main_adress = "http://ulisses-regelwiki.de/"
html_folder = "WikiData"
class ThreadedManager:
def __init__(self,adress,folder, limit):
self.top_adress=adress
self.main_folder = folder
self.limit = limit
self.threads =0
self.q = Queue()
def start(self):
if not os.path.exists(self.main_folder):
os.mkdir(self.main_folder)
links=grabAllTopLinks(self.top_adress)
for link,name in links:
self.q.put([self.main_folder,link,name])
while not self.q.empty() and self.threads<self.limit:
parent_folder,link,name = self.q.get()
thread = htmlThread(link,parent_folder,name,self.top_adress,self)
self.threads +=1
thread.start()
def finished(self,links,parent_folder):
for link,name in links:
self.q.put([parent_folder,link,name])
self.finished_noData()
def finished_noData(self):
self.threads -= 1
while not self.q.empty() and self.threads<self.limit:
parent_folder,link,name = self.q.get()
print("Starting new thread:", link)
thread = htmlThread(link,parent_folder,name,self.top_adress,self)
self.threads +=1
thread.start()
print("Queue size:",self.q.qsize())
class htmlThread(threading.Thread):
def __init__(self,link,parent_folder,name,top_adress,parent):
threading.Thread.__init__(self)
self.link=link
self.parent_folder=parent_folder
self.name=name
self.top_adress=top_adress
self.parent = parent
def run(self):
new_adress=self.top_adress+self.link
raw_data = getHTMLFile(new_adress)
links = self.getLinks(raw_data)
data = self.getData(raw_data)
if len(data)>0:
print("\nDATA FOUND: Writing:",self.parent_folder+"/"+self.name+".html")
self.writeData(data,self.name,self.parent_folder)
if len(links)>0:
if not os.path.exists(self.parent_folder+"/"+self.name):
os.mkdir(self.parent_folder+"/"+self.name)
self.parent.finished(links,self.parent_folder+"/"+self.name)
else:
self.parent.finished_noData()
def writeData(self,data, name,folder):
keepcharacters = (' ',"-",'_',"(",")")
name="".join(c for c in name if c.isalnum() or c in keepcharacters).rstrip()
self.save_obj(data, name,folder)
return data
def save_obj(self,obj, name,folder ):
with open(folder+"/"+ name + '.html', 'w+',encoding='utf8') as f:
f.write(obj)
f.close()
def getData(self, toParse):
temp=toParse
start = temp.find('<div class="ce_text first')
temp = temp[start:]
end = temp.find("<footer id=")
temp= temp[:end]
return temp
def getLinks(self, toParse):
temp = toParse
start = temp.find('ulStrikeOutH1')
temp = temp[start:]
end = temp.find("</nav>")
temp = temp[:end]
pattern = 'href=[\'\"]?([^\'\" >]+)[\'\"] title=[\'\"]([^\'\">]+)'
prog = re.compile(pattern)
result = prog.findall(temp)
return result
def grabAllTopLinks(adress):
data = getHTMLFile(adress)
pattern = 'href=[\'\"]?([^\'\" >]+)[\'\"] title=[\'\"]([^\'\">]+)'
prog = re.compile(pattern)
result = prog.findall(data)
return result
def getHTMLFile(url):
r = requests.get(url)
return r.text
grabber = ThreadedManager(main_adress,html_folder,10)
print("Grabbing Data...")
grabber.start()
Alles anzeigen
Please dont. Das saugt nur noch mehr am Wiki und das tun schon wirklich genug. Bitte nicht.