Crawler4j+jsoup|Crawler4j+jsoup 爬虫
第一步:如果读者使用过maven,可以很轻松的使用maven引入即可。
文章图片
如果你没有用过maven那么,你需要把源码打成jar包,然后引入jar包,使用即可。
【Crawler4j+jsoup|Crawler4j+jsoup 爬虫】第二步:创建一个crawler类继承WebCrawler ,并重写两个方法,如下:
public class MyCrawler2 extends WebCrawler {
@Override
public boolean shouldVisit(Page referringPage, WebURL url) {
//这个方法的作用是过滤不想访问的url
//return false时url被过滤掉不会被爬取
return super.shouldVisit(referringPage, url);
}
@Override
public void visit(Page page) {
//这个方法的作用是当shouldVisit方法返回true时,调用该方法,获取网页内容,已被封装到Page对象中
super.visit(page);
}
}
第三步:创建一个controller类(实际任意类都行),创建main方法,根据官方文档,只需修改线程数量和url就行了。该url可以被称为种子,只要传入一个url,crawler4j就会根据url中的内容获取页面中所有的url然后再次爬取,周而复始,但重复的网址不会重复爬取,不会出现死循环。
public class Controller {
public static void main(String[] args) throws Exception {
String crawlStorageFolder = "/data/crawl/root";
//文件存储位置
int numberOfCrawlers = 7;
//线程数量
CrawlConfig config = new CrawlConfig();
config.setCrawlStorageFolder(crawlStorageFolder);
//配置对象设置
PageFetcher pageFetcher = new PageFetcher(config);
RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
//创建
controller.addSeed("http://www.ics.uci.edu/~lopes/");
//传入的url
controller.start(MyCrawler.class, numberOfCrawlers);
//开始执行爬虫
}
}
启动main方法就可以完成网页的爬取了。
下面写一个实例,爬取欧洲黄页的企业信息
1.控制器
public class CrawlerController {
public static void main(String[] args) throws Exception {
String crawkStirageFolder = "E:/CRAWLER/jd/test1";
//定义爬虫数据存储位置
int numberOfCrawlers=1;
//定义1个爬虫,也就是1个线程,爬虫数量不可以超出cpu的线程
CrawlConfig config=new CrawlConfig();
//定义爬虫配置
config.setCrawlStorageFolder(crawkStirageFolder);
/*
实例化爬虫控制器
*/
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);
controller.addSeed("https://www.europages.cn/qiyeminglu.html");
//传入种子 要爬的网站
controller.start(MyCrawler2.class,numberOfCrawlers);
//开始执行爬虫}
}
2.爬虫类,这里的两个实现方法尤为重要,控制器只是一个访问的入口,具体访问规则和访问结果的获取都是在这两个方法中实现。
查看欧洲黄页关html规则,发现目录都在
文章图片
继续展开
文章图片
public class MyCrawler2 extends WebCrawler {
//自定义过滤规则
private final static Pattern FILTERS=Pattern.compile(".*(\\.(css|js|gif|jpg|png|mp3|mp4|zip|gz))$");
@Override
public boolean shouldVisit(Page referringPage, WebURL url){
/* return super.shouldVisit(referringPage,url);
*/
String href = https://www.it610.com/article/url.getURL().toLowerCase();
//爬取的网址 转小写
//这里定义过滤的网址,我的需求是只爬取一级菜单
boolean b =!FILTERS.matcher(href).matches()&&href.startsWith("https://www.europages.cn/qiyeminglu.html");
return b;
}
@Override
public void visit(Page page){
/*super.visit(page);
*/
String url = page.getWebURL().getURL();
System.out.println(url);
//判断page是否为真正的网页
if (page.getParseData() instanceof HtmlParseData) {
HtmlParseData htmlParseData = https://www.it610.com/article/(HtmlParseData) page.getParseData();
String html = htmlParseData.getHtml();
//页面html内容
Document doc= Jsoup.parse(html);
//将html解析成一个Document类//使用选择器的时候需要了解网页中的html规则,自己去网页中F12一下,
Elements content=doc.getElementsByClass("title test_actvLink");
if (content.size()==0){
return;
}
//Elements elements =doc.select(".gl-item");
int num=0;
for (Element element: content) {
String text=element.text();
String weburl=element.attr("href");
System.out.println(text);
System.out.println(weburl);
num++;
}
System.out.println("分类总算为"+num);
}
}
}
看一下运行结果,我选择输出一级分类名,和对应网址
文章图片
这个文章写的相对粗糙,周末有空在好好整理一下吧
推荐博文 https://blog.csdn.net/qq_34337272/article/details/78815547
转载于:https://my.oschina.net/u/3687618/blog/3014691
推荐阅读
- 也许第一步很难,但跨过去就好了
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- 爬虫数据处理HTML转义字符
- 2018-12-05爬虫
- 高度自律等于成功的第一步
- 高效纠错
- Python爬虫技术要学到什么程度才可以找到工作()
- python|python 爬虫抓取图片
- IOST任务教程
- 爬虫|若想拿下爬虫大单,怎能不会逆向爬虫,价值过万的逆向爬虫教程限时分享