java使用htmlunit + jsoup 爬网站图片案例(爬虫学习)

这篇具有很好参考价值的文章主要介绍了java使用htmlunit + jsoup 爬网站图片案例(爬虫学习)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

申明

该文章用于自己学习爬虫使用

案例分析

目的: 从百度图片中搜索"风景"并下载图片到本地
思路: 使用htmlunit进行模拟用户操作, 并使用jsoup对数据进行解析,获取到需要的数据后,再下载到本地保存
htmlunit官网
jsoup官网

操作步骤

  1. 使用谷歌浏览器打开百度图片网站 https://image.baidu.com
    java使用htmlunit + jsoup 爬网站图片案例(爬虫学习),java,爬虫,学习
  2. 输入"风景", 点击"百度一下"按钮
    java使用htmlunit + jsoup 爬网站图片案例(爬虫学习),java,爬虫,学习
  3. 页面进行跳转
    java使用htmlunit + jsoup 爬网站图片案例(爬虫学习),java,爬虫,学习
  4. 对当前页面页面中的图片地址进行获取, 并保存到本地
  5. 需要进行鼠标滚轮向下滑动

找网页中对应标签的方式

通过F12
java使用htmlunit + jsoup 爬网站图片案例(爬虫学习),java,爬虫,学习

引入依赖

<dependency>
          <!-- jsoup HTML parser library @ https://jsoup.org/ -->
          <groupId>org.jsoup</groupId>
          <artifactId>jsoup</artifactId>
          <version>1.16.1</version>
        </dependency>

        <dependency>
            <groupId>net.sourceforge.htmlunit</groupId>
            <artifactId>htmlunit</artifactId>
            <version>2.41.0</version>
        </dependency>

代码

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * desc:
 *
 * @author qts
 * @date 2023/7/20 0020
 */
public class CrawlerTest {

    public static void main(String[] args) throws IOException {

        // ======== htmlunit 操作 start ============
        
        // 创建htmlunit 客户端, 指定浏览器(当前为谷歌浏览器)
        WebClient webClient = new WebClient(BrowserVersion.CHROME);

        // 设置客户端配置
        webClient.getOptions().setCssEnabled(false);//(屏蔽)css 因为css并不影响我们抓取数据 反而影响网页渲染效率
        webClient.getOptions().setThrowExceptionOnScriptError(false);//(屏蔽)异常
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//(屏蔽)日志
        webClient.getOptions().setJavaScriptEnabled(true);//加载js脚本
        webClient.getOptions().setTimeout(5000);//设置超时时间
        webClient.getOptions().setRedirectEnabled(true); //允许重定向
        webClient.getCookieManager().setCookiesEnabled(true);//允许cookie
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());//设置ajax

        // 请求网站获取HtmlPage
        HtmlPage htmlPage = webClient.getPage("https://image.baidu.com/");
        // 获取输入框对应的表单
        HtmlForm homeSearchForm = (HtmlForm) htmlPage.getElementById("homeSearchForm");
        // 获取对应输入框
        HtmlTextInput searchInput = (HtmlTextInput) homeSearchForm.getElementsByAttribute("input", "id", "kw").get(0);
        // 设置输入框内容"风景"
        searchInput.setValueAttribute("风景");

        // 获取搜索按钮"百度一下"
        HtmlSubmitInput searchSubmitInput = htmlPage.querySelector("input.s_newBtn");
        // 点击按钮
        HtmlPage resultHome = searchSubmitInput.click();

        // 执行js 向下滚屏(因为页面的图片是通过滚屏进行刷新的,不滚屏后面的图片没有对应的地址数据) 
        // window.scrollTo(0, document.documentElement.scrollHeight) 滑动到底部,可以在页面F12控制台中执行代码测试
        resultHome.executeJavaScript("window.scrollTo(0,6000)");// 执行js 向下滚屏,自行设置对应值,当前仅做测试使用
		
