Crawler4j+jsoup 爬虫

第一步:如果读者使用过maven,可以很轻松的使用maven引入即可。

Crawler4j+jsoup 爬虫_第1张图片

如果你没有用过maven那么,你需要把源码打成jar包,然后引入jar包,使用即可。

第二步:创建一个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规则,发现目录都在

  • 标签中

    Crawler4j+jsoup 爬虫_第2张图片

    继续展开

  • 标签,看到该目录的具体信息,这里笔者爬取的是一级菜单,其他信息依然可以根据读者需求自定义爬取Crawler4j+jsoup 爬虫_第3张图片

    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 = 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 = (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);
            }
        }
    }

    看一下运行结果,我选择输出一级分类名,和对应网址

    Crawler4j+jsoup 爬虫_第4张图片

    这个文章写的相对粗糙,周末有空在好好整理一下吧

    推荐博文 https://blog.csdn.net/qq_34337272/article/details/78815547

  • 转载于:https://my.oschina.net/u/3687618/blog/3014691

    你可能感兴趣的:(Crawler4j+jsoup 爬虫)