创建网络爬虫是检索在线可用信息的一种智能方式。 借助网络爬虫,您可以扫描互联网、浏览各个网站并分析和提取其内容。

Java 编程语言提供了一种构建网络爬虫和从网站收集数据的简单方法。 您可以将提取的数据用于各种用例,例如用于分析目的、提供使用第三方数据的服务或生成统计数据。

在本文中,我们将引导您完成使用 Java 和 Crawlbase 构建网络爬虫的过程。

你需要什么

通常,抓取 Web 数据涉及创建一个脚本,该脚本将请求发送到目标网页,访问其底层 HTML 代码,并抓取所需的信息。

要实现该目标,您需要以下内容:

在我们开发爬行逻辑之前,让我们澄清为什么使用 Crawlbase 对于网络爬行很重要。

为什么要使用Crawlbase进行爬行

Crawlbase 是一款功能强大的数据爬行和抓取工具,您可以使用它快速轻松地从网站获取信息。

以下是您应该使用它来抓取在线数据的一些原因:

  • 操作简单 它带有一个简单的 API,您可以快速设置,没有任何编程障碍。 只需几行代码,您就可以开始使用 API 来抓取网站并检索其内容。

  • 支持高级爬取 Crawlbase 允许您执行高级网络爬行并从复杂的网站中抓取数据。由于它支持 JavaScript 渲染,Crawlbase 允许您从动态网站中提取数据。它提供了一个无头浏览器,允许您提取真实用户在其 Web 浏览器上看到的内容,即使网站是使用 Angular 或 React.js 等现代框架创建的。

  • 绕过爬行障碍 Crawlbase 可以处理与抓取在线数据相关的所有限制。它拥有广泛的代理网络以及全球超过 17 个数据中心。您可以使用它来避免访问限制、解析验证码并规避 Web 应用程序实施的其他反抓取措施。此外,您可以在保持匿名的情况下抓取网站;你不会担心暴露你的身份。

  • 免费试用帐户 您可以测试 Crawlbase 的工作原理,而无需提供您的付款详细信息。免费帐户附带 1,000 个积分,用于试用该工具的功能。

Crawlbase 的工作原理

Crawlbase 提供 抓取 API 用于从网站抓取和抓取数据。 您可以轻松地将 API 集成到您的 Java 开发项目中,并顺利地从网页中检索信息。

对 Crawling API 发出的每个请求都以以下基本部分开头:

1
https://api.crawlbase.com

此外,您需要向 API 添加以下强制参数:

  • 身份验证令牌
  • 网址

身份验证令牌是授权您使用爬网 API 的唯一令牌。一旦您注册帐户,Crawlbase 将为您提供两种类型的令牌:

  • 普通令牌 这是为了发出通用的抓取请求。
  • JavaScript 令牌 这是用于抓取动态网站。 它为您提供了无头浏览器功能,用于抓取使用 JavaScript 呈现的网页。 如前所述,这是爬取高级网站的有用方法。

以下是将身份验证令牌添加到您的 API 请求的方法:

1
https://api.crawlbase.com/?token=INSERT_TOKEN

第二个强制参数是要抓取的 URL。 它应该以 HTTP 或 HTTPS 开头,并且是完全编码的。 编码将 URL 字符串转换为可以在 Internet 上有效且轻松地传输的格式。

以下是将 URL 插入 API 请求的方法:

1
https://api.crawlbase.com/?token=INSERT_TOKEN&url=INSERT_URL

如果您运行上述代码行——例如,在终端上使用 cURL 或将其粘贴到浏览器的地址栏上——它将执行 API 请求并返回目标网页的完整 HTML 源代码。

就是这么简单!

如果要执行高级爬取,可以添加其他 参数 到 API 请求。 例如,当使用 JavaScript 令牌时,您可以添加 页面等待 参数指示浏览器在捕获生成的 HTML 代码之前等待指定的毫秒数。

这是一个例子:

1
https://api.crawlbase.com/?token=INSERT_TOKEN&page_wait=1000&url=INSERT_URL

使用 Java 和 Crawlbase 构建网络爬虫

在这个 Java 网络爬虫教程中,我们将使用 客户端接口 创建爬行逻辑。 该 API 是在 Java 11 中引入的,它具有许多用于发送请求和检索其响应的有用功能。

HTTP 客户端 API

HttpClient API 支持 HTTP/1.1 和 HTTP/2。 默认情况下,它使用 HTTP/2 协议发送请求。 如果请求发送到不支持 HTTP/2 的服务器,它将自动降级为 HTTP/1。

此外,它的请求可以异步或同步发送,它将请求和响应体处理为 反应流, 并使用通用构建器模式。

API 由三个核心类组成:

  • 请求
  • 客户端
  • 响应

让我们更详细地讨论它们中的每一个。

1. Http请求

HttpRequest,顾名思义,是一个封装要发送的 HTTP 请求的对象。 要创建 HttpRequest 的新实例,请调用 HttpRequest.newBuilder(). 创建后,请求是不可变的,可以多次发送。

生成器 类带有用于配置请求的不同方法。

这些是最常见的方法:

  • URI方法
  • 请求方法
  • 协议版本方法
  • 超时方法

让我们更详细地讨论它们中的每一个。

a) URI 方法

配置请求时首先要做的就是设置要抓取的URL。 我们可以通过调用 乌里() 上的方法 生成器 实例。 我们还将使用 URI.create() 通过解析我们要抓取的 URL 的字符串来创建 URI 的方法。

这是代码:

1
2
3
4
5
6
7
 网址 =
URLEncoder. 编码(“https://www.forextradingbig.com/7-reasons-why-you-should
- 退出外汇交易/", StandardCharsets.UTF_8.name());

请求 请求 = HttpRequest.newBuilder()
.uri(URI.创建("https://api.crawlbase.com/?token=INSERT_TOKEN&url="
+ 网址))

请注意,我们使用 Crawlbase 的设置提供了 URL 字符串。 这是 网页我们打算抓取它的内容。

我们还使用 Java URLEncoder 类。如前所述,Crawlbase 需要对 URL 进行编码。

b) 请求方法

接下来要做的是指定用于发出请求的 HTTP 方法。 我们可以调用以下任何方法 生成器:

  • 得到()
  • 邮政()
  • 放()
  • 删除()

在这种情况下,由于我们想从目标网页请求数据,我们将使用 得到() 方法。

这是代码:

1
2
请求 请求 = HttpRequest.newBuilder()
。得到()

到目前为止,HttpRequest 已经拥有了所有应该传递给 HttpClient 的参数。 但是,您可能需要包含其他参数,例如 HTTP 协议版本和超时。

让我们看看如何添加附加参数。

c) 协议版本方法

如前所述,HttpClient API 默认使用 HTTP/2 协议。 尽管如此,您可以指定要使用的 HTTP 协议的版本。

这是代码:

1
2
请求 请求 = HttpRequest.newBuilder()
.version(HttpClient.Version.HTTP_2)

d) 超时方法

您可以设置在收到响应之前等待的时间量。 一旦定义的期限届满, Http超时异常 将被抛出。 默认情况下,超时设置为无穷大。

您可以通过在构建器实例上调用 timeout() 方法来定义超时。 您还需要通过 时间长度 对象来指定等待的时间量。

这是代码:

1
2
请求 请求 = HttpRequest.newBuilder()
.timeout(持续时间.ofSeconds(20))

2.http客户端

HttpClient 类是 API 的主要入口点——它充当多个请求之间共享的配置详细信息的容器。 它是用于发送请求和接收响应的 HTTP 客户端。

您可以调用 HttpClient.newBuilder() 或者 HttpClient.newHttpClient() 方法来实例化它。 创建 HttpClient 的实例后,它是不可变的。

HttpClient 类提供了几种有用的自描述方法,您可以在处理请求和响应时使用。

这些是您可以做的一些事情:

  • 设置协议版本
  • 设置重定向策略
  • 发送同步和异步请求

让我们更详细地讨论它们中的每一个。

a) 设置协议版本

如前所述,HttpClient 类默认使用 HTTP/2 协议。 但是,您可以设置首选协议版本,HTTP/1.1 或 HTTP/2。

这是一个例子:

1
2
客户端 客户 = HttpClient.newBuilder()
.version(版本.HTTP_1_1)

b) 设置重定向策略

如果目标网页已移至其他地址,您将获得 3xx HTTP 状态代码。 由于新 URI 的地址通常会提供状态码信息,因此设置正确的重定向策略可以使 HttpClient 自动将请求转发到新位置。

您可以使用 跟随重定向() 上的方法 生成器 实例。

这是一个例子:

1
2
客户端 客户 = HttpClient.newBuilder()
.followRedirects(重定向.NORMAL)

c) 发送同步和异步请求

HttpClient 支持两种发送请求的方式:

  • 同步地 通过使用 发送() 方法。 这会阻塞客户端,直到收到响应,然后继续执行其余部分。

这是一个例子:

1
2
HttpResponse 响应 = client.send(请求,
BodyHandlers.ofString());

请注意,我们使用了 身体处理者 并称 字符串() 方法将 HTML 响应作为字符串返回。

  • 异步 通过使用 发送异步() 方法。 这不会等待收到响应; 它是非阻塞的。 一旦 发送异步() 方法被调用,它立即返回 CompletableFuture< HttpResponse >,一旦收到响应就会完成。 返回的 可完成的未来 可以使用各种技术来定义各种异步任务之间的依赖关系。

这是一个例子:

1
2
可完成的未来 > 响应 = HttpClient.newBuilder()
.sendAsync(请求, HttpResponse.BodyHandler.ofString());

3. Http响应

HttpResponse,顾名思义,代表发送一个HttpRequest后收到的响应。 HttpResponse 提供了不同的有用方法来处理收到的响应。

这些是最重要的方法:

  • 状态码() 该方法返回响应的状态码。 它的 INT 类型
  • 身体() 此方法返回响应的正文。 返回类型取决于响应的类型 身体处理程序 传递给 发送() 方法。

这是一个例子:

1
2
3
4
5
6
7
8
9
// 将响应正文处理为字符串
HttpResponse 响应 = 客户
.send(请求, BodyHandlers.ofString());

// 打印响应体
System.out.println(response.body());

// 打印状态码
System.out.println(response.statusCode());
1
2
3
// 将响应正文作为文件处理
HttpResponse 响应 = 客户
.send(请求,BodyHandlers.ofFile(Paths.get(“我的例子.html”)));

同步示例

下面是一个使用 HttpClient 同步方法抓取网页并输出其内容的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 javaHttp客户端;

进口 java.io.IO异常;
进口 java.net.URI;
进口 java.net.URLEncoder;
进口 java.net.http.HttpClient;
进口 java.net.http.HttpRequest;
进口 java.net.http.HttpResponse;
进口 java.net.http.HttpResponse.BodyHandlers;
进口 java.nio.charset.StandardCharsets;

国家 同步示例 {

国家 静止 无效 (字符串 [] 参数) IOException,中断异常{

// 对 URL 进行编码
网址 = URLEncoder. 编码(“https://www.forextradingbig.com/7-reasons-why-you-should-quit-forex-trading/”, StandardCharsets.UTF_8.name());

// 实例化 HttpClient
客户端 客户 = HttpClient.newHttpClient();

// 配置 HttpRequest
请求 请求 = HttpRequest.newBuilder()
。得到()
.uri(URI.创建("https://api.crawlbase.com/?token=INSERT_TOKEN&url=" + 网址))
。建造();

// 处理响应
HttpResponse response = client.send(request, BodyHandlers.ofString());
System.out.println(response.body());
}

}

这是输出(为简洁起见,将其截断):

代码输出

异步示例

使用 HttpClient 异步方法爬取网页时, 发送异步() 方法被调用,而不是 发送()。

这是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 javaHttp客户端;

进口 java.io.IO异常;
进口 java.net.URI;
进口 java.net.URLEncoder;
进口 java.net.http.HttpClient;
进口 java.net.http.HttpRequest;
进口 java.net.http.HttpResponse;
进口 java.nio.charset.StandardCharsets;
进口 java.util.concurrent.CompletableFuture;
进口 java.util.concurrent.ExecutionException;
进口 java.util.concurrent.TimeUnit;
进口 java.util.concurrent.TimeoutException;

国家 异步示例 {


国家 静止 无效 (字符串 [] 参数) IOException、InterruptedException、ExecutionException、TimeoutException {

// 对 URL 进行编码
网址 = URLEncoder. 编码(“https://www.forextradingbig.com/7-reasons-why-you-should-quit-forex-trading/”, StandardCharsets.UTF_8.name());

// 实例化 HttpClient
客户端 客户 = HttpClient.newHttpClient();

// 配置 HttpRequest
请求 请求 = HttpRequest.newBuilder()
。得到()
.version(HttpClient.Version.HTTP_2)
.uri(URI.创建("https://api.crawlbase.com/?token=INSERT_TOKEN&url=" + 网址))
。建造();

// 处理响应
可完成的未来 > 响应 =
client.sendAsync(请求, HttpResponse.BodyHandlers.ofString());

导致 = 响应.thenApply(HttpResponse::body).get(5, 时间单位. 秒);

System.out.println(结果);

}

}

结论

这就是如何在 Java 中构建网络爬虫。 Java 11 中引入的 HttpClient API 使发送和处理来自服务器的响应变得容易。

如果该 API 与 Crawlbase 这样的多功能工具相结合,它可以使网络爬行任务变得顺利且有价值。

使用Crawlbase,您可以创建一个抓取工具,帮助您匿名从网站检索信息,而不必担心被阻止。

这是您将爬网工作提升到新水平所需的工具。

点击这里 创建一个免费的 Crawlbase 帐户。

刮刮快乐!