Firefox с помощью Selenium (безголовые)
как использовать selenium
С firefox
скрести сайты?
установить Firefox, xvfb, selenium
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
selenium_scrape.py
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 block
File "selenium_scrape.py", line 20
box = driver.wait.until(EC.presence_of_element_located(
^
IndentationError: expected an indented block
3 ответов
вопрос (на данный момент) об ошибке вмятины. Это можно легко исправить:
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")
разница в том, что вы не можете использовать упакованный браузера Chrome; нужен специальный драйвер... chromedriver.
получить текущую последнюю версию здесь: Chromedriver
теперь у вас есть 2 варианта: либо переместить загруженный chromedriver, чтобы он всегда был доступен (вариант 1), либо определить в своем скрипте, как получить к нему доступ.
Вариант 1: переместите его в path
затем переместите его так, чтобы он был доступен при использовании webdriver.Chrome()
:
sudo mv /path/to/download/chromedriver /usr/bin
также установите его для выполнения:
chmod a+x /usr/binchromedriver
Вариант 2: не перемещайте его в path
или вы можете определить путь
import os
chr = "/Users/you/Downloads/chromedriver"
os.environ["webdriver.chrome.driver"] = chr
driver = webdriver.Chrome(chromedriver)
(Примечание: первоначальный вопрос был о Chrome, поэтому мой ответ касается Chrome, а не Firefox).
для меня это работает, если я просто извлеку chromedriver в ту же папку, где находится скрипт.
затем я запускаю его, как это
Xvfb :99 -ac -screen 0 1280x1024x16 &
echo 'Starting the test'
PATH=$PATH:. python selenimum_scrape.py
это запустит Xvfb и включит cromedriver в PATH
.
и измененную версию, которая работает для меня:
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()