JAVA网络爬爬学习之HttpClient+Jsoup

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA网络爬爬学习之HttpClient+Jsoup相关的知识,希望对你有一定的参考价值。


HttpClient用法简单整理

引入HttpClient和日志依赖

    <dependencies>
<!--        HttpClient-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.13</version>
        </dependency>
        <!-- 日志 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>
    </dependencies>

GET请求

无参

public class Main

    public static void main(String[] args)
    
        //1.创建默认的HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //2.创建HttpGet请求
        HttpGet httpGet=new HttpGet("https://blog.csdn.net/m0_53157173");

        try(
                //3.使用HttpClient发请求
            CloseableHttpResponse  response = httpClient.execute(httpGet);)
        
            //判断响应状态码是否为200
            if(response.getStatusLine().getStatusCode()==200)
            
                //如果为200表示请求成功,获取返回数据
                HttpEntity entity = response.getEntity();
                //使用工具类
                String content = EntityUtils.toString(entity,"UTF-8");
                //打印数据内容
                System.out.println(content);
            

         catch (IOException e) 
            e.printStackTrace();
        finally 
            try 
                httpClient.close();
             catch (IOException e) 
                e.printStackTrace();
            
        
    


带参


另一种写法:

       //带参
        URIBuilder urIBuilder=new URIBuilder("https://blog.csdn.net/m0_53157173/article/details/121876392");
           urIBuilder.setParameter("name","大忽悠").setParameter("age","18");
        //2.创建HttpPOST请求
        HttpGet httpGet=new HttpGet(urIBuilder.build());

POST请求

无参


带参

        //2.创建HttpPOST请求
        HttpPost httpPost=new HttpPost();
        //声明存放参数的List集合
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("keys", "java"));
        //创建表单数据Entity
        UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params, "UTF-8");
        //设置表单Entity到httpPost请求对象中
        httpPost.setEntity(formEntity);

连接池

如果每次请求都要创建HttpClient,会有频繁创建和销毁的问题,可以使用连接池来解决这个问题。

public class Main

    public static void main(String[] args) 
        //连接池管理器
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();

        //设置最大连接数
        cm.setMaxTotal(200);

        //设置每个主机的并发数
        cm.setDefaultMaxPerRoute(20);

        doGet(cm);

        doGet(cm);

    

    private static void doGet(PoolingHttpClientConnectionManager cm) 
        CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();

        HttpGet httpGet = new HttpGet("https://www.baidu.com");

        CloseableHttpResponse response = null;

        try 
            response = httpClient.execute(httpGet);

            // 判断状态码是否是200
            if (response.getStatusLine().getStatusCode() == 200) 
                // 解析数据
                String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println(content.length());
            


         catch (Exception e) 
            e.printStackTrace();
         finally 
            //释放连接
            if (response == null) 
                try 
                    response.close();
                 catch (IOException e) 
                    e.printStackTrace();
                
                //不能关闭HttpClient
                //httpClient.close();
            
        
    


请求request的相关配置

有时候因为网络,或者目标服务器的原因,请求需要更长的时间才能完成,我们需要自定义相关时间

public static void main(String[] args) throws IOException 
    //创建HttpClient对象
 CloseableHttpClient httpClient = HttpClients.createDefault();

    //创建HttpGet请求
    HttpGet httpGet = new HttpGet("http://www.itcast.cn/");

    //设置请求参数
    RequestConfig requestConfig = RequestConfig.custom()
            .setConnectTimeout(1000)//设置创建连接的最长时间
            .setConnectionRequestTimeout(500)//设置获取连接的最长时间
            .setSocketTimeout(10 * 1000)//设置数据传输的最长时间
            .build();

    httpGet.setConfig(requestConfig);

    CloseableHttpResponse response = null;
    try 
        //使用HttpClient发起请求
        response = httpClient.execute(httpGet);

        //判断响应状态码是否为200
        if (response.getStatusLine().getStatusCode() == 200) 
            //如果为200表示请求成功,获取返回数据
            String content = EntityUtils.toString(response.getEntity(), "UTF-8");
            //打印数据长度
            System.out.println(content);
        

     catch (Exception e) 
        e.printStackTrace();
     finally 
        //释放连接
        if (response == null) 
            try 
                response.close();
             catch (IOException e) 
                e.printStackTrace();
            
            httpClient.close();
        
    


httpclient用法详解

HttpClient详细使用示例

111

HttpClient用法–这一篇全了解(内含例子)

HttpClient高并发-httpClient连接池

httpclient架构原理介绍 & 连接池详解


Jsoup用法简单整理

我们抓取到页面之后,还需要对页面进行解析。可以使用字符串处理工具解析页面,也可以使用正则表达式,但是这些方法都会带来很大的开发成本,所以我们需要使用一款专门解析html页面的技术。

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

jsoup的主要功能如下:

  • 从一个URL,文件或字符串中解析HTML;
  • 使用DOM或CSS选择器来查找、取出数据;
  • 可操作HTML元素、属性、文本;

先加入依赖:

<!--Jsoup-->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.3</version>
</dependency>
<!--测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
<!--工具-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

jsoup解析

解析URL

Jsoup可以直接输入url,它会发起请求并获取数据,封装为Document对象

public class Main

    public static void main(String[] args) throws IOException 
        //解析url地址
        Document document = Jsoup.parse(new URL("https://www.baidu.com/"), 1000);

        //获取title的内容
        Element title = document.getElementsByTag("title").first();
        System.out.println(title.text());
    


解析字符串

先准备以下html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="">
    <title>测试文件</title>
    <link rel="stylesheet" href="css/sb-admin-2.css">
    <link rel="stylesheet" href="bootstrap-4.6.0-dist/css/bootstrap.min.css">

</head>

<body class="bg-gradient-primary">

</body>
</html>
String fileToString = FileUtils.
readFileToString(new File("C:\\\\\\\\Users\\\\\\\\zdh\\\\\\\\Desktop\\\\\\\\test.html"), Charset.defaultCharset());
        Document document = Jsoup.parse(fileToString);

        System.out.println(document.body());

解析文件

      //解析文件
        Document document = Jsoup.parse(new File("C:\\\\Users\\\\zdh\\\\Desktop\\\\test.html"), "UTF-8");

        String html = document.getElementsByTag("title").first().html();
        System.out.println(html);

使用dom方式遍历文档

元素获取

  • 1.根据id查询元素getElementById
  • 2.根据标签获取元素getElementsByTag
  • 3.根据class获取元素getElementsByClass
  • 4.根据属性获取元素getElementsByAttribute
//1.    根据id查询元素getElementById
Element element = document.getElementById("city_bj");

//2.   根据标签获取元素getElementsByTag
element = document.getElementsByTag("title").first();

//3.   根据class获取元素getElementsByClass
element = document.getElementsByClass("s_name").last();

//4.   根据属性获取元素getElementsByAttribute
element = document.getElementsByAttribute("abc").first();
element = document.getElementsByAttributeValue("class", "city_con").first();

元素中获取数据

  • 1.从元素中获取id
  • 2.从元素中获取className
  • 3.从元素中获取属性的值attr
  • 4.从元素中获取所有属性attributes
  • 5.从元素中获取文本内容text
//获取元素
Element element = document.getElementById("test");

//1.   从元素中获取id
String str = element.id();

//2.   从元素中获取className
str = element.className();

//3.   从元素中获取属性的值attr
str = element.attr("id");

//4.   从元素中获取所有属性attributes
str = element.attributes().toString();

//5.   从元素中获取文本内容text
str = element.text();

使用选择器语法查找元素

jsoup elements对象支持类似于CSS (或jquery)的选择器语法,来实现非常强大和灵活的查找功能。这个select 方法在Document, Element,或Elements对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。

Select方法将返回一个Elements集合,并提供一组方法来抽取和处理结果。


Selector选择器概述

  • tagname: 通过标签查找元素,比如:span
  • #id: 通过ID查找元素,比如:# city_bj
  • .class: 通过class名称查找元素,比如:.class_a
  • [attribute]: 利用属性查找元素,比如:[abc]
  • [attr=value]: 利用属性值来查找元素,比如:[class=s_name]
//tagname: 通过标签查找元素,比如:span
Elements span = document.select("span");
for (Element element : span) 
    System.out.println(element.text());


//#id: 通过ID查找元素,比如:#city_bjj
String str = document.select("#city_bj").text();

//.class: 通过class名称查找元素,比如:.class_a
str = document.select以上是关于JAVA网络爬爬学习之HttpClient+Jsoup的主要内容,如果未能解决你的问题,请参考以下文章

Java学习之HttpClient的GET与POST请求

Java爬爬之网页去重和代理ip

爬虫概念与编程学习之如何爬取视频网站页面(用HttpClient)

抖音美女千千万,想用Python爬爬看

第一章 java网络编程入门_HTTPClient.java

咩咩?爬爬爬?