        //主线程休眠10秒 让客户端有时间执行js代码
        webClient.waitForBackgroundJavaScript(10000);

        // ======== htmlunit 操作 end ============

        // ======== jsoup 解析 start ============

        // 解析html页面得到 Document
        Document doc = Jsoup.parse(resultHome.asXml());

        // 获取图片 img元素
        Elements elements = doc.select("img[class='main_img img-hover']");


        // 处理图片
        for (int i = 0; i < elements.size(); i++) {
            Element element = elements.get(i);
            String url = element.attr("src");

            if (!url.startsWith("http")) {
                // 有些广告是用的base64数据,进行排除
                continue;
            }

            InputStream inputStream = getFileInputStream(url);

            if (inputStream != null) {
                FileUtil.writeBytes(readBytes(inputStream),"D:\\baidu_pic\\pic_"+i+".png");
            }
        }

        // ======== jsoup 解析 end ============
    }

    /*读取网络文件*/
    public static InputStream getFileInputStream(String path) {
        URL url;
        try {
            url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //设置超时间为3秒
            conn.setConnectTimeout(3 * 1000);
            //防止屏蔽程序抓取而返回403错误
            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            //得到输入流
            return conn.getInputStream();
        } catch (Exception e) {
            Console.error("读取网络文件异常:" + path);
        }
        return null;
    }

    /**
     * 读取输入流到字节数组
     *
     * @param in
     * @return
     * @throws IOException
     */
    public static byte[] readBytes(InputStream in) throws IOException {
        //读取字节的缓冲
        byte[] buffer = new byte[1024];
        //最终的数据
        byte[] result = new byte[0];
        int size = 0;
        while ((size = in.read(buffer)) != -1) {
            int oldLen = result.length;
            byte[] tmp = new byte[oldLen + size];
            if (oldLen > 0) {//copy 旧字节
                System.arraycopy(result, 0, tmp, 0, oldLen);
            }
            //copy 新字节
            System.arraycopy(buffer, 0, tmp, oldLen, size);

            result = tmp;
        }
        return result;
    }

}

htmlunit使用参考: https://blog.csdn.net/weixin_44787678/article/details/106994485文章来源地址https://www.toymoban.com/news/detail-610581.html

