欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java使用htmlunit+Jsoup爬虫,爬取ajax动态数据

程序员文章站 2022-03-02 21:08:37
...

先贴一段代码

WebClient web = new WebClient(BrowserVersion.FIREFOX_38);
        try {
            long startTime = System.currentTimeMillis();    //获取开始时间
            web.getOptions().setJavaScriptEnabled(true); //启用JS解释器,默认为true
            web.setJavaScriptTimeout(20000);//设置JS执行的超时时间
            web.getOptions().setThrowExceptionOnFailingStatusCode(false);//当HTTP的状态非200时是否抛出异常, 这里选择不需要
            web.getOptions().setActiveXNative(false);
            web.getOptions().setCssEnabled(false); //禁用css支持
            web.addRequestHeader("User-Agent", " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36");
            web.getOptions().setThrowExceptionOnScriptError(false); //js运行错误时,是否抛出异常
            web.getOptions().setTimeout(10000); //设置连接超时时间 ,这里是10S。如果为0,则无限期等待
            web.setAjaxController(new NicelyResynchronizingAjaxController());//设置支持AJAX
            HtmlPage htmlpage = web.getPage("");//爬取url地址
            HtmlForm from = htmlpage.getElementByName("loginForm");
            HtmlInput loginId = from.getInputByName("username");//获取用户名输入框
            HtmlInput pwd = from.getInputByName("password");//获取密码输入框
            loginId.setValueAttribute(number);//用户名
            pwd.setValueAttribute(password);//密码
            HtmlPage hhtmlPage = from.getInputByName("submitBtn").click();//模拟点击登录
            DataInfo dataInfo = new DataInfo();
            //以下代码为了判断点击登录后页面还未加载出来,进行重试操作,最大重试次数5次
            int s = 0;
            while (hhtmlPage.getByXPath("//div[@class='personal-list']/a").size() < 1) {
                if (s > 5) {
                    dataInfo.setSuccess("time");
                    return dataInfo;
                }
                if (hhtmlPage.asXml().contains("密码错误") || hhtmlPage.asXml().contains("账户不存在")) {
                    dataInfo.setSuccess("password");
                    return dataInfo;
                }
                Thread.sleep(500);
                System.out.println("----------------------等待尝试重新点击");
                hhtmlPage = from.getInputByName("submitBtn").click();//模拟点击登录
                s++;
            }
              HtmlPage htmlpage2 = web.getPage("");//登录成功进入下一个页面,获取信息
            String str = htmlpage2.asXml();
            Document doc = Jsoup.parse(str);
            Elements tr = doc.getElementById("studentInfoTb").select("tr");
            StudentInfo studentInfo = new StudentInfo();
            studentInfo.setNumber(tr.get(1).select("td").get(1).text());//学号
            studentInfo.setName(tr.get(1).select("td").get(3).text());//姓名

大概逻辑就是使用htmlunit模拟浏览器进行请求,请求成功后返回html代码使用Jsoup进行解析拿到想到的内容

相关标签: java 爬虫