在爬蟲開發中,經常使用的語言是python,可是也能夠使用java來進行 開發,這樣就能夠利用java強大的庫,下面就來介紹一下經常使用的java爬蟲框架。css
官網:https://github.com/yasserg/crawler4j
開發順序:java
下面上代碼:python
// 此類用於控制爬蟲爬取網頁的圖片,而且將圖片存儲在本地 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; // 爬蟲會爬取的域,能夠是一個普通的URL private static String[] crawlDomains; // 初始化Controller public 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,則會調用此函數 @Override public 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); } } }
下面是啓動爬蟲所用:git
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官方代碼,只是稍做註解而已github