到了这里,关于java使用htmlunit + jsoup 爬网站图片案例(爬虫学习)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • java爬虫(jsoup)如何设置HTTP代理ip爬数据

    java爬虫(jsoup)如何设置HTTP代理ip爬数据

    目录 前言 什么是HTTP代理IP 使用Jsoup设置HTTP代理IP的步骤 1. 导入Jsoup依赖 2. 创建HttpProxy类 3. 设置代理服务器 4. 使用Jsoup进行爬取 结论 在Java中使用Jsoup进行网络爬虫操作时,有时需要使用HTTP代理IP来爬取数据。本文将介绍如何使用Jsoup设置HTTP代理IP进行爬取,并提供相关代码

    2024年01月21日
    浏览(10)
  • Jsoup使用教程以及使用案例

    Jsoup使用教程以及使用案例

    jsoup 是一款基于 Java 的HTML解析器,它提供了一套非常省力的API,不但能直接解析某个URL地址、HTML文本内容,而且还能通过类似于DOM、CSS或者jQuery的方法来操作数据,所以 jsoup 也可以被当做爬虫工具使用,从网站获取dom结构,从而解析下载数据。 从 URL、文件或字符串中抓取

    2024年01月18日
    浏览(27)
  • Java网络爬虫——jsoup快速上手,爬取京东数据。同时解决‘京东安全’防爬问题

    Java网络爬虫——jsoup快速上手,爬取京东数据。同时解决‘京东安全’防爬问题

    网络爬虫,就是在 浏览器上,代替人类爬取数据 ,Java网络爬虫就是通过Java编写爬虫代码,代替人类从网络上爬取信息数据。程序员通过设定既定的规则,让程序代替我们从网络上获取海量我们需要的数据,比如图片,企业信息等。 爬虫的关键是对于网页信息的解析。 什么

    2024年02月10日
    浏览(11)
  • 爬虫案例-使用Session登录指定网站(JS逆向AES-CBC加密+MD5加密)

    爬虫案例-使用Session登录指定网站(JS逆向AES-CBC加密+MD5加密)

    总体概览:使用Session登录该网站,其中包括对password参数进行js逆向破解                 (涉及加密:md5加密+AES-CBC加密) 难度:两颗星 目标网址:aHR0cHM6Ly93d3cuZnhiYW9nYW8uY29tLw== 下面文章将分为四个部分:         1、定位主体加密函数,进行断点         2、分

    2024年02月09日
    浏览(11)
  • SpringBoot、Java 使用 Jsoup 解析 HTML 页面

    SpringBoot、Java 使用 Jsoup 解析 HTML 页面

    什么是 Jsoup? Jsoup 是一个用于处理 HTML 页面的 Java 库,它提供了简单的 API,使得从 HTML 中提取数据变得非常容易。无论是获取特定标签的内容还是遍历整个页面的元素,Jsoup 都能轻松胜任。 如何使用 Jsoup 解析 HTML 页面? 首先,确保你的 Java 项目中已经添加了 Jsoup 的依赖。

    2024年02月13日
    浏览(11)
  • 使用爬虫代码获得深度学习目标检测或者语义分割中的图片。

    使用爬虫代码获得深度学习目标检测或者语义分割中的图片。

    问题描述:目标检测或者图像分割需要大量的数据,如果手动从网上找的话会比较慢,这时候,我们可以从网上爬虫下来,然后自己筛选即可。 代码如下(不要忘记安装代码依赖的库): 这里以搜索明星的图片为例,运行代码,然后根据提示输入搜索图片的名字→搜索图片

    2024年02月10日
    浏览(15)
  • 爬虫案例—抓取找歌词网站的按歌词找歌名数据

    爬虫案例—抓取找歌词网站的按歌词找歌名数据

    找个词网址:https://www.91ge.cn/lxyyplay/find/ 目标:抓取页面里的所有要查的歌词及歌名等信息,并存为txt文件 一共46页数据 网站截图如下: 抓取完整歌词数据,如下图: 源码如下: 运行结果如下图: 利用协程抓取数据,效率很高。

    2024年01月24日
    浏览(8)
  • 爬虫案例—表情党图片data-src抓取

    爬虫案例—表情党图片data-src抓取

    表情党网址:https://qq.yh31.com 抓取心情板块的图片data-src 由于此页面采用的是懒加载技术,为了节省网络带宽和减轻服务器压力。不浏览的图片,页面不加载,统一显示LOADING…。如下图: 按F12(谷歌浏览器)通过分析,表情图片的真正链接为data-src 通过分析,在搜索框里输入

    2024年01月16日
    浏览(9)
  • java中使用Jsoup和Itext实现将html转换为PDF

    java中使用Jsoup和Itext实现将html转换为PDF

    1.在build.gradle中安装所需依赖: 2.创建工具类,实现转换方法 3.base64过滤类: 4.字体类代码,window用户可在C:windowsfont中寻找自己所需字体即可。我这里用的为黑体: simhei.ttf 效果如下: html页面预览: pdf页面预览:    

    2024年02月14日
    浏览(9)
  • 使用Java Jsoup读取小说内容并保存到本地,使用idea插件thief-book-idea看小说

    使用Java Jsoup读取小说内容并保存到本地,使用idea插件thief-book-idea看小说

    摸鱼时看小说非常不方便,就突发奇想怎么能在工作软件上看呢,于是去查询了资料。 在idea上面看小说需要安装插件thief-book-idea,但是这个插件不能在线阅读,需要导入小说进去,所以就想到了把小说下载下来,然后导入插件中 废话不多说,先看代码: 1.我使用的是spring

    2024年04月28日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包