创建网络爬虫是检索在线可用信息的一种智能方式。 借助网络爬虫,您可以扫描互联网、浏览各个网站并分析和提取其内容。
Java 编程语言提供了一种构建网络爬虫和从网站收集数据的简单方法。 您可以将提取的数据用于各种用例,例如用于分析目的、提供使用第三方数据的服务或生成统计数据。
在本文中,我们将引导您完成使用 Java 和 Crawlbase 构建网络爬虫的过程。
你需要什么
通常,抓取 Web 数据涉及创建一个脚本,该脚本将请求发送到目标网页,访问其底层 HTML 代码,并抓取所需的信息。
要实现该目标,您需要以下内容:
- Java 11 开发环境
- 爬虫库
在我们开发爬行逻辑之前,让我们澄清为什么使用 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 中引入的,它具有许多用于发送请求和检索其响应的有用功能。
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 | 串 网址 = |
请注意,我们使用 Crawlbase 的设置提供了 URL 字符串。 这是 网页我们打算抓取它的内容。
我们还使用 Java URLEncoder 类。如前所述,Crawlbase 需要对 URL 进行编码。
b) 请求方法
接下来要做的是指定用于发出请求的 HTTP 方法。 我们可以调用以下任何方法 生成器:
- 得到()
- 邮政()
- 放()
- 删除()
在这种情况下,由于我们想从目标网页请求数据,我们将使用 得到() 方法。
这是代码:
1 | 请求 请求 = HttpRequest.newBuilder() |
到目前为止,HttpRequest 已经拥有了所有应该传递给 HttpClient 的参数。 但是,您可能需要包含其他参数,例如 HTTP 协议版本和超时。
让我们看看如何添加附加参数。
c) 协议版本方法
如前所述,HttpClient API 默认使用 HTTP/2 协议。 尽管如此,您可以指定要使用的 HTTP 协议的版本。
这是代码:
1 | 请求 请求 = HttpRequest.newBuilder() |
d) 超时方法
您可以设置在收到响应之前等待的时间量。 一旦定义的期限届满, Http超时异常 将被抛出。 默认情况下,超时设置为无穷大。
您可以通过在构建器实例上调用 timeout() 方法来定义超时。 您还需要通过 时间长度 对象来指定等待的时间量。
这是代码:
1 | 请求 请求 = HttpRequest.newBuilder() |
2.http客户端
HttpClient 类是 API 的主要入口点——它充当多个请求之间共享的配置详细信息的容器。 它是用于发送请求和接收响应的 HTTP 客户端。
您可以调用 HttpClient.newBuilder() 或者 HttpClient.newHttpClient() 方法来实例化它。 创建 HttpClient 的实例后,它是不可变的。
HttpClient 类提供了几种有用的自描述方法,您可以在处理请求和响应时使用。
这些是您可以做的一些事情:
- 设置协议版本
- 设置重定向策略
- 发送同步和异步请求
让我们更详细地讨论它们中的每一个。
a) 设置协议版本
如前所述,HttpClient 类默认使用 HTTP/2 协议。 但是,您可以设置首选协议版本,HTTP/1.1 或 HTTP/2。
这是一个例子:
1 | 客户端 客户 = HttpClient.newBuilder() |
b) 设置重定向策略
如果目标网页已移至其他地址,您将获得 3xx HTTP 状态代码。 由于新 URI 的地址通常会提供状态码信息,因此设置正确的重定向策略可以使 HttpClient 自动将请求转发到新位置。
您可以使用 跟随重定向() 上的方法 生成器 实例。
这是一个例子:
1 | 客户端 客户 = HttpClient.newBuilder() |
c) 发送同步和异步请求
HttpClient 支持两种发送请求的方式:
- 同步地 通过使用 发送() 方法。 这会阻塞客户端,直到收到响应,然后继续执行其余部分。
这是一个例子:
1 | HttpResponse 响应 = client.send(请求, |
请注意,我们使用了 身体处理者 并称 字符串() 方法将 HTML 响应作为字符串返回。
- 异步 通过使用 发送异步() 方法。 这不会等待收到响应; 它是非阻塞的。 一旦 发送异步() 方法被调用,它立即返回 CompletableFuture< HttpResponse >,一旦收到响应就会完成。 返回的 可完成的未来 可以使用各种技术来定义各种异步任务之间的依赖关系。
这是一个例子:
1 | 可完成的未来 > 响应 = HttpClient.newBuilder() |
3. Http响应
HttpResponse,顾名思义,代表发送一个HttpRequest后收到的响应。 HttpResponse 提供了不同的有用方法来处理收到的响应。
这些是最重要的方法:
- 状态码() 该方法返回响应的状态码。 它的 INT 类型
- 身体() 此方法返回响应的正文。 返回类型取决于响应的类型 身体处理程序 传递给 发送() 方法。
这是一个例子:
1 | // 将响应正文处理为字符串 |
1 | // 将响应正文作为文件处理 |
同步示例
下面是一个使用 HttpClient 同步方法抓取网页并输出其内容的示例:
1 | 包 javaHttp客户端; |
这是输出(为简洁起见,将其截断):
异步示例
使用 HttpClient 异步方法爬取网页时, 发送异步() 方法被调用,而不是 发送()。
这是一个例子:
1 | 包 javaHttp客户端; |
结论
这就是如何在 Java 中构建网络爬虫。 Java 11 中引入的 HttpClient API 使发送和处理来自服务器的响应变得容易。
如果该 API 与 Crawlbase 这样的多功能工具相结合,它可以使网络爬行任务变得顺利且有价值。
使用Crawlbase,您可以创建一个抓取工具,帮助您匿名从网站检索信息,而不必担心被阻止。
这是您将爬网工作提升到新水平所需的工具。
刮刮快乐!