2016-07-01 12 views
0

Ich bin ein wenig verwirrt, wie dies zu tun ist. Ich bin nicht sicher, ob das richtig ist, aber ich versuche, eine Suche über eine URL abzufragen. Ich habe versucht, dies zu tun:Python BeautifulSoup && Anfrage zu kratzen Suchmaschinen

url = 'https://duckduckgo.com/dogs?ia=meanings' 
session = requests.session() 
r = session.get(url) 
soup = bs(r.content, 'html.parser') 

Ich bekomme etwas HTML zurück von der Antwort; Wenn ich jedoch nach allen Links suche, kommt nichts neben der ursprünglichen Such-URL auf.

links = soup.find_all('a') 
for link in links: 
    print(link) 

<a href="https://duckduckgo.com/html/?q=dogs">here</a> 

Wenn ich die Suche in einem Browser zu tun und den HTML-Code überprüfen, alle Links vorhanden sind, aber aus irgendeinem Grund kommen über meine Bitte an mich nicht zurück.

Jeder hat irgendwelche Ideen, ich versuche eine Web-Scraping-Anwendung zu erstellen und ich dachte, das wäre etwas wirklich einfaches, das ich in mein Terminal einbauen könnte.

Antwort

2

Das Problem ist, dass die Suchergebnisse und der Großteil der Seite dynamisch geladen werden mit Hilfe von JavaScript-Code vom Browser ausgeführt wird. requests würde nur die anfängliche statische HTML-Seite herunterladen, es hat keine JS-Engine, da es kein Browser ist.

Sie haben grundsätzlich drei Hauptoptionen:

  • Verwendung DuckDuckGo API (Python wrapper, es sein kann, ist eine bessere - bitte nochmals überprüfen) - Mit dieser Option wird
  • Laden Sie die Seite in einem echten Browser bevorzugt durch selenium und dann den HTML-Code analysieren, der nun den vollständigen HTML-Code in Ihrem Browser enthält
  • versuchen Sie herauszufinden, welche Anforderungen zum Laden der Seite gestellt werden, und ahmen Sie diese in Ihrem Code BeautifulSoup + requests nach. Dies ist der schwierigste und zerbrechlichste Ansatz, der komplexe syntaktische und JavaScript-Code-Parsing beinhalten kann.