我正在尝试使用python中的selenium用javascript来抓取一些动态页面。但是,在我按照pypi页面上的selenium指令(http://pypi.python.org/pypi/selenium)后,我无法调用firefox。我在AWS ubuntu 12.04上安装了firefox。我得到的错误信息是:
In [1]: from selenium import webdriver
In [2]: br = webdriver.Firefox()
---------------------------------------------------------------------------
WebDriverException Traceback (most recent call last)
/home/ubuntu/<ipython-input-2-d6a5d754ea44> in <module>()
----> 1 br = webdriver.Firefox()
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.pyc in __init__(self, firefox_profile, firefox_binary, timeout)
49 RemoteWebDriver.__init__(self,
50 command_executor=ExtensionConnection("127.0.0.1", self.profile,
---> 51 self.binary, timeout),
52 desired_capabilities=DesiredCapabilities.FIREFOX)
53
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/extension_connection.pyc in __init__(self, host, firefox_profile, firefox_binary, timeout)
45 self.profile.add_extension()
46
---> 47 self.binary.launch_browser(self.profile)
48 _URL = "http://%s:%d/hub" % (HOST, PORT)
49 RemoteConnection.__init__(
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.pyc in launch_browser(self, profile)
42
43 self._start_from_profile_path(self.profile.path)
---> 44 self._wait_until_connectable()
45
46 def kill(self):
/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.pyc in _wait_until_connectable(self)
79 raise WebDriverException("The browser appears to have exited "
80 "before we could connect. The output was: %s" %
---> 81 self._get_firefox_output())
82 if count == 30:
83 self.kill()
WebDriverException: Message: 'The browser appears to have exited before we could connect. The output was: Error: no display specified\n'
我在网上搜索过,发现其他人发生了这个问题(https://groups.google.com/forum/?fromgroups=#!topic/selenium-users/21sJrOJULZY)。但我不明白解决方案,如果是的话。
有人能帮帮我吗?谢谢!
答案 0 :(得分:53)
问题是Firefox需要显示。我在我的示例中使用了pyvirtualdisplay来模拟显示。解决方案是:
from pyvirtualdisplay import Display
from selenium import webdriver
display = Display(visible=0, size=(1024, 768))
display.start()
driver= webdriver.Firefox()
driver.get("http://www.somewebsite.com/")
<---some code--->
#driver.close() # Close the current window.
driver.quit() # Quit the driver and close every associated window.
display.stop()
请注意pyvirtualdisplay需要以下后端之一:Xvfb,Xephyr,Xvnc。
这可以解决您的问题。
答案 1 :(得分:4)
我也面临同样的问题。我使用的是Firefox 47和Selenium 2.53。所以我所做的就是将Firefox降级为45.这很有用。
1)首先删除Firefox 47:
sudo apt-get purge firefox
2)检查可用版本:
apt-cache show firefox | grep Version
它将显示可用的Firefox版本,如:
Version: 47.0+build3-0ubuntu0.16.04.1
Version: 45.0.2+build1-0ubuntu1
3)告诉下载哪个版本
sudo apt-get install firefox=45.0.2+build1-0ubuntu1
4)接下来你不必再次升级到新版本。
sudo apt-mark hold firefox
5)如果您想稍后升级
sudo apt-mark unhold firefox
sudo apt-get upgrade
希望这有帮助。
答案 2 :(得分:0)
这已经在OP的问题的评论中,但是要将其作为答案。您可以在后台运行Selenium而无需打开实际的浏览器窗口。
例如,如果您使用Chrome,请设置以下选项:
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.set_headless(headless=False)
然后,当您调用Web驱动程序时,您的设置将成为参数:
browser = webdriver.Chrome(chrome_options=chrome_options)
答案 3 :(得分:0)
对于Debian 10和Ubuntu 18.04,这是一个完整的运行示例:
在〜/ Downloads中下载Chrome驱动程序:
$ wget https://chromedriver.storage.googleapis.com/80.0.3987.16/chromedriver_linux64.zip
用unzip chromedriver_linux64.zip
将文件移动到可执行文件夹(已包含路径):
$ sudo mv chromedriver /usr/local/bin
然后在带有Jupyter的笔记本中或脚本中运行以下代码:
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.set_headless(headless=True)
browser = Chrome(chrome_options=chrome_options)
browser.get('http://www.linkedin.com/')
print(browser.page_source)
这将在页面中打印整个源HTML。