java的基础入门学习06-爬虫

一、引言

学习爬虫之前,我们得先了解什么是爬虫。爬虫就是模拟人类上网行为,通过发送网络请求来获取到网络内容并且提取并解析数据。

二、爬虫的基本使用

2.1 URLConnection使用爬虫

我们可以使用java中的URLConnection来发送Http请求。首先我们得了解URL的构造器。

public URL(String spec) throws MalformedURLException {
        this(null, spec);
    }

在URL的底层代码中多种创建URL的方式本质上其实是方法的重载。基本创建方式是示例中输入网址
然后我们就可以发现url中存在一个openConnection方法,它的返回值就是URLConection

 public URLConnection openConnection() throws java.io.IOException {
        return handler.openConnection(this);
    }

此时我们就可以利用该方法创建出一个URLConection对象,那么该对象可以理解为是一个稳定的网络通道。此时我们就可以来读取网络页面中的数据。
首先需要打开通道,其次我们需要获取里面的字节流用于读取数据。

 urlConnection.connect();
 InputStream inputStream = urlConnection.getInputStream();

得到字节流我们是读取的对象所以需要创建InputStreamReader对象,在此基础上我们需要再将其变为BufferdReader对象,此对象可以有效帮助我们一次性读取一行数据。并且我们在完成读取后需要释放资源,最终代码如下。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class URLConnectionTest {
    public static void main(String[] args) throws IOException {
        URL url = new URL("https://blog.youkuaiyun.com/m0_74345597/article/details/142794122?spm=1001.2014.3001.5502");
        URLConnection urlConnection = url.openConnection();
        urlConnection.connect();
        InputStream inputStream = urlConnection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        reader.close();
    }
}

2.2 HttpClient发出请求

在java11及其以上版本,httpClient已经成为标准库中的一部分了,无需引入,如果是java8以下则需要引入对应jar包,我使用的是java17,这里不展示引入jar包
首先我们需要创建一个HttpClient对象

HttpClient httpClient = HttpClient.newHttpClient();

这里并不需要携带参数,关于http请求的具体信息我们写入到HttpRequest对象中。

HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://blog.youkuaiyun.com/m0_74345597/article/details/142794122?spm=1001.2014.3001.5502"))
                .build();

接下来我们就可以使用httpclient客户端对象来发送请求,我们可以来查看一下这个send方法

    public abstract <T> HttpResponse<T>
    send(HttpRequest request, HttpResponse.BodyHandler<T> responseBodyHandler)
        throws IOException, InterruptedException;

第一个参数为发送的请求,第二个为我们对于返回的response的处理方式,最后展示使用方式

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Http {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpClient httpClient = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://blog.youkuaiyun.com/m0_74345597/article/details/142794122?spm=1001.2014.3001.5502"))
                .build();
        HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}

上述的两种方式都可以设置具体的请求信息如请求头,请求方式等,可自由设置。

三、网页数据的具体爬取

我们可以使用Jsoup,Xpath等分析工具来完成数据分析,在这里介绍一下Jsoup,首先引入依赖

<!--Jsoup-->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.3</version>
</dependency>

然后我们可以找到里面的一个parse方法用于获得对象

  public static Document parse(URL url, int timeoutMillis) throws IOException {
        Connection con = HttpConnection.connect(url);
        con.timeout(timeoutMillis);
        return con.get();
    }

发现该方法本质上就是利用URLConnecion来发起请求,第一个参数为地址,第二个为超时时间,默认发起的请求方式是get,可以给我们返回一个文档对象Document。
接下来学过前端的话就可以明白使用标签来选取需要的元素,并且获取元素中的属性或者是文本信息,这里展示我写的简单案例,获取传智教育的标题。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

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

public class JsoupTest {
    public static void main(String[] args) throws IOException {
        Document document = Jsoup.parse(new URL("http://www.itcast.cn/"), 1000);
        //使用标签选择器,获取title标签中的内容
        String title = document.getElementsByTag("title").first().text();
        System.out.println(title);
    }
}

其余更多的细小的方法还需要自己多寻找研究,这就是Jsoup的浅显理解应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值