1、 场景:爬取的是一个具有多个公告的网站,检索出来的信息以js渲染出来的数据,多个分页的场景。
首先用selenium获取了第一页的信息,之后对第一页的多个标题进去爬取数据,爬取每个分页,在第一页
所有信息界面爬取结束后,进行翻页爬取,如此到最后一页。
stale element reference:element is not attached to the page document问题:
这个错误是在遍历第一页的分页时候,当从第一个标题明细进去之后返回报的错误,需要对当前的driver对象进行重新定位
解决。解决过程中我增加了对当前页面的显示等待功能。具体代码如下,加入显示等待是为了更加符合逻辑吧,可能不加也
可以照常运行,这个里面最关键的就是重新定位。
# 解析元素 element_a是获取的每一页的所有的element集合
element_a = self.driver.find_elements(By.XPATH, '//div[@class="title"]/a[@class="fontlan"]')
for i in range(len(element_a)):
element_a = self.driver.find_elements(By.XPATH, '//div[@class="title"]/a[@class="fontlan"]') # 重新定位获取一下(比较关键)
# 进入了子页面
if element_a[i].get_attribute('href'):
print('child pages ~~~~~~~~~~~~~', type(element_a[i].get_attribute('href')), element_a[i].get_attribute('href'))
self.driver.get(element_a[i].get_attribute('href'))
wait1 = WebDriverWait(self.driver, 10)
wait1.until(EC.presence_of_all_elements_located((By.XPATH, '//p')))
child_element_title = self.driver.find_element(By.XPATH, '//h1/span')
child_element_content = self.driver.find_element(By.XPATH, '//p')
title = child_element_title.get_attribute('text')
content = child_element_content.get_attribute('text')
# print(title, content)
# 都不为空时候创建
if title and content:
with open('./motfiles/' + str(title) + '.txt', 'a+', encoding='utf-8') as f:
f.write('\n'.join(content))
self.driver.back()
# 每一页都让变为可点击的,最长等待时间为10s
wait = WebDriverWait(self.driver, 10) # 显示最长等待时间10s如出来就直接走,没有出来报异常
wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(),'下一页')]")))
2、之后遇到在来加。。。