我想获取页面的内容并提取其中的特定部分。据我所知,对于这样的任务,至少有两种解决方案:Crawler4j和Jsoup。
它们都能够检索页面的内容并提取页面的子部分。我唯一不确定的是,它们之间有什么区别?还有一个类似的问题,标记为已回答:
Crawler4j是一个爬虫,Jsoup是一个解析器。
但我刚刚检查了一下,Jsoup除了解析功能外,还能够抓取页面,而Crawler4j不仅能够抓取页面,还能够解析其内容。
Crawler4j和Jsoup有什么区别?
爬网不仅仅是检索单个 URI 的内容。如果您只想检索某些页面的内容,那么使用类似 Crawler4J
.
让我们看一个例子。假设您要抓取网站。要求是:
- 提供基本 URI(主页)
- 从每个页面中获取所有 URI,并检索这些 URI 的内容。
- 为检索到的每个 URI 递归移动。
- 仅检索此网站内部的 URI 的内容(可能有外部 URI 引用另一个网站,我们不需要这些 URI)。
- 避免循环爬行。页面 A 具有页面 B(同一站点的)的 URI。页面 B 具有页面 A 的 URI,但我们已经检索了页面 A 的内容(
About
页面有指向Home
页面的链接,但我们已经获得了Home
页面的内容,所以不要再次访问它)。 - 爬网操作必须是多线程的
- 该网站很大。它包含很多页面。我们只想从页面开始检索 50 个 URI
Home
。
这是一个简单的方案。尝试使用 Jsoup
解决此问题。所有这些功能都必须由您实现。Crawler4J或任何爬虫微框架,将或应该具有上述操作的实现。 Jsoup
的强大品质在你决定如何处理内容时闪耀。
让我们看一下解析的一些要求。
- 获取页面的所有段落
- 获取所有图像
- 移除无效标签(不符合
HTML
规范的标签) - 删除脚本标记
这就是Jsoup
发挥作用的地方。当然,这里也有一些重叠之处。有些事情在Crawler4J
或Jsoup
上都是可能的,但这并不能使它们等同。您可以删除从Jsoup
中检索内容的机制,并且仍然是一个了不起的工具。如果Crawler4J
删除检索,那么它将失去一半的功能。
我在现实生活中的同一个项目中使用了它们。我抓取了一个网站,利用Crawler4J
的优势,解决了第一个示例中提到的所有问题。然后我把检索到的每个页面的内容传递给Jsoup
,以便提取我需要的信息。我能不使用其中一个吗?是的,我可以,但我必须实现所有缺少的功能。
因此,区别在于,Crawler4J
是一个爬虫,具有一些简单的解析操作(您可以在一行中提取图像),但没有实现复杂的CSS
查询。 Jsoup
是一个解析器,为您提供用于HTTP
请求的简单 API。对于更复杂的任何内容,都没有实现。