我正在使用Selenium 2(版本2.33 Python绑定,Firefox驱动程序)编写一个通用的Web抓取器.它应该采用任意 URL,加载页面,并报告所有出站链接.因为URL是任意的,我不能做任何假设任何有关页面的内容,所以通常的建议(等待一个特定的元素存在)不适用.
我有代码,它应该轮询document.readyState直到它达到"完成"或30s超时已经过去,然后继续:
def readystate_complete(d):
# AFAICT Selenium offers no better way to wait for the document to be loaded,
# if one is in ignorance of its contents.
return d.execute_script("return document.readyState") == "complete"
def load_page(driver, url):
try:
driver.get(url)
WebDriverWait(driver, 30).until(readystate_complete)
except WebDriverException:
pass
links = []
try:
for elt in driver.find_elements_by_xpath("//a[@href]"):
try: links.append(elt.get_attribute("href"))
except WebDriverException: pass
except WebDriverException: pass
return links
Run Code Online (Sandbox Code Playgroud)
这种类型的工作,但在五分之一的大约一页,.until呼叫永远挂起.当发生这种情况,通常是浏览器事实上并没有完成加载页面(以下简称"活动指示器"仍是纺),但几十分钟可以去和超时不会触发.但有时页面似乎已完全加载,脚本仍然没有继续.
是什么赋予了?如何使超时可靠地工作?有没有更好的方式来请求等待换页到负载(如果不能对内容做任何假设)?
注意:强迫捕获和忽略WebDriverException已被证明是必要的,以确保它从页面中提取尽可能多的链接,无论页面内的JavaScript是否与DOM做有趣的事情(例如,我曾经得到"陈旧元素" "提取HREF属性的循环中的错误".
注意:这个问题在这个网站和其他地方有很多变化,但是他们都有一个微妙但关键的区别,使得答案(如果有的话)对我没用,或者我已经尝试了这些建议和他们不工作. 请准确回答我提出的问题.