¿Cómo usar selenium con firefox para raspar sitios web?
echo "deb http://packages.linuxmint.com debian import" >> /etc/apt/sources.list && apt-get update apt-get install firefox xvfb python-dev python-pip pip install pyvirtualdisplay selenium from pyvirtualdisplay import Display import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException display = Display(visible=0, size=(800, 600)) display.start() def init_driver(): driver = webdriver.Firefox() driver.wait = WebDriverWait(driver, 5) return driver def lookup(driver, query): driver.get("http://www.google.com") try: box = driver.wait.until(EC.presence_of_element_located( (By.NAME, "q"))) button = driver.wait.until(EC.element_to_be_clickable( (By.NAME, "btnK"))) box.send_keys(query) button.click() except TimeoutException: print("Box or Button not found in google.com") if __name__ == "__main__": driver = init_driver() lookup(driver, "Selenium") time.sleep(5) driver.quit() display.stop() File "selenium_scrape.py", line 20 box = driver.wait.until(EC.presence_of_element_located( ^ IndentationError: expected an indented blockLa diferencia es que no puede usar un navegador Chrome empaquetado; necesita un controlador especial... chromedriver.
Obtenga la última versión actual aquí: Chromedriver
Ahora tiene 2 opciones, ya sea mover el chromedriver descargado para que siempre esté accesible (opción 1), o definir en su secuencia de comandos cómo acceder a él.
Luego muévalo para que sea accesible cuando use webdriver.Chrome() :
sudo mv /path/to/download/chromedriver /usr/binTambién configúrelo para que se permita su ejecución:
chmod a+x /usr/binchromedriverO puede definir una ruta
import os chr = "/Users/you/Downloads/chromedriver" os.environ["webdriver.chrome.driver"] = chr driver = webdriver.Chrome(chromedriver)(Nota: la pregunta original era sobre Chrome, por lo que mi respuesta es sobre Chrome, no sobre Firefox).
Para mí, funciona si simplemente extraigo el controlador de cromo en la misma carpeta donde está el script.
Entonces lo ejecuto así
Xvfb :99 -ac -screen 0 1280x1024x16 & echo 'Starting the test' PATH=$PATH:. python selenimum_scrape.py Esto iniciará Xvfb e incluirá cromedriver en PATH .
Y la versión modificada de tu que me funciona:
import os import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException # comment this out to run on the real display os.environ['DISPLAY'] = ':99' def init_driver(): driver = webdriver.Chrome() driver.wait = WebDriverWait(driver, 5) return driver def lookup(driver, query): driver.get("http://www.google.com") try: box = driver.wait.until(EC.presence_of_element_located( (By.NAME, "q"))) # once we type the query, this button disappears # button = driver.wait.until(EC.element_to_be_clickable( # (By.NAME, "btnK"))) box.send_keys(query) button = driver.wait.until(EC.element_to_be_clickable( (By.NAME, "btnG"))) button.click() except TimeoutException: print("Box or Button not found in google.com") if __name__ == "__main__": driver = init_driver() lookup(driver, "Selenium") time.sleep(5) driver.quit()La pregunta es (por el momento) sobre un error de sangría. Esto se puede arreglar fácilmente:
def lookup(driver, query): driver.get("http://www.google.com") try: box = driver.wait.until(EC.presence_of_element_located( (By.NAME, "q"))) button = driver.wait.until(EC.element_to_be_clickable( (By.NAME, "btnK"))) box.send_keys(query) button.click() except TimeoutException: print("Box or Button not found in google.com")