java使用Crawler4j开发爬虫
生活随笔
收集整理的這篇文章主要介紹了
java使用Crawler4j开发爬虫
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
在爬蟲開發中,常用的語言是python,但是也可以使用java來進行 開發,這樣就可以利用java強大的庫,下面就來介紹一下常用的java爬蟲框架。
Crawler4j
官網:https://github.com/yasserg/crawler4j
開發順序:
下面上代碼:
// 此類用于控制爬蟲爬取網頁的圖片,并且將圖片存儲在本地 public class ImageCrawler extends WebCrawler {// 用于過濾,使用正則表達式匹配private static final Pattern filters = Pattern.compile(".*(\\.(css|js|mid|mp2|mp3|mp4|wav|avi|mov|mpeg|ram|m4v|pdf" +"|rm|smil|wmv|swf|wma|zip|rar|gz))$");// 用于確定需要爬取的資源類型(這邊是爬取圖片)private static final Pattern imgPatterns = Pattern.compile(".*(\\.(bmp|gif|jpe?g|png|tiff?))$");// 存儲圖片的文件夾private static File storageFolder;// 爬蟲會爬取的域,可以是一個普通的URLprivate static String[] crawlDomains;// 初始化Controllerpublic static void configure(String[] domain, String storageFolderName) {crawlDomains = domain;storageFolder = new File(storageFolderName);if (!storageFolder.exists()) {storageFolder.mkdirs();}}@Override// 確定需不需要下載url所指定的資源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;}// 如果是網頁,進行url匹配,看是不是在需要下載的域內部for (String domain : crawlDomains) {// 在需要下載的域內if (href.startsWith(domain)) {return true;}}return false;}// shouldVisit為true,則會調用此函數@Overridepublic void visit(Page page) {String url = page.getWebURL().getURL();// 如果是圖片,并且圖片大小在10kb以內,就不訪問if (!imgPatterns.matcher(url).matches() ||!((page.getParseData() instanceof BinaryParseData) ||(page.getContentData().length < (10 * 1024)))) {return;}// get a unique name for storing this image// 獲取圖片的格式String extension = url.substring(url.lastIndexOf('.'));// 獲取圖片的名稱,此處是隨機值String hashedName = UUID.randomUUID() + extension;// 存儲圖片String filename = storageFolder.getAbsolutePath() + "/" + hashedName;try {// 寫入文件系統,并且輸出到磁盤Files.write(page.getContentData(), new File(filename));logger.info("Stored: {}", url);} catch (IOException iox) {logger.error("Failed to write file: " + filename, iox);}} }下面是啟動爬蟲所用:
public class ImageCrawlController {private static final Logger logger = LoggerFactory.getLogger(ImageCrawlController.class);public static void main(String[] args) throws Exception {// 爬蟲參數控制,需要傳入3個參數// 存儲路徑,這個是存儲爬蟲的運行時數據的// 并行線程數量// 圖片存儲路徑if (args.length < 3) {logger.info("Needed parameters: ");logger.info("\t rootFolder (it will contain intermediate crawl data)");logger.info("\t numberOfCralwers (number of concurrent threads)");logger.info("\t storageFolder (a folder for storing downloaded images)");return;}String rootFolder = args[0];int numberOfCrawlers = Integer.parseInt(args[1]);String storageFolder = args[2];CrawlConfig config = new CrawlConfig();// 設置運行數據存儲路徑config.setCrawlStorageFolder(rootFolder);// 下載二進制數據(圖片是二進制的數據)config.setIncludeBinaryContentInCrawling(true);// 需要爬的網站String[] crawlDomains = {"http://uci.edu/"};// PageFetcher是用于下載數據的 PageFetcher pageFetcher = new PageFetcher(config);// 用于控制是否遵守robots協議RobotstxtConfig robotstxtConfig = new RobotstxtConfig();RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);// 添加爬蟲最初爬取的網頁for (String domain : crawlDomains) {controller.addSeed(domain);}ImageCrawler.configure(crawlDomains, storageFolder);// 啟動爬蟲,使用并行controller.start(ImageCrawler.class, numberOfCrawlers);} }#Tip:本文所用代碼是Crawler4j官方代碼,只是稍作注解而已
轉載于:https://my.oschina.net/u/3039639/blog/798512
總結
以上是生活随笔為你收集整理的java使用Crawler4j开发爬虫的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server 2008 修改安装
- 下一篇: 细聊分布式ID生成方法