Seite 1 von 1

webcrawler

Verfasst: Montag 3. April 2017, 10:40
von Fenrir
Hi Leute,

Bin ganz neu in Python dabei und hab mir als 1. "Projekt" einen Webcrawer auserkoren :)
SuFu hab ich genutzt, aber würde halt auch gerne wissen, was an meinem code konkret falsch ist..

Code: Alles auswählen

#!/usr/bin/python3.5
import urllib
import urllib.request
import html.parser
from bs4 import BeautifulSoup
import sys

while True:
	try:
		thisUrl = "https://www.wikipedia.de"

	
		test = BeautifulSoup(urllib.request.urlopen(thisUrl).read(), "html.parser").find_all("a")
		
		for links in test:
			site = links.get("href")
			print(site)
			allA = BeautifulSoup(urllib.request.urlopen(site).read(), "html.parser").find_all("a")
			for link in allA:
				str(link)
				print(link.get("href"))
				print("****************")		#rein zur besseren Übersicht
				
	except ValueError:
		print("ValueError")
		sys.exit(0)	
Bei einigen wenigen Seiten bekomm ich durchaus ein paar links zurück (zb. bei google.de oder wikipedia.de), aber bei den meisten direkt ValueError...
Soll ich nochmal komplett von neu starten, oder bin ich damit schon auf dem richtigen Weg und was löst immer den ValueError aus?
Mein code (so denke ich zumindest) macht eine tiefensuche, kann man das lassen oder wäre breitensuche besser?
Sobald ich nen funktionierenden crawler hab, werd ich die links nat in einer datei speichern und nicht mehr in der console ausgeben lassen :)

Vielen Dank schonmal für die Hilfe!

Re: webcrawler

Verfasst: Montag 3. April 2017, 11:58
von Sirius3
@Fenrir: als erstes solltest Du mal die falsche Fehlerbehandlung rauslöschen, damit Du auch siehst, was falsch läuft.

Re: webcrawler

Verfasst: Montag 3. April 2017, 20:31
von DasIch
ich würde dir empfehlen mal Scrapy anzuschauen. Scrapy ist nicht so ganz optimal aber doch schon ganz gut für die meisten scraping Probleme.

Re: webcrawler

Verfasst: Montag 3. April 2017, 21:44
von Fenrir
Erstmal Danke für die Antworten!

Hab jetzt den try-block entfernt und hier ein paar der Errors:

File "./test.py", line 18, in <module>
lol = BeautifulSoup(urllib.request.urlopen(site).read(), "html.parser").find_all("a")
File "/usr/lib/python3.5/urllib/request.py", line 162, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.5/urllib/request.py", line 450, in open
req = Request(fullurl, data)
File "/usr/lib/python3.5/urllib/request.py", line 268, in __init__
self.full_url = url
File "/usr/lib/python3.5/urllib/request.py", line 294, in full_url
self._parse()
File "/usr/lib/python3.5/urllib/request.py", line 323, in _parse
raise ValueError("unknown url type: %r" % self.full_url)

Der obere Teil ist immer gleich und die letzte Zeile unterschiedlich:

ValueError: unknown url type: '#mainContent'
ValueError: unknown url type: '/'
ValueError: unknown url type: '/courses/'
ValueError: unknown url type: '#start-of-content'

Sind von verschiedenen Seiten. Hab die Vermutung, dass es gar nicht an meinem code liegt, sondern an BeautifulSoupe, kann das sein?
Werd mich mal mit scrapy auseinandersetzen, allerdings würde ich schon gerne wissen, wo genau hier mein Fehler liegt.
Bin für jeden Tipp dankbar :)

Re: webcrawler

Verfasst: Montag 3. April 2017, 22:45
von BlackJack
@Fenrir: Das liegt nicht an `BeautifulSoup`, das liefert Dir wie gewünscht den Inhalt der href-Attribute. Nur müssen das halt keine vollständigen URLs sein.

Re: webcrawler

Verfasst: Dienstag 4. April 2017, 09:57
von Fenrir
BlackJack hat geschrieben:@Fenrir: Das liegt nicht an `BeautifulSoup`, das liefert Dir wie gewünscht den Inhalt der href-Attribute. Nur müssen das halt keine vollständigen URLs sein.
ahh ok, jetzt hab ichs gecheckt! :D vielen Dank!
Hab den code jetzt um ein paar if-Abfragen erweitert und nun läuft das ganze schon wesentlich besser :)
Paar Errors kommen zwar noch bei einigen Seiten, aber da versuch ich erstmal selbst mein Glück!