java从网页抓取数据(Java六级540多分的水平,大家见谅!(组图))
优采云 发布时间: 2021-12-10 03:30java从网页抓取数据(Java六级540多分的水平,大家见谅!(组图))
翻译Java开源爬虫框架crawler4j文档花了两个小时。因为这几天一直在学习Java爬虫的知识,突然觉得英语可能会阻碍很多人学习的动力。这个爬虫框架,所以决定翻译一下。第六关540多点还请见谅。每个句子都是根据您自己的理解翻译的。尤其是快速入门那部分的源代码。这里是:
爬虫4j
crawler4j 是一个开源的 Java 爬虫网络爬虫,提供了一个简单的网络爬虫接口。使用它,您可以在几分钟内设置一个多线程网络爬虫。
使用Maven下载和安装内容列表
要使用最新版本的 crawler4j,请在您的 pom.xml 中使用以下代码片段
edu.uci.ics
crawler4j
4.3
快照
您可以添加以下内容以使用下一个快照版本
onebeartoe
onebeartoe
https://repository-onebeartoe.forge.cloudbees.com/snapshot/
edu.uci.ics
crawler4j
4.4-SNAPSHOT
如果没有Maven
从4.3版本开始,如果你需要一个收录所有依赖的jar包。您需要自己构建它。克隆 repo 并运行
$ mvn package -Pfatjar
你会发现target/文件夹中有一个crawler4j-XY-with-dependencies.jar。
使用摇篮
请在 build.gradle 文件中收录以下依赖项以使用 crawler4j
compile group: 'edu.uci.ics', name: 'crawler4j', version: '4.3'
另外在build.gradle中添加如下repository url获取依赖[sleepycat]()
maven {
url "https://repo.boundlessgeo.com/main/"
}
快速开始
您需要创建一个扩展 WebCrawler 的爬虫类。此类确定应抓取哪些 URL 并处理下载的页面。下面是一个示例实现:
public class MyCrawler extends WebCrawler {
/**
* 正则表达式匹配指定的后缀文件
*/
private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg" + "|png|mp3|mp4|zip|gz))$");
/**
* 这个方法主要是决定哪些url我们需要抓取,返回true表示是我们需要的,返回false表示不是我们需要的Url
* 第一个参数referringPage封装了当前爬取的页面信息 第二个参数url封装了当前爬取的页面url信息
* 在这个例子中,我们指定爬虫忽略具有css,js,git,...扩展名的url,只接受以“http://www.ics.uci.edu/”开头的url。
* 在这种情况下,我们不需要referringPage参数来做出决定。
*/
@Override
public boolean shouldVisit(Page referringPage, WebURL url) {
String href = url.getURL().toLowerCase();// 得到小写的url
return !FILTERS.matcher(href).matches() // 正则匹配,过滤掉我们不需要的后缀文件
&& href.startsWith("http://www.ics.uci.edu/");// 只接受以“http://www.ics.uci.edu/”开头的url
}
/**
* 当一个页面被提取并准备好被你的程序处理时,这个函数被调用。
*/
@Override
public void visit(Page page) {
String url = page.getWebURL().getURL();// 获取url
System.out.println("URL: " + url);
if (page.getParseData() instanceof HtmlParseData) {// 判断是否是html数据
HtmlParseData htmlParseData = (HtmlParseData) page.getParseData();//// 强制类型转换,获取html数据对象
String text = htmlParseData.getText();//获取页面纯文本(无html标签)
String html = htmlParseData.getHtml();//获取页面Html
Set links = htmlParseData.getOutgoingUrls();// 获取页面输出链接
System.out.println("纯文本长度: " + text.length());
System.out.println("html长度: " + html.length());
System.out.println("链接个数 " + links.size());
}
}
}
从上面的代码可以看出,主要有两个方法需要覆盖
您还应该实现一个控制器类,该类指定爬取的*敏*感*词*、爬取的数据应存储在哪个文件夹中以及并发线程数:
public class Controller {
public static void main(String[] args) throws Exception {
String crawlStorageFolder = "E:/crawler";// 定义爬虫数据存储位置
int numberOfCrawlers = 7;// 定义了7个爬虫,也就是7个线程
CrawlConfig config = new CrawlConfig();// 定义爬虫配置
config.setCrawlStorageFolder(crawlStorageFolder);// 设置爬虫文件存储位置
/*
* 实例化爬虫控制器。
*/
PageFetcher pageFetcher = new PageFetcher(config);// 实例化页面获取器
RobotstxtConfig robotstxtConfig = new RobotstxtConfig();// 实例化爬虫机器人配置
// 实例化爬虫机器人对目标服务器的配置,每个网站都有一个robots.txt文件
// 规定了该网站哪些页面可以爬,哪些页面禁止爬,该类是对robots.txt规范的实现
RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
// 实例化爬虫控制器
CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
/*
* 对于每次抓取,您需要添加一些*敏*感*词*网址。 这些是抓取的第一个URL,然后抓取工具开始跟随这些页面中的链接
*/
controller.addSeed("http://www.ics.uci.edu/~lopes/");
controller.addSeed("http://www.ics.uci.edu/~welling/");
controller.addSeed("http://www.ics.uci.edu/");
/**
* 启动爬虫,爬虫从此刻开始执行爬虫任务,根据以上配置
*/
controller.start(MyCrawler.class, numberOfCrawlers);
}
}
结果(eclipse+Marven 测试):
使用工厂
使用工厂可以轻松地将 crawler4j 集成到 IoC 环境(如 Spring、Guice)或将信息或协作者传递给每个“WebCrawler”实例。
public class CsiCrawlerCrawlerControllerFactory implements CrawlController.WebCrawlerFactory {
Map metadata;
SqlRepository repository;
public CsiCrawlerCrawlerControllerFactory(Map metadata, SqlRepository repository) {
this.metadata = metadata;
this.repository = repository;
}
@Override
public WebCrawler newInstance() {
return new MyCrawler(metadata, repository);
}
}
要使用工厂,你只需要在 CrawlController 中调用正确的方法(如果你在 Spring 或 Guice,你可能想使用 startNonBlocking):
MyCrawlerFactory factory = new MyCrawlerFactory(metadata, repository);
controller.startNonBlocking(factory, numberOfCrawlers);
更多示例配置细节
控制器类具有 CrawlConfig 类型的必需参数
此类的实例可用于配置 crawler4j。以下部分描述了配置的一些细节。
爬行深度
默认情况下,抓取深度没有限制。但是你可以限制爬行的深度。例如,假设您有一个*敏*感*词*页面“A”,链接到“B”,链接到“C”,链接到“D”。所以,我们有以下链接结构:
A -> B -> C -> D
因为“A”是*敏*感*词*页面,它的深度为0.,“B”的深度为1,以此类推。可以设置crawler4j 抓取的网页深度限制。例如,如果将此限制设置为 2,则不会抓取页面“D”。要设置您可以使用的最大深度:
crawlConfig.setMaxDepthOfCrawling(maxDepthOfCrawling);
启用 SSL
只需启用 SSL:
CrawlConfig config = new CrawlConfig();
config.setIncludeHttpsPages(true);
要抓取的最大页面数
虽然默认情况下对抓取的页面数量没有限制,但您可以为此设置一个限制:
crawlConfig.setMaxPagesToFetch(maxPagesToFetch);
启用二进制内容抓取
默认情况下,抓取二进制内容(即图像、音频等)是关闭的。您必须启用它才能抓取这些文件:
crawlConfig.setIncludeBinaryContentInCrawling(true);
有关更多详细信息,请参阅此处的示例。
文明问题(礼貌爬行)
crawler4j 的设计非常高效,可以非常快速地抓取域名
(例如,它已经能够每秒抓取 200 个维基百科页面)。但现在我反对爬取 网站,因为这会给服务器带来巨大的负担(他们可能会阻止你!),
从 1.3 版本开始,crawler4j 默认会在请求之间等待至少 200 毫秒。
但是,可以调整此参数:
crawlConfig.setPolitenessDelay(politenessDelay);
演戏
你的爬行应该在代理后面运行吗?如果是这样,您可以使用:
crawlConfig.setProxyHost("proxyserver.example.com");
crawlConfig.setProxyPort(8080);
如果您的代理还需要认证:
crawlConfig.setProxyUsername(username);
crawlConfig.setProxyPassword(password);
可恢复抓取
有时需要长时间运行爬虫。搜索者可能会意外终止。在这种情况下,可能需要恢复爬行。您可以使用以下设置恢复先前停止/崩溃的爬网:
crawlConfig.setResumableCrawling(true);
但是,您应该注意它可能会使爬行速度稍微变慢。
用户代理字符串
用户代理字符串用于将您的爬虫表示为 Web 服务器。
请参阅此处了解更多详情。默认情况下,crawler4j 使用以下用户代理字符串:
"crawler4j (https://github.com/yasserg/crawler4j/)"
但是,您可以覆盖它:
crawlConfig.setUserAgentString(userAgentString);
执照