2016-08-05 46 views
0

I verwendet Selen und PhantomJS der Hoffnung, Daten von einer Website zu erhalten, die mit Hilfe von Javascript das DOM zu bauen.Python Crawler DOM Informationen zu erhalten, indem Selen und PhantomJS mit

Der folgende einfache Code funktioniert, ist aber nicht immer gültig. Ich meinte, dass es die meiste Zeit eine leere Website zurückgeben würde, die das Javascript nicht ausführte. Es könnte selten die richtigen Informationen bekommen, die ich möchte.

from selenium import webdriver 
from bs4 import BeautifulSoup 

url = 'http://mall.pchome.com.tw/prod/QAAO6V-A9006XI59' 
driver = webdriver.PhantomJS 
driver.get(url) 

print(driver.page_source, file=open('output.html','w')) 

soup = BeautifulSoup(driver.page_source,"html5lib") 
print(soup.select('#MetaDescription')) 

Es hat eine hohe Wahrscheinlichkeit, einen leeren String zurück:

[<meta content="" id="MetaDescription" name="description"/>] 

Ist der Website-Server nicht Web-Crawler ermöglicht? Was kann ich tun, um meinen Code zu reparieren?

Was mehr ist, können alle Informationen, die ich brauche, im Tag <head> sein. (Wie oben gezeigt, haben die Daten eine ID MetaDescription)

Oder gibt es einen einfacheren Weg, um nur die Daten in Tag zu bekommen?

+0

'supp.select ('head')'? Wie auch immer, hast du versucht, ein wenig zu warten? –

Antwort

3

Zunächst einmal ist driver = webdriver.PhantomJS keine korrekte Art und Weise ein Selen WebDriver in Python zu initialisieren, ersetzen Sie es mit:

driver = webdriver.PhantomJS() 

Die Symptome, die Sie beschreiben, sind ähnlich, wenn Sie die Timing-Probleme haben. Add a wait für das gewünschte Element warten (n) vorhanden werden, bevor die Seite Quelle zu bekommen versuchen:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.wait import WebDriverWait 

driver = webdriver.PhantomJS() 
driver.get(url) 

# waiting for presence of an element 
wait = WebDriverWait(driver, 10) 
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#MetaDescription"))) 

print(driver.page_source, file=open('output.html','w')) 

driver.close() 

# further HTML parsing here 

Sie auch ignore SSL errors and set the SSL protocol to any benötigen. In einigen Fällen hilft auch pretending not be PhantomJS.

+0

Danke! Ich habe die Timing-Probleme nicht berücksichtigt. Die Seite enthält jedoch Tags mit leerem Inhalt vor dem Laden. Es verwendet Javascript, um die Lücken zu füllen. Also habe ich 'Implicit Waits' verwendet, um den wartenden Teil zu ersetzen. Ich habe auch versucht, die beiden Links zur gleichen Zeit zu verwenden, und es gelingt nur wenige Male. – WenT

+0

@WenT Okay, in diesem Fall geht es nur darum, die richtige Bedingung zu wählen, auf die man warten muss. Warten Sie zum Beispiel auf die Anwesenheit des Produkttitels: '# NickContainer'. Oder warten Sie vielleicht, bis das Produkt "img" -Element vorhanden ist. – alecxe

+0

Ich habe einen 'driver.implicitly_wait (30)' verwendet, aber vergeblich. Allerdings habe ich versucht 'time.sleep (5)' und es funktioniert !!! Es liegt also an Timing-Problemen. Aber das "stillschweigende Warten" hat bei mir nicht funktioniert, verwende ich das falsch? Was auch immer, danke für die Anweisungen !! – WenT