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

申明

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

案例分析

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

操作步骤

  1. 使用谷歌浏览器打开百度图片网站 https://image.baidu.com
    在这里插入图片描述
  2. 输入"风景", 点击"百度一下"按钮
    在这里插入图片描述
  3. 页面进行跳转
    在这里插入图片描述
  4. 对当前页面页面中的图片地址进行获取, 并保存到本地
  5. 需要进行鼠标滚轮向下滑动

找网页中对应标签的方式

通过F12
在这里插入图片描述

引入依赖

<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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java爬虫是一种利用Java语言编写的爬虫程序,可以用于自动化地获取互联网上的信息。获取网页源代码是Java爬虫程序中的一项基本功能,可以利用Java提供的网络编程和HTML解析库来实现。 Java爬虫获取网页源代码的过程通常分为以下几个步骤: 1. 网络连接:Java爬虫需要通过网络连接到要取的网站,可以使用Java提供的URLConnection或者Apache HttpClient等库进行网络连接。 2. 发起请求:一旦网络连接建立,可以构造HTTP请求,并附上必要的参数和头信息,向服务器发送请求。 3. 接收响应:服务器收到请求后,会返回HTTP响应,Java爬虫需要接收并解析这个响应。 4. HTML解析:HTTP响应中通常包括HTML代码,需要使用HTML解析库(如Jsoup)对其进行解析,提取出需要的内容。 5. 存储数据:Java爬虫通常需要将从网站取的数据存储到数据库或者文件中,以供后续分析和使用。 拆分HTML是指将HTML代码拆分成元素,根据标签将其分解成一棵树形结构,每个节点代表一个元素,例如div、p等。Java提供了很多HTML解析库,如JsoupHtmlUnit等,可以方便地将HTML代码拆分成元素,并通过操作DOM树实现对元素的查找和修改等操作。在Java爬虫中,拆分HTML代码是非常重要的一步,可以大大简化数据的提取和处理过程,从而实现高效、精确的数据抓取。 ### 回答2: Java爬虫是一种程序,能够自动地获取Web页面数据并提取感兴趣的内容。Java爬虫获取源代码的方法是使用Java网络请求库发送HTTP GET请求,并通过响应获取所需的HTML源代码。 拆分HTML源代码的方法通常包括两个步骤。首先,Java爬虫需要使用HTML解析工具(例如Jsoup)将HTML源代码转换成可操作的DOM对象。这样,Java爬虫就可以对HTML进行操作,例如查找特定的元素、获取元素属性或文本内容。 第二步是使用Java爬虫的逻辑或正则表达式进行HTML内容的拆分。拆分HTML的方法通常有两种:一种是通过使用Java的正则表达式库快速地定位所需的内容;另一种方法是使用HTML标签语言对HTML代码进行结构性解析,以此找到我们需要的内容。 在拆分HTML的过程中,Java爬虫需要针对每个网站的HTML源代码进行特定的处理,以确保获取所需信息的准确性和完整性。一般而言,Java爬虫需要根据网站的HTML结构和文件格式,制定适当的策略,确保取数据质量达到预期。 ### 回答3: Java爬虫是一种可以自动化获取网页内容的程序,通常用于获取互联网上的数据和信息,比如抓取网页内容、分析网页结构等。 获取网页内容的第一步是获取源代码,这可以通过Java中的URLConnection或HttpClient等类库实现。这些类库可以建立HTTP连接,获取网页源代码。获取到的源代码通常是一个包含HTML标签和CSS样式等文本字符串。 随后需要对获取的源代码进行解析和处理,这时我们可以选择使用各种类库和工具(比如Jsoup)来解析HTML代码,根据HTML标签来提取所需的数据。这些工具可以方便地捕获网页中的标签、属性、文本等信息,并对其进行处理和转换。 当数据被提取后,我们还需要将其进行处理,主要是拆分HTML文件,分离出所需的内容。这需要使用正则表达式等方法,对提取的数据进行逐一判断,分割。这样我们就可以将网页内容划分为独立的组件,包括标题、文本、图像等,并且可以根据需要进行重新排布。 总的来说,Java爬虫获取网页源代码并拆分HTML是获取网页信息的基本流程。通过各种类库和工具,我们可以轻松地处理原始源代码,提取出所需的数据,并按照需要进行处理和调整,实现对网页信息的自动化采集和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值