爬虫过程中遇到的错误总结一

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、之后遇到在来加。。。

posted @ 2021-12-17 09:35  堕落先锋  阅读(140)  评论(0编辑  收藏  举报