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

先贴一段代码

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进行解析拿到想到的内容

下载爬虫图片

1.拿到图片地址,请求图片地址拿到输入流InputStream

            tr.get(1).select("td").get(4).select("img").attr("src");//头像地址
            saveImage( web.getPage(url).getWebResponse().getContentAsStream(),
            "网络路径","本地保存路径")

2.保存到本地,这里没有判断文件夹时候存在

        public static String saveImage(InputStream inputStream,String savePath,String filePath) {
        byte[] data = new byte[1024];
        int len = 0;
        FileOutputStream fileOutputStream = null;
        try {
            String fileName = new Date().getTime() + ".png";
            // 创建保存文件夹
            savePath = savePath + fileName;
            //照片存放地址D:\nginx\www\movies\face
            filePath = filePath + fileName;
            fileOutputStream = new FileOutputStream(filePath);
            while ((len = inputStream.read(data)) != -1) {
                fileOutputStream.write(data, 0, len);

            }
            return savePath;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "";
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }

    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HtmlUnit是一个Java库,用于模拟浏览器的行为,可以用来获取动态HTML。以下是一段示例代码: ```java import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; public class Test { public static void main(String[] args) throws Exception { // 创建一个WebClient实例 WebClient client = new WebClient(); // 启用JS解释器,默认为false client.getOptions().setJavaScriptEnabled(true); // 禁用Css,可避免自动二次请求CSS进行渲染 client.getOptions().setCssEnabled(false); // 获取网页 HtmlPage page = client.getPage("http://example.com"); // 等待JS执行完成 client.waitForBackgroundJavaScript(1000); // 获取当前页面的动态HTML代码 String html = page.asXml(); // 输出HTML代码 System.out.println(html); // 关闭WebClient实例 client.close(); } } ``` 在这个示例代码中,我们首先创建了一个WebClient实例,启用了JavaScript解释器,并禁用了CSS。接下来,使用`client.getPage()`方法获取指定网页的HTML代码,并将其赋值给名为`page`的变量。然后,使用`client.waitForBackgroundJavaScript()`方法等待页面上的所有JavaScript执行完成。最后,使用`page.asXml()`方法获取当前页面的动态HTML代码,并将其赋值给名为`html`的变量。最后,我们输出了HTML代码并关闭了WebClient实例。 需要注意的是,获取动态HTML可能需要一些时间,因此我们使用`client.waitForBackgroundJavaScript()`方法等待页面上的所有JavaScript执行完成。在某些情况下,您可能需要增加等待的时间,以确保所有JavaScript都执行完成。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值