Ich versuche mich seit neustem an einen etwas komplexeren Web Crawler.
Ich nutze Python 3.6 und als Crawler BS4.
Mein Problem ist, dass ich als Ausgegeben bekomme was ich brauche.
Ich bekomme nur den Stumpfen Quelltext, ich brauche jedoch den Quelltext den Ich auch mit dem Firefox "Element Untersuchen" Funktion ausgegeben bekomme.
Web Crawler
- noisefloor
- User
- Beiträge: 3865
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
du müsstest halt mal deine Code zeigen. Ohne kann man nicht viel sagen.
Grundsätzlich lädt ein Webcrawler in der Tat nur den "stumpfen Quelltext". Elemente, die später z.B. über JavaScript dynamisch hinzugefügt werden, bekommst du so nicht.
Gruß, noisefloor
P.S.: Willkommen im Forum
du müsstest halt mal deine Code zeigen. Ohne kann man nicht viel sagen.
Grundsätzlich lädt ein Webcrawler in der Tat nur den "stumpfen Quelltext". Elemente, die später z.B. über JavaScript dynamisch hinzugefügt werden, bekommst du so nicht.
Gruß, noisefloor
P.S.: Willkommen im Forum
Korrektur : Mein Problem ist, dass ich nicht das ausgegeben bekomme was ich will.Mein Problem ist, dass ich als Ausgegeben bekomme was ich brauche.
Mein Code:
Code: Alles auswählen
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
my_url = 'https://de.tonybet.com/event/1364763'
webpage = Request(my_url, headers={'User-Agent': 'Mozilla/5.0'})
page_html = urlopen(webpage).read()
soup = BeautifulSoup(page_html, 'lxml')
sou_aus1 = soup.find_all("data-event-odd-id")
print(sou_aus1)
Habe das Wort lxml damit oft in Verbindung gelesen, stehe aber derzeit noch auf den schlauch.
DankeP.S.: Willkommen im Forum
- noisefloor
- User
- Beiträge: 3865
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Ein gängiger Weg ist der Einsatz von Selenium. Damit kommst du auch an den Inhalt des DOM.
Gruß, noisefloor
lxml ist ein XML/HTML Parser. Der kommt aber auch nicht an den Inhalt des DOM.Habe das Wort lxml damit oft in Verbindung gelesen, stehe aber derzeit noch auf den schlauch.
Ein gängiger Weg ist der Einsatz von Selenium. Damit kommst du auch an den Inhalt des DOM.
Gruß, noisefloor
Mir gefällt die folgende Zeile nicht:
Ich würde eher so etwas erwarten:
Du solltest Dir mal das Modul requests ansehen. Das ist sehr viel einfacher zu nutzen, als die urllib.request-Sache. Auf Selenium wurdest Du bereits hingewiesen.
Code: Alles auswählen
sou_aus1 = soup.find_all("data-event-odd-id")
Code: Alles auswählen
content = soup.find_all("div", attr={"class": "data-event-odd-id"})
Die urllib ist erst mal nicht mehr nötig dank Selenium, aber ich werde es mir später anschauen.Du solltest Dir mal das Modul requests ansehen. Das ist sehr viel einfacher zu nutzen, als die urllib.request-Sache. Auf Selenium wurdest Du bereits hingewiesen.
Ich habe jetzt die gewünschten Ausschnitte von der DOM filtern können.
https://pastebin.com/SjFJ3EWJ /Teil Ausgabe
Ich will jetzt die Ausgabe nun so ausgegeben bekommen
Bester Punktestand
Die meisten Treffer im ersten Viertel: 3.40
Die meisten Treffer im 2. Viertel: 4.0
Die meisten Treffer im 3. Viertel: 3.75
....
BeautifulSoup kann ich nicht wieder anwenden, bekomme da ein Fehler und eine andere Lösung kenne ich für meine Wunschausgabe nicht.
Mein Code
Code: Alles auswählen
from selenium import webdriver
from bs4 import BeautifulSoup
browser = webdriver.Chrome('C:\\chromedriver.exe')
browser.get("https://de.tonybet.com/event/1372234")
page_dom = browser.page_source
soup = BeautifulSoup(page_dom, 'lxml')
bet_content = soup.find_all("div", attrs={"class":"panel panel-gray panel-odds"})
bet_content_len = len(bet_content)
print(bet_content_len)
for bet in bet_content:
print(bet)
Du kannst "lauffähigen" Code gerne auch hier posten, möglicherweise hilft er anderen...
-
- User
- Beiträge: 1
- Registriert: Freitag 5. Januar 2018, 14:26
Code: Alles auswählen
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup, Tag
import bs4
Interne_Links = [] #Listen, um Links geordnet zu speichern.
Links = []
usedurl = []
startpage = "https://justiz.de/bundlaender/bund/index.php" # Url welche gescrapet werden soll.
url = "https://justiz.de" # Basis url die nachher mit den seiteninternen Links "addiert" wird, um vollständige Links zu erhalten.
def Linkfinder(page):
uClient = uReq(page) # Web scraping : Seite öffnen,download, Verbindung trennen.
page_html = uClient.read()
uClient.close
page_soup = soup(page_html,"html.parser") # Bs4 anwenden, um Seite durchsuchen zu können.
# Verarbeitung
containers = page_soup.findAll("a") # Alle "a Tags" (html) finden.
for item in containers: # Für jeden html Tag (fals vorhanden) den href greifen.
link = item.get('href')
if link != None and not "@" in link:: # Wenn ein href vorhanden ist, kein none zurückgegeben wurde, entwerder :
if link[0:5] == "../.." : # 1. wenn die ersten 5 Zeichen des href "../.." sein sollten, diese enfernen,
# und mit der basis url "addieren", um diese ,der liste "Interne_Links", hinzufügen.
Interne_Links.append(url+link[5:])
else:
Links.append(link) # 2. Wenn die ersten Zeichen den Links NICHT "../.." sein sollten, wird dieser der Liste "Links" hinzufügen
usedurl.append(page)
Linkfinder(startpage)
for page in Interne_Links:
if not page in usedurl:
Linkfinder(page)
# Ausgabe
print("Links")
print(Links)
print(20*"-")
print("Seiten interne Links")
print(Interne_Links)
Ich hätte eine Frage an euch erfahrene Programmierer:
Wie kann ich in den Linkfinder einbauen, dass dieser in die tiefe geht. Also als Beispiel: Das Programm holt sich einen Link aus einer Seite, und geht diesen Links drei nach. Danach hört er auf. Damit man kein ewiges Monster erschafft.
Hoffe ihr habt die Beschreibung verstanden , wenn nicht fragt einfach nach
Pep8 beachten, bitte Codebox für den Code verwenden und zu deiner letzten Frage: Ich würde prüfen, ob die Links zur Seite gehören oder auf eine externe Seite verweisen. Wenn du dann besuchte Seiten nachhältst, kannst du sicher gehen, dass du die komplette Seite erfasst - kann halt nach Umfang etwas dauern...
Dein Code ist ohne Code-Tags leider nicht wirklich lesbar.
Vom Prinzip ist das Problem aber einfach zu loesen: du merkst dir fuer jeden Link nicht nur dessen URL, sondern auch seine Tiefe. In einer gecrawlten Seite, die neue Links enthaelt, merkst du dir die mit aktueller Tiefe + 1. Und wenn ein Link mit einer Tiefe groesser als die vorgesehene besucht werden soll, machst du nix.
Oder du benutzt einfach wget, was so etwas schon kann.
Vom Prinzip ist das Problem aber einfach zu loesen: du merkst dir fuer jeden Link nicht nur dessen URL, sondern auch seine Tiefe. In einer gecrawlten Seite, die neue Links enthaelt, merkst du dir die mit aktueller Tiefe + 1. Und wenn ein Link mit einer Tiefe groesser als die vorgesehene besucht werden soll, machst du nix.
Oder du benutzt einfach wget, was so etwas schon kann.
BS4 ist kein Crawler. Wenn du das Rad nicht neu erfinden willst, nimm Scrapy. Damit kannst du dich dann aufs wesentlich konzentrieren. Wenn du Seiten die JS nutzen crawlen willst, versuch direkt die APIs zu nutzen die der JS code nutzt, ansonsten ist es schwierig einen stabilen Crawler zu schreiben. Wenn dies aus irgendeinem Grund nicht funktioniert hat Scrapy mit scrapy-splash auch hierfür eine Lösung.