我正在使用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秒。但到目前为止,根本没有记录错误。
我试图在网上找到类似的问题和解决方案,但这些都没有帮助。
所以,目前,我有两个问题:
答案 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()同时锁定线程。尽量不要使用睡眠来补偿这样的事情。