2015-11-19 90 views
1

我正在使用Scrapy來滿足我的爬行需求。對於動態網頁,我使用Selenium在Firefox中加載頁面。由於代碼將在AWS實例上運行,因此我使用PyVirtualDisplay爲Firefox創建虛擬顯示。整個過程在幾個月內運行良好,直到今天停止,沒有任何代碼修改。無法從Scrapy腳本啓動Firefox,但它從命令行運行良好

現在,當我使用命令scrapy crawl amazon運行我的履帶,我得到一個錯誤說:

消息:瀏覽器似乎已經離開我們可以連接之前。 如果您在FirefoxBinary構造函數中指定了一個log_file,請參閱 瞭解詳細信息。

所以我試着檢查它是否能在shell上工作。我致力於:

scrapy shell <url> 
>>> from selenium import webdriver 
>>> from pyvirtualdisplay import Display 
>>> display = Display(visible=0, size=(800, 600)) 
>>> display.start() 
<Display cmd_param=['Xvfb', '-br', '-screen', '0', '800x600x24', ':106835'] cmd=['Xvfb', '-br', '-screen', '0', '800x600x24', ':106835'] oserror=None returncode=None stdout="None" stderr="None" timeout=False> 
>>> browser = webdriver.Firefox() 
>>> browser.get(response.url) 

正如你所看到的,firefox窗口在這裏打開沒有任何錯誤。在這之後,我甚至可以看到firefox作爲一個進程運行。

ps -ef | grep的火狐

的ubuntu 26377 24202 42 19:12 PTS/1 00:00:01 /usr/lib中/火狐/火狐-foreground

的ubuntu 26435 31306 0 19:12 PTS/0 00:00: 00 grep --color = auto firefox

我甚至可以找到元素,並通過shell完成所有工作。爲什麼通過腳本不能完成相同的工作?

回答

1

所以最後很多實驗後,我發現一些作品(不知道爲什麼雖然)。

上述方式通過Shell工作,但不通過腳本。如果我通過明確指定Firefox Binary來創建Webdriver對象,它就可以工作。下面是此代碼:

from selenium.webdriver.firefox.firefox_binary import FirefoxBinary 
log_file = open('/home/ubuntu/log.txt','w') 
binary = FirefoxBinary('/usr/bin/firefox', log_file=log_file) 
browser = webdriver.Firefox(firefox_binary=binary) 
browser.get(url) 

這工作得很好。如果有人可以分享他們的想法,爲什麼這隻會這樣工作,我會很感激。

0

您的代碼確實對我有用。您也可以嘗試關閉顯示器和瀏覽器:

from selenium import webdriver 
from pyvirtualdisplay import Display 

display = Display(visible=0, size=(1024, 768)) 
display.start() 
browser = webdriver.Firefox() 
browser.get(response.url) 
browser.close() 
display.close() 
+0

謝謝你回覆@Rahul。 是的,我可以關閉瀏覽器並使用'browser.close()'和'display.stop()'顯示。事實上,該腳本在另一個具有完全相同配置的系統上工作正常。正如我所說,它也用於這個系統的工作,但由於某種原因現在不工作。 –

相關問題