Crawler4j 快速入门
来源:互联网 发布:手机切换ip软件 编辑:程序博客网 时间:2024/06/14 06:41
crawler4j是Java实现的开源网络爬虫。提供了简单易用的接口,可以在几分钟内创建一个多线程网络爬虫
crawler4j中用了slf4j来记录项目运行日志信息。我们使用slf4j具体实现类log4j
创建一个maven项目。在pom.xml贴上所需jar
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> <scope>test</scope> </dependency> <dependency> <groupId>edu.uci.ics</groupId> <artifactId>crawler4j</artifactId> <version>4.2</version> </dependency>
在resources下贴上log4j.properties
log4j.rootLogger = debug,D,E ### debug ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = c://logs/log.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ### error ###log4j.appender.E = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File =c://logs/error.log log4j.appender.E.Append = truelog4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayoutlog4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ]
编写爬虫类
package com.gcx.crawler;import edu.uci.ics.crawler4j.crawler.Page;import edu.uci.ics.crawler4j.crawler.WebCrawler;import edu.uci.ics.crawler4j.parser.HtmlParseData;import edu.uci.ics.crawler4j.url.WebURL;import java.util.Set;import java.util.regex.Pattern;/** * 自定义爬虫类myCrawler需要继承WebCrawler,决定哪些url被爬取以及处理爬的页面信息 */public class MyCrawler extends WebCrawler { /** * 正则匹配指定的后缀文件 */ private final static Pattern FILTERS= Pattern.compile(".*(\\.(css|js|gif|jpg|png|mp3|zip|gz))$"); /** * 根据url进行网页的解析,对返回为TRUE的网页进行抓取 * 第一个参数referringPage封装了当前爬取的页面信息 * 第二个参数封装了当前爬取页面的url信息 */ @Override public boolean shouldVisit(Page referringPage, WebURL url) { //小写url String href=url.getURL().toLowerCase(); //正则匹配,过滤掉我们不需要的后缀文件 return !FILTERS.matcher(href).matches()//匹配过滤掉不需要的后缀文件 && href.startsWith("http://www.bjsxt.com");//url必须是http://www.baidu.com开头 } /** * 解析网页内容,page类包含了丰富的方法,可以利用这些方法得到网页的内容和属性 * 当我们爬取到我们需要的页面,这个方法会被调用,我们可以随意处理页面 * page 封装了所有页面信息 * */ @Override public void visit(Page page) { //获取url String url=page.getWebURL().getURL(); System.out.println("url:"+url); //判断是否是html数据 if(page.getParseData() instanceof HtmlParseData){ //强制类型转换,获取html数据对象 HtmlParseData htmlParseData= (HtmlParseData) page.getParseData(); //获得页面纯文本 String text=htmlParseData.getText(); //获得页面html String html=htmlParseData.getHtml(); //获取页面输出链接 Set<WebURL> links=htmlParseData.getOutgoingUrls(); System.out.println("纯文本长度: " + text.length()); System.out.println("html长度: " + html.length()); System.out.println("输出链接个数: " + links.size()); } }}
写一个控制器调用,我们爬取一个www.bjsxt.com
package com.gcx.crawler;import edu.uci.ics.crawler4j.crawler.CrawlConfig;import edu.uci.ics.crawler4j.crawler.CrawlController;import edu.uci.ics.crawler4j.fetcher.PageFetcher;import edu.uci.ics.crawler4j.robotstxt.RobotstxtConfig;import edu.uci.ics.crawler4j.robotstxt.RobotstxtServer;/** * 爬虫控制器 */public class Controller { public static void main(String[] args) throws Exception { //定义爬虫存储的位置 String crawStorageFoler="d:/crawler"; //定义爬虫线程7个 int numberOfCrawlers=1; //定义爬虫配置 CrawlConfig config=new CrawlConfig(); //设置爬虫文件存储位置 config.setCrawlStorageFolder(crawStorageFoler); //实例化页面获取器 PageFetcher pageFetcher=new PageFetcher(config); //实例化爬虫机器人配置,比如可以设置user-agent RobotstxtConfig robotstxtconfig=new RobotstxtConfig(); //实例化爬虫机器人对目标服务器的配置,每个网站都有一个robots.txt文件 //规定了该网站哪些页面可以爬,哪些页面禁止爬,该类是对robots.txt规范的实现 RobotstxtServer robotstxtServer=new RobotstxtServer(robotstxtconfig,pageFetcher); //实例化爬虫控制器 CrawlController controller=new CrawlController(config,pageFetcher,robotstxtServer); //配置爬取种子页面,就是规定从哪里开始爬,可以配置多个种子页面 controller.addSeed("http://www.bjsxt.com"); //启动爬虫,爬虫从此刻开始执行爬虫任务 controller.start(MyCrawler.class,numberOfCrawlers); }}
爬取如下:
简单一个爬虫实例搞定
当然还提供了基本的实例
package com.gcx.crawler;import edu.uci.ics.crawler4j.crawler.Page;import edu.uci.ics.crawler4j.crawler.WebCrawler;import edu.uci.ics.crawler4j.parser.HtmlParseData;import edu.uci.ics.crawler4j.url.WebURL;import org.apache.http.Header;import java.util.Set;import java.util.regex.Pattern;/** * 自定义爬虫类myCrawler需要继承WebCrawler,决定哪些url被爬取以及处理爬的页面信息 */public class MyCrawler extends WebCrawler { /** * 正则匹配指定的后缀文件 指定图片后缀 */ private static final Pattern IMAGE_EXTENSIONS = Pattern.compile(".*\\.(bmp|gif|jpg|png)$"); /** * 这个方法主要是决定哪些url我们需要抓取,返回true表示是我们需要的,返回false表示不是我们需要的Url * 第一个参数referringPage封装了当前爬取的页面信息 * 第二个参数url封装了当前爬取的页面url信息 */ @Override public boolean shouldVisit(Page referringPage, WebURL url) { String href = url.getURL().toLowerCase(); // 得到小写的url // 过滤掉含有图片后缀的url if (IMAGE_EXTENSIONS.matcher(href).matches()) { return false; } // 只接受www.bjsxt.com开头的url return href.startsWith("http://www.bjsxt.com/"); } /** * 当我们爬到我们需要的页面,这个方法会被调用,我们可以尽情的处理这个页面 * page参数封装了所有页面信息 */ @Override public void visit(Page page) { int docid = page.getWebURL().getDocid(); // 获取docid url的唯一识别 类似主键 String url = page.getWebURL().getURL(); // 获取url String domain = page.getWebURL().getDomain(); // 获取域名 String path = page.getWebURL().getPath(); // 获取路径 String subDomain = page.getWebURL().getSubDomain(); // 获取子域名 String parentUrl = page.getWebURL().getParentUrl(); // 获取上级Url String anchor = page.getWebURL().getAnchor(); // 获取锚点 System.out.println("docid:" + docid); System.out.println("url:" + url); System.out.println("domain:" + domain); System.out.println("path:" + path); System.out.println("subDomain:" + subDomain); System.out.println("parentUrl:" + parentUrl); System.out.println("anchor:" + anchor); if (page.getParseData() instanceof HtmlParseData) { // 判断是否是html数据 HtmlParseData htmlParseData = (HtmlParseData) page.getParseData(); // 强制类型转换,获取html数据对象 String text = htmlParseData.getText(); // 获取页面纯文本(无html标签) String html = htmlParseData.getHtml(); // 获取页面Html Set<WebURL> links = htmlParseData.getOutgoingUrls(); // 获取页面输出链接 System.out.println("纯文本长度: " + text.length()); System.out.println("html长度: " + html.length()); System.out.println("输出链接个数: " + links.size()); } Header[] responseHeaders = page.getFetchResponseHeaders(); // 获取响应头消息 if (responseHeaders != null) { System.out.println("响应的头消息"); for (Header header : responseHeaders) { System.out.println(header.getName() + "+" + header.getValue()); } } }}
package com.gcx.crawler;import edu.uci.ics.crawler4j.crawler.CrawlConfig;import edu.uci.ics.crawler4j.crawler.CrawlController;import edu.uci.ics.crawler4j.fetcher.PageFetcher;import edu.uci.ics.crawler4j.robotstxt.RobotstxtConfig;import edu.uci.ics.crawler4j.robotstxt.RobotstxtServer;/** * 爬虫控制器 */public class Controller { public static void main(String[] args) throws Exception { String crawlStorageFolder = "d:/crawl"; // 定义爬虫数据存储位置 int numberOfCrawlers = 7; // 定义7个爬虫,也就是7个线程 CrawlConfig config = new CrawlConfig(); // 实例化爬虫配置文件 config.setCrawlStorageFolder(crawlStorageFolder); // 设置爬虫文件存储位置 /* * 设置请求的频率 * 每1000毫秒,也就是两次请求的间隔至少是1秒 */ config.setPolitenessDelay(1000); /* * 设置请求的网页的深度(后面专门会讲) 设置2 为两层 * 默认值-1 无限深度 */ config.setMaxDepthOfCrawling(2); /* * 设置爬取的最大网页数 这里设置1000 最多爬取1000次 * 默认值是-1,表示无限制 */ config.setMaxPagesToFetch(1000); /** * 是否爬取二进制文件,比如图片,PDF文档,视频之类的东西 这里设置false 不爬取 * 默认值true,爬取 */ config.setIncludeBinaryContentInCrawling(false); /* * 这里可以设置代理 * config.setProxyHost("proxyserver.example.com"); // 代理地址 * config.setProxyPort(8080); // 代理端口 * * 如果使用代理,也可以设置身份认证 用户名和密码 * config.setProxyUsername(username); config.getProxyPassword(password); */ /* * 这个配置假如设置成true,当一个爬虫突然终止或者奔溃,我们可以恢复; * 默认配置是false;推荐用默认配置,假如设置成true,性能会大打折扣; */ config.setResumableCrawling(false); /* * 实例化爬虫控制器 */ PageFetcher pageFetcher = new PageFetcher(config); // 实例化页面获取器 RobotstxtConfig robotstxtConfig = new RobotstxtConfig(); // 实例化爬虫机器人配置 比如可以设置 user-agent // 实例化爬虫机器人对目标服务器的配置,每个网站都有一个robots.txt文件 规定了该网站哪些页面可以爬,哪些页面禁止爬,该类是对robots.txt规范的实现 RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher); // 实例化爬虫控制器 CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer); /* * 配置爬虫种子页面,就是规定的从哪里开始爬,可以配置多个种子页面 */ controller.addSeed("http://www.bjsxt.com/"); /* * 启动爬虫,爬虫从此刻开始执行爬虫任务,根据以上配置 */ controller.start(MyCrawler.class, numberOfCrawlers); }}
运行如下:
阅读全文
0 0
- Crawler4j快速入门实例
- Crawler4j 快速入门
- Crawler4j快速入门实例
- crawler4j爬虫入门
- crawler4j入门(二)
- Java网络爬虫crawler4j学习笔记<1>入门
- crawler4j 介绍
- crawler4j配置
- 快速入门
- crawler4j代码解析
- 关于crawler4j 爬虫
- Crawler4j的使用
- Nutch、heritrix、crawler4j优缺点
- crawler4j打包与配置
- 使用crawler4j框架爬爬知乎
- Nutch、heritrix、crawler4j优缺点
- 使用Crawler4j总结
- Crawler4j总结(2)
- React生命周期全解和state避坑
- HDU 6075 Questionnaire
- 图片的二次采样
- POJ3468 树状数组的区间更新和区间求和
- Hawq超过最大允许连接数
- Crawler4j 快速入门
- UML常用图的几种关系的总结
- SpringCloud之配置中心Git实例
- eclipse下安装和简单使用svn
- partial分部类
- redis之sentinel
- CodeForces 797C Minimal string
- hdu 6060 RXD and dividing(dfs)
- 标签显示问题