<!-- https://mvnrepository.com/artifact/edu.uci.ics/crawler4j -->
<dependency>
<groupId>edu.uci.ics</groupId>
<artifactId>crawler4j</artifactId>
<version>4.4.0</version>
</dependency
使用Crawler4j构建一个网络爬虫,分为两个步骤。
package com.example.jsoup;
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.io.FileWriter;
import java.io.IOException;
import java.util.Locale;
import java.util.regex.Pattern;
public class RediffCrawler extends WebCrawler {
//设置正则规则以.htm 为后端缀
public static final Pattern URLPattern=Pattern.compile(".*(\\.htm)$");
/**
* 用于过滤URL,如这里必须是以“https://www.xxxxxx,com/” 开头
* 以 .htm 结尾的URL才可以访问
*/
@Override
public boolean shouldVisit(Page referringPage, WebURL url) {
String href=url.getURL().toLowerCase();
return URLPattern.matcher(href).matches() &&
href.startsWith("https://www.xxxxxx,com/");
}
/**
* 处理URL
* @param page
*/
@Override
public void visit(Page page) {
String url=page.getWebURL().getURL(); //获取URL
if(URLPattern.matcher(url).matches()&&
page.getParseData() instanceof HtmlParseData){
FileWriter writer=null;
try {
//data目录下面存储每篇文档的内容
writer = new FileWriter("data/" + page.getWebURL().getDocid() + ".txt");
} catch (IOException e) {
e.printStackTrace();
}
HtmlParseData htmlParseData= (HtmlParseData)page.getParseData();
String html=htmlParseData.getHtml();
try {
writer.append("新闻的id为:"+page.getWebURL().getDocid()+"\n连接为:"+page.getWebURL().getURL()
+"\n新闻的标题为:"+htmlParseData.getTitle()+"\n");
} catch (IOException e) {
e.printStackTrace();
}
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.example.jsoup;
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 RediffNewController {
public static void main(String[] args) throws Exception {
//爬虫状态存储文件夹
String crawlStorageFolder = "E:\\java\\jsoup";
int numberOfCrawlers = 5; //线程数
final CrawlConfig config = new CrawlConfig();
config.setMaxDepthOfCrawling(1); //只采集第一层页面的数据
config.setMaxPagesToFetch(10); //最多采集10个页面
config.setFollowRedirects(false); //是否允许重定向
config.setCrawlStorageFolder(crawlStorageFolder);
//配置信息
final PageFetcher pageFetcher = new PageFetcher(config);
//robots 协议
RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
final RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
final CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
//添加种子url
controller.addSeed("https://www.xxxxx.com");
//运行网络爬虫
controller.start(RediffCrawler.class,numberOfCrawlers);
}
}
使用CrawlConfig类中的方法配置了网络爬虫采集页面深度、采集页面数、是否允许重定向和状态文件存储位置方面的信息。查看CrawlConfig类的源码可以发现,其还可以配置网络爬虫的其他信息。
1.User-Agent
使用CrawlConfig类中的setUserAgentString()方法可以配置User-Agent,配置程序如下所示。
config.setUserAgentString("Mozilla/5.0 (Windows NT 10.0; Win; x"+"AppleWebKit/537.36(KHTML, like chrome/" +
"63.0.3239.108 Safari/537.36");
2.头信息
CrawlConfig类中的setDefaultHeaders()方法用于设置请求头信息。从该方法的源码中可以发现,调用该方法需要输入Collection<BasicHeader>类型的参数。
final HashSet<BasicHeader> collections= new HashSet<>();
collections.add(new BasicHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win; x"+"AppleWebKit/537.36(KHTML, like chrome/" +
"63.0.3239.108 Safari/537.36"));
config.setDefaultHeaders(collections);
3.请求时间间隔
为了礼貌地采集网站数据,CrawlConfig类提供了setPolitenessDelay()方法,该方法用于设置每个线程任意两次请求之间的时间间隔(默认值为200毫秒)。以下为配置程序。
config.setPolitenessDelay(1000); //1000毫秒
4.HTTPS网页的采集
针对使用HTTPS协议的URL页面内容的采集,CrawlConfig类提供了setIncludeHttpsPages()方法,该方法的默认输入值为true。以下为配置程序。
config.setIncludeHttpsPages(false); //不采用HTTPS网页
5.二进制文件
CrawlConfig类提供了setIncludeBinaryContentInCrawling()方法,用于设置是否采集图片和PDF等二进制文件,该方法的默认值为false。以下为配置程序。
config.setIncludeBinaryContentInCrawling(true); //运行采集二进制文件
6.超时时间
CrawlConfig类中的setSocketTimeout()方法用于设置获取数据的超时时间,默认值为20000毫秒;setConnectionTimeout()用于设置建立连接超时,默认值为30000毫秒。如下为这两种方法的使用示例。
config.setSocketTimeout(1000); //超时时间
config.setConnectionTimeout(1000);
7.代理使用
CrawlConfig类提供了用于设置代理域名的方法——setProxyHost()方法及设置端口的方法——setProxyPort()方法。如下为这两种方法的使用示例。
使用setProxyHost()方法和setProxyPort()方法只能配置单个代理,其并不支持代理的可用性检查和代理的切换。
config.setProxyHost("171.97.67.160");
config.setProxyPort(3128);
接着,构建一个控制类,用于配置网络爬虫、执行数据采集任务。在主方法中,设置了爬虫状态存储的文件夹、线程数目、采集的深度、是否允许重定向、头信息、是否允许采集二进制文件和超时时间。
package com.example.jsoup;
import com.google.common.io.Files;
import edu.uci.ics.crawler4j.crawler.Page;
import edu.uci.ics.crawler4j.crawler.WebCrawler;
import edu.uci.ics.crawler4j.parser.BinaryParseData;
import edu.uci.ics.crawler4j.url.WebURL;
import java.io.File;
import java.util.UUID;
import java.util.regex.Pattern;
public class PictureCrawler extends WebCrawler {
//设置过滤规则
public static final Pattern FILTERS = Pattern.compile(".*(\\.(ccs|js|mid|mp2|mp3|wav|av|mov" +
"|mpeg|ram|mev|pdf|rm|smil|wmv|swf|wma|zip|rar|gz))$");
/**
* 匹配图片规则
* JPG/JPEG/PNG格式
*/
public static final Pattern imgPatterns = Pattern.compile(".*(\\.(bmp|gif|jpe?g|png|tiff?))$");
public static File storageFolder; //获取的图片本地存储地址
/**
* 配置 本地存储文件
*
* @param storageFolderName
*/
public static void configure(String storageFolderName) {
storageFolder = new File(storageFolderName);
if (!storageFolder.exists()) { //假如文件不存在
storageFolder.mkdirs(); //创建一个文件
}
}
@Override
public boolean shouldVisit(Page referringPage, WebURL url) {
String href = url.getURL().toLowerCase();
if (FILTERS.matcher(href).matches()) {
return false;
}
if (imgPatterns.matcher(href).matches()) {
return true;
}
if (href.startsWith("“https://*******.com/zh/photos")) {
return true;
}
return false;
}
/**
* 处理URL 存储图片
*/
@Override
public void visit(Page page) {
String url = page.getWebURL().getURL();//获取URL
//满足 条件输出图片
if (imgPatterns.matcher(url).matches()
&& page.getParseData() instanceof BinaryParseData
&& page.getContentData().length > (5 * 1024)) {
}
//获取图片的后缀
String extension = url.substring(url.lastIndexOf("."));
//通过UUID拼接成唯一图片名称
String hashedName = UUID.randomUUID() + extension;
//存储图片
String filename=storageFolder.getAbsolutePath()+"/"+hashedName;
try {
Files.write(page.getContentData(), new File(filename));
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.example.jsoup;
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;
import org.apache.http.message.BasicHeader;
import java.net.URLEncoder;
import java.util.HashSet;
public class PictureCrawlerController {
public static void main(String[] args) throws Exception {
//爬虫状态存储文件夹
String crawlStorageFolder = "E:\\java\\jsoup";
String storageFolder = "E:/picture";
int numberOfCrawlers = 5; //线程数
final CrawlConfig config = new CrawlConfig();
config.setMaxDepthOfCrawling(3); //中采集第三层页面的数据
config.setFollowRedirects(false); //是否允许重定向
config.setCrawlStorageFolder(crawlStorageFolder);
//设置请求头
final HashSet<BasicHeader> collections = new HashSet<>();
collections.add(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win; x" + "AppleWebKit/537.36(KHTML, like chrome/" +
"63.0.3239.108 Safari/537.36"));
config.setDefaultHeaders(collections);
config.setPolitenessDelay(2000); //请求时间间隔 一定要设置
//是否采集二进制文件
config.setIncludeBinaryContentInCrawling(true);
config.setSocketTimeout(10000); //超时时间
config.setConnectionTimeout(10000);
//配置信息
final PageFetcher pageFetcher = new PageFetcher(config);
//robots 协议
RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
final RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
final CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
//添加种子url
controller.addSeed("https://www.xxxxx.com"+ URLEncoder.encode("深林","utf-8")+"/");
PictureCrawler.configure(storageFolder); //配置存储位置
//运行网络爬虫
controller.start(PictureCrawler.class,numberOfCrawlers);
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务