V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tiRolin
V2EX  ›  Java

Selenium 框架做爬虫进行页面跳转时报 stale element not found

  •  
  •   tiRolin · 2023-07-27 16:11:28 +08:00 · 1086 次点击
    这是一个创建于 510 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想要爬取这个网址的日报周报月报信息: http://zdscxx.moa.gov.cn:8080/nyb/pc/messageList.jsp?item=%E6%9C%80%E6%96%B0%E5%8F%91%E5%B8%83&isLatestMessage=true

    我打算先爬取一个日报的内容来看看有什么问题,为此构建了下面的代码

    public class Crawler {
        public static void main(String[] args) {
            System.getProperties().setProperty("webdriver.chrome.driver", "D:\\pachong\\new\\chromedriver.exe");
            ChromeOptions options = new ChromeOptions();
            options.addArguments("--remote-allow-origins=*");
            ChromeDriver chromeDriver = new ChromeDriver(options);
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String originUrl = "http://zdscxx.moa.gov.cn:8080/nyb/pc/messageList.jsp?item=%E6%9C%80%E6%96%B0%E5%8F%91%E5%B8%83&isLatestMessage=true";
            chromeDriver.get(originUrl);
    
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            WebElement button = chromeDriver.findElement(By.xpath("/html/body/div[1]/div[2]/div[1]/div[2]/ul/li[3]"));
            button.click(); //此处可以正确跳转
    
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            WebElement element = chromeDriver.findElement(By.xpath("//*[@id=\"dataTable\"]/li[1]")); //用 xpath 获取第一条日报数据
            System.out.println(element.getText()); //有数据,说明正确获取到了元素
    //        element.click(); 此处报 stale element not found 异常
            System.out.println();
            WebElement a = element.findElement(By.cssSelector("a")); //获取元素内部的元素
            System.out.println(a.getText()); //有数据,正确获取到了元素
            System.out.println();
            System.out.println(a.getAttribute("href"));
    //        a.click(); 此处还是报 stale element not found 异常
    
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            chromeDriver.quit();
        }
    }
    

    我上面的代码的逻辑是先获取到分析报告日报的元素,然后执行点击操作,然后获取到第一条数据执行点击,但是在获取第一条数据点击那里就会一直报 stale element not found 的问题,我找不到网址没法通过网址直接跳转,因为这个网址的 href 属性里没有网址,而是 javascript:void(0);

    分析报告日报这个元素里的 href 也是 javascript:void(0);,但是在这个元素里是调用 click()是可以正确跳转的,但是在日报数据里的元素却不行

    我试了很多方法了,仍然没有进展,我真没办法了所以来问问个各位,麻烦懂得大佬能不吝赐教,小弟先谢过了

    7 条回复    2023-07-29 13:16:11 +08:00
    kanchi240
        1
    kanchi240  
       2023-07-27 16:42:57 +08:00
    // element.click(); 此处报 stale element not found 异常
    我这正常没报错,用的是 python
    deplivesb
        2
    deplivesb  
       2023-07-27 16:49:45 +08:00
    每日一遍:gov 的也敢
    pierswu
        3
    pierswu  
       2023-07-27 16:53:10 +08:00
    说明这个 a 标签是通过绑定事件实现的页面跳转,不是 href 属性
    godspeedyou
        4
    godspeedyou  
       2023-07-27 16:53:48 +08:00
    用 selenium IDE 模拟下,直接帮你生成代码
    kuan
        5
    kuan  
       2023-07-28 09:01:06 +08:00
    你通过"//*[@id=\"dataTable\"]/li[1]"获取的元素是 li 可以拿到下面的文字信息,但是跳转是点击下面的 a 标签,所以你"//*[@id=\"dataTable\"]/li[1]/a"这样就好了
    duan602728596
        6
    duan602728596  
       2023-07-28 10:53:54 +08:00
    讲道理,这个网站还没复杂到需要上 Selenium 的程度,上 Selenium 那是已经和反爬对抗的程度了。
    kachu673
        7
    kachu673  
       2023-07-29 13:16:11 +08:00
    gov 的新手还是别爬了,控制不好频率,容易进去。工作几年的老手都轻易不碰这种项目。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1787 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:26 · PVG 00:26 · LAX 08:26 · JFK 11:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.