with scraping libreria from example con python selenium selenium-webdriver phantomjs

scraping - PhantomJS devuelve una página web vacía(python, Selenium)



selenium webdriver python (2)

Debes esperar a que la página esté loa d. Por lo general, se hace usando una espera explícita para esperar que un elemento clave esté presente o sea visible en una página . Por ejemplo:

from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC # ... browser.get("https://www.whatever.com") wait = WebDriverWait(driver, 10) wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.content"))) html_source = browser.page_source # ...

Aquí, esperaremos hasta 10 segundos para que un elemento div con class="content" vuelva visible antes de obtener el origen de la página.

Además, es posible que deba ignorar los errores de SSL :

browser = webdriver.PhantomJS(desired_capabilities=dcap, service_args=[''--ignore-ssl-errors=true''])

Sin embargo, estoy bastante seguro de que esto está relacionado con los problemas de redireccionamiento en PhantomJS . Hay un ticket abierto en el phantomjs errores phantomjs :

Intentar escanear una página web sin tener que iniciar una instancia real del navegador en una secuencia de comandos python (utilizando Selenium). Puedo hacer esto con Chrome o Firefox, lo probé y funciona, pero quiero usar PhantomJS para que no tenga cabeza.

El código se ve así:

import sys import traceback import time from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.desired_capabilities import DesiredCapabilities dcap = dict(DesiredCapabilities.PHANTOMJS) dcap["phantomjs.page.settings.userAgent"] = ( "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53 " "(KHTML, like Gecko) Chrome/15.0.87" ) try: # Choose our browser browser = webdriver.PhantomJS(desired_capabilities=dcap) #browser = webdriver.PhantomJS() #browser = webdriver.Firefox() #browser = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver") # Go to the login page browser.get("https://www.whatever.com") # For debug, see what we got back html_source = browser.page_source with open(''out.html'', ''w'') as f: f.write(html_source) # PROCESS THE PAGE (code removed) except Exception, e: browser.save_screenshot(''screenshot.png'') traceback.print_exc(file=sys.stdout) finally: browser.close()

El resultado es simplemente:

<html><head></head><body></body></html>

Pero cuando uso las opciones de Chrome o Firefox, funciona bien. Pensé que tal vez el sitio web estaba devolviendo basura basado en el agente de usuario, así que traté de falsear eso. Ninguna diferencia.

¿Qué me estoy perdiendo?

ACTUALIZADO: intentaré mantener actualizado el fragmento a continuación hasta que funcione. Lo que está debajo es lo que estoy intentando actualmente.

import sys import traceback import time import re from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.support import expected_conditions as EC dcap = dict(DesiredCapabilities.PHANTOMJS) dcap["phantomjs.page.settings.userAgent"] = ( "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53 (KHTML, like Gecko) Chrome/15.0.87") try: # Set up our browser browser = webdriver.PhantomJS(desired_capabilities=dcap, service_args=[''--ignore-ssl-errors=true'']) #browser = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver") # Go to the login page print "getting web page..." browser.get("https://www.website.com") # Need to wait for the page to load timeout = 10 print "waiting %s seconds..." % timeout wait = WebDriverWait(browser, timeout) element = wait.until(EC.element_to_be_clickable((By.ID,''the_id''))) print "done waiting. Response:" # Rest of code snipped. Fails as "wait" above.


Estaba enfrentando el mismo problema y no había mucha cantidad de código para hacer esperar al conductor.
El problema es el cifrado SSL en los sitios web de https, ignorarlos hará el truco.

Llame al controlador PhantomJS como:

driver = webdriver.PhantomJS(service_args=[''--ignore-ssl-errors=true'', ''--ssl-protocol=TLSv1''])

Esto resolvió mi problema.