使用Selenium(无头模式)的Firefox

6

如何使用seleniumfirefox来爬取网站?

安装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

你现在遇到了 Python 语法错误,你的代码没有正确缩进。 - Borys Serebrov
try 块中的代码需要和 except 块中的代码缩进方式相同。 - jsfan
你已经接受了一个答案,为什么还要提供赏金? - jsfan
3个回答

4
区别在于您不能使用打包的Chrome浏览器,您需要使用特殊的驱动程序...chromedriver。
在此处获取当前最新版本: Chromedriver 现在您有2个选项,要么将下载的chromedriver移动到始终可访问的位置(选项1),要么在脚本中定义如何访问它。
选项1:将其移入路径中
然后将其移动,以便在使用webdriver.Chrome()时可以访问它。
sudo mv /path/to/download/chromedriver /usr/bin

同时将其设置为可执行:

chmod a+x /usr/binchromedriver

选项2:不将其移动到路径中

或者您可以定义一个路径

import os
chr = "/Users/you/Downloads/chromedriver"
os.environ["webdriver.chrome.driver"] = chr
driver = webdriver.Chrome(chromedriver)

尝试使用搜索命令查找它:apt-cache search chromium - PascalVKooten
没有特别的原因我使用Chrome。你有安装Firefox在Debian上的链接吗? - clarkk
已更新我的问题.. 现在我尝试使用 Firefox.. 已安装 Firefox 但运行脚本时出错 - clarkk
现在出现了缩进错误:try:except:之间的部分应该向右缩进4个空格。 - PascalVKooten
谢谢!它有效了!:) 但是我该如何将HTML输出发送到标准输出? - clarkk
显示剩余11条评论

2

(注:原问题是关于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()

它到底为什么不工作?你遇到了什么错误? - Borys Serebrov
@clarkk 我更新了我的答案,使其能够与 Xvfb 一起工作。在运行脚本之前启动 Xvfb,我使用的端口是:99。在脚本本身中添加 os.environ['DISPLAY'] = ':99' 以在虚拟显示器上运行它,并注释掉此行以查看浏览器 GUI。 - Borys Serebrov

0
问题(目前)是关于缩进错误。这很容易修复:
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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接