您好,欢迎来到年旅网。
搜索
您的当前位置:首页Crawler4j

Crawler4j

来源:年旅网

1. Crawler4j简介

 2.依赖

<!-- https://mvnrepository.com/artifact/edu.uci.ics/crawler4j -->
<dependency>
    <groupId>edu.uci.ics</groupId>
    <artifactId>crawler4j</artifactId>
    <version>4.4.0</version>
</dependency

 3. 入门案例

使用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);



    }
}

4.相关配置

使用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);

5. 图片的采集

    接着,构建一个控制类,用于配置网络爬虫、执行数据采集任务。在主方法中,设置了爬虫状态存储的文件夹、线程数目、采集的深度、是否允许重定向、头信息、是否允许采集二进制文件和超时时间。

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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务