爬取过程中出现stale element reference: element is not attached to the page document 错误

发布时间 2023-05-05 17:05:45作者: 青棠

Bug实际情况描述如下:当我想爬取信息类型中的6个元素时,使用这样的

1 smallClassList = seleniumService.waitFindElements(bidCrawler.getSmallClassTag());
2 for (WebElement smallLi : smallClassList) {
3                         try {
4                             Thread.sleep(1000);
5                             if (smallLi.getText().contains("全部") || smallLi.getText().contains("不限") ) {
6                                 continue;
7                             }
8                             business.setSrcSmallClass(smallLi.getText());
9                             smallLi.click();
View Code

业务逻辑代码时,会在后续的遍历过程中出现页面元素过期,导致无法找到后续元素。

解决方案:需要在每次遍历时重新过去页面元素,以避免页面元素失效的情况,故本人采用了下面的业务逻辑:

 1 for(int i = 0 ;i < num; i++){
 2             //for (WebElement smallLi : smallClassList) {
 3                 smallClassList = seleniumService.driver.findElements(By.cssSelector(bidCrawler.getSmallClassTag()));
 4                 try {
 5                     Thread.sleep(500);
 6                 } catch (InterruptedException e) {
 7                     e.printStackTrace();
 8                 }
 9                 if (smallClassList.get(i).getText().contains("全部") || smallClassList.get(i).getText().contains("不限")) {
10                     continue;
11                 }
12                 business.setSrcSmallClass(smallClassList.get(i).getText());
13 
14                 smallClassList.get(i).click();
View Code

总结:页面资源爬取过程中,已获取的元素会产生过期失效的情况,从而导致已获取的元素不再依附于新页面,因此在爬取的过程中需要格外注意。