python selenium,Firefox突然变得空白并停止工作

时间:2017-03-10 06:26:48

标签: python selenium firefox browser

我正在使用python selenium来解析来自10,000多个网址的大量数据。浏览器是Firefox。

对于每个网址,将打开一个Firefox浏览器,在数据解析后,它将被关闭,等待5秒后再通过Firefox打开下一个网址。

然而,这几天发生了两次,一切都运行良好,突然之间,新打开的浏览器是空白的,根本没有加载网址。在现实生活中,有时候,即使我手动打开浏览器,搜索某些内容,它也是空白的。

问题是,当发生这种情况时,根本没有错误,即使我编写了except代码来捕获任何异常,同时我使用nohup命令来运行代码,它将会记录任何异常,但根本没有错误。一旦发生这种情况,代码就不再被执行了,许多网址都被留在那里而没有被解析....如果我在其余的网址上重新运行代码,它再次正常工作。

这是我的代码(所有10,000多个网址都在comment_urls列表中):

for comment_url in comment_urls:
    driver = webdriver.Firefox(executable_path='/Users/devadmin/Documents/geckodriver')
    driver.get(comment_url)
    time.sleep(5)
    try:
       // here is my data parsing code .....
       driver.quit()   // the browser will be closed when the data has been parsed
       time.sleep(5)   // and wait 5 secods

    except:
        with open(error_comment_reactions, 'a') as error_output:
            error_output.write(comment_url+"\n")
        driver.quit()
        time.sleep(5)

同时,在该数据解析部分,如果有任何异常,我的代码也会记录异常并关闭驱动程序,等待5秒。但到目前为止,根本没有记录错误。

我试图在网上找到类似的问题和解决方案,但这些都没有帮助。

所以,目前,我有两个问题:

  1. 你以前遇到过这个问题吗?你知道如何应对吗?是网络问题还是硒问题还是浏览器问题?
  2. 或者无论如何在python中,它可以告诉浏览器没有加载网址,它会关闭它吗?

2 个答案:

答案 0 :(得分:0)

对于第二个问题,首选使用工作队列来解析网址。一个应用程序应该将所有这些添加到队列(redis,rabbit-mq,amazon sqs等),然后第二个应用程序应从队列中获取1个url并尝试解析它。如果它成功,它应该从队列中删除url并切换到队列中的其他url。如果出现异常,应该通过os.exit(1)来停止app。使用shell运行第二个应用程序,当它返回1时,表示发生错误,重新启动应用程序。 Shell脚本:Get exit(1) from Python in shell

答案 1 :(得分:0)

回答你的两个问题:

1)是的我发现硒有时难以预测。这在我第一次打开浏览器时通常是个问题,我将在我的解决方案中讨论。除非你需要,否则尽量不要关闭浏览器。

2)是的,您可以在selenium.webdriver.support.wait中使用WebDriverWait()类

你说你正在解析成千上万的评论,所以只需用你打开的webdriver发出一个新的get请求。

我在我自己的刮刀中使用以下代码:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

browser = webdriver.Firefox()
browser.get("http://someurl.com")
table = WebDriverWait(browser,60).until(EC.presence_of_element_located((By.TAG_NAME, "table")))`

变量浏览器只是webdriver.Firefox()类。

它有点长,但它的作用是等待页面上存在特定的html标记,超时为60秒。

您可能正在经历自己的time.sleep()同时锁定线程。尽量不要使用睡眠来补偿这样的事情。

相关问题