我已经在官方文档中了解了StaleElementReferenceException,但是我仍然不明白为什么我的代码会引发此异常? browser.get()
实例化一个新蜘蛛吗?
class IndiegogoSpider(CrawlSpider):
name = 'indiegogo'
allowed_domains = [ 'indiegogo.com' ]
start_urls = [ 'https://www.indiegogo.com/explore/all?project_type=all&project_timing=all&sort=trending' ]
def parse(self, response):
if (response.status != 404):
options = Options()
options.add_argument('-headless')
browser = webdriver.Firefox(firefox_options=options)
browser.get(self.start_urls[0])
show_more = WebDriverWait(browser, 10).until(
EC.element_to_be_clickable((By.XPATH, '//div[@class="text-center"]/a'))
)
while True:
try:
show_more.click()
except Exception:
break
hrefs = WebDriverWait(browser, 60).until(
EC.visibility_of_all_elements_located((By.XPATH, '//div[@class="discoverableCard"]/a'))
)
for href in hrefs:
browser.get(href.get_attribute('href'))
#
# will be scraping individual pages here
#
browser.close()
我尝试以下操作均无济于事。我也尝试过将links
变量放在脚本的其他位置,但范围不同,也无济于事。
links = []
for href in hrefs:
links.append(href.get_attribute('href'))
for link in links:
browser.get(href.get_attribute('href'))
#
# will be scraping individual pages here
#
不确定为什么从存储器中删除了hrefs
,尤其是links
吗?当我提取href
中可迭代的每个项目的hrefs
属性的值,然后将所有URL粘贴在links
变量中时,links
不应列表是否与DOM和页面更改无关?
目前不确定该怎么办。有什么想法吗?
答案 0 :(得分:1)
@Anthony,您的第二个带有links
的代码块应该可以正常工作,就像您遇到复制/粘贴错误一样:
for link in links:
browser.get(href.get_attribute('href'))
应该是
for link in links:
browser.get(link)
...
答案 1 :(得分:1)
正如文献所述:
在以下两种情况之一中会引发陈旧元素引用异常,第一种情况比第二种情况更常见:
您的情况是:
这是因为browser.get(href.get_attribute('href'))
。当您重定向到另一个页面时,您的DOM将被完全重新加载,并且hrefs
不会引用上一页中的元素。这就是为什么您会遇到错误。
如何处理此错误?您可以这样:
links = []
for href in hrefs: # store all links as a strings
links.append(href.get_attribute('href'))
for link in links: # then just use them
browser.get(link)