一、引言
学习爬虫之前,我们得先了解什么是爬虫。爬虫就是模拟人类上网行为,通过发送网络请求来获取到网络内容并且提取并解析数据。
二、爬虫的基本使用
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的浅显理解应用。