java从网页抓取数据(Java六级540多分的水平,大家见谅!(组图))

优采云 发布时间: 2021-12-10 03:30

  java从网页抓取数据(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);

  执照

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线