精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java網(wǎng)絡爬蟲的實現(xiàn)

開發(fā) 后端
記得在剛找工作時,隔壁的一位同學在面試時豪言壯語曾實現(xiàn)過網(wǎng)絡爬蟲,當時的景仰之情猶如滔滔江水連綿不絕。后來,在做圖片搜索時,需要大量的測試圖片,因此萌生了從Amazon中爬取圖書封面圖片的想法,從網(wǎng)上也吸取了一些前人的經(jīng)驗,實現(xiàn)了一個簡單但足夠用的爬蟲系統(tǒng)。

記得在剛找工作時,隔壁的一位同學在面試時豪言壯語曾實現(xiàn)過網(wǎng)絡爬蟲,當時的景仰之情猶如滔滔江水連綿不絕。后來,在做圖片搜索時,需要大量的測試圖片,因此萌生了從Amazon中爬取圖書封面圖片的想法,從網(wǎng)上也吸取了一些前人的經(jīng)驗,實現(xiàn)了一個簡單但足夠用的爬蟲系統(tǒng)。

網(wǎng)絡爬蟲是一個自動提取網(wǎng)頁的程序,它為搜索引擎從萬維網(wǎng)上下載網(wǎng)頁,是搜索引擎的重要組成,其基本架構如下圖所示:

 

[[19805]]

 

傳統(tǒng)爬蟲從一個或若干初始網(wǎng)頁的URL開始,獲得初始網(wǎng)頁上的URL,在抓取網(wǎng)頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統(tǒng)的一定停止條件。對于垂直搜索來說,聚焦爬蟲,即有針對性地爬取特定主題網(wǎng)頁的爬蟲,更為適合。

本文爬蟲程序的核心代碼如下:

Java代碼

 

 

  1. public void crawl() throws Throwable {     
  2.     while (continueCrawling()) {     
  3.         CrawlerUrl url = getNextUrl(); //獲取待爬取隊列中的下一個URL     
  4.         if (url != null) {     
  5.             printCrawlInfo();      
  6.             String content = getContent(url); //獲取URL的文本信息     
  7.                  
  8.             //聚焦爬蟲只爬取與主題內容相關的網(wǎng)頁,這里采用正則匹配簡單處理     
  9.             if (isContentRelevant(content, this.regexpSearchPattern)) {     
  10.                 saveContent(url, content); //保存網(wǎng)頁至本地     
  11.     
  12.                 //獲取網(wǎng)頁內容中的鏈接,并放入待爬取隊列中     
  13.                 Collection urlStrings = extractUrls(content, url);     
  14.                 addUrlsToUrlQueue(url, urlStrings);     
  15.             } else {     
  16.                 System.out.println(url + " is not relevant ignoring ...");     
  17.             }     
  18.     
  19.             //延時防止被對方屏蔽     
  20.             Thread.sleep(this.delayBetweenUrls);     
  21.         }     
  22.     }     
  23.     closeOutputStream();     
  24. }    

 

整個函數(shù)由getNextUrl、getContent、isContentRelevant、extractUrls、addUrlsToUrlQueue等幾個核心方法組成,下面將一一介紹。先看getNextUrl:

Java代碼

 

復制代碼

 

 

  1. private CrawlerUrl getNextUrl() throws Throwable {     
  2.     CrawlerUrl nextUrl = null;     
  3.     while ((nextUrl == null) && (!urlQueue.isEmpty())) {     
  4.         CrawlerUrl crawlerUrl = this.urlQueue.remove();     
  5.                     
  6.         //doWeHavePermissionToVisit:是否有權限訪問該URL,友好的爬蟲會根據(jù)網(wǎng)站提供的"Robot.txt"中配置的規(guī)則進行爬取     
  7.         //isUrlAlreadyVisited:URL是否訪問過,大型的搜索引擎往往采用BloomFilter進行排重,這里簡單使用HashMap     
  8.         //isDepthAcceptable:是否達到指定的深度上限。爬蟲一般采取廣度優(yōu)先的方式。一些網(wǎng)站會構建爬蟲陷阱(自動生成一些無效鏈接使爬蟲陷入死循環(huán)),采用深度限制加以避免     
  9.         if (doWeHavePermissionToVisit(crawlerUrl)     
  10.             && (!isUrlAlreadyVisited(crawlerUrl))      
  11.             && isDepthAcceptable(crawlerUrl)) {     
  12.             nextUrl = crawlerUrl;     
  13.             // System.out.println("Next url to be visited is " + nextUrl);     
  14.         }     
  15.     }     
  16.     return nextUrl;     
  17. }   

 

更多的關于robot.txt的具體寫法,可參考以下這篇文章:

http://www.bloghuman.com/post/67/

getContent內部使用apache的httpclient 4.1獲取網(wǎng)頁內容,具體代碼如下:

Java代碼

 

 

  1. private String getContent(CrawlerUrl url) throws Throwable {     
  2.     //HttpClient4.1的調用與之前的方式不同     
  3.     HttpClient client = new DefaultHttpClient();     
  4.     HttpGet httpGet = new HttpGet(url.getUrlString());     
  5.     StringBuffer strBuf = new StringBuffer();     
  6.     HttpResponse response = client.execute(httpGet);     
  7.     if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {     
  8.         HttpEntity entity = response.getEntity();     
  9.         if (entity != null) {     
  10.             BufferedReader reader = new BufferedReader(     
  11.                 new InputStreamReader(entity.getContent(), "UTF-8"));     
  12.             String line = null;     
  13.             if (entity.getContentLength() > 0) {     
  14.                 strBuf = new StringBuffer((int) entity.getContentLength());     
  15.                 while ((line = reader.readLine()) != null) {     
  16.                     strBuf.append(line);     
  17.                 }     
  18.             }     
  19.         }     
  20.         if (entity != null) {     
  21.             entity.consumeContent();     
  22.         }     
  23.     }     
  24.     //將url標記為已訪問     
  25.     markUrlAsVisited(url);     
  26.     return strBuf.toString();     
  27. }    

 

對于垂直型應用來說,數(shù)據(jù)的準確性往往更為重要。聚焦型爬蟲的主要特點是,只收集和主題相關的數(shù)據(jù),這就是isContentRelevant方法的作用。這里或許要使用分類預測技術,為簡單起見,采用正則匹配來代替。其主要代碼如下:

Java代碼

 

 

  1. public static boolean isContentRelevant(String content,     
  2. Pattern regexpPattern) {     
  3.     boolean retValue = false;     
  4.     if (content != null) {     
  5.         //是否符合正則表達式的條件     
  6.         Matcher m = regexpPattern.matcher(content.toLowerCase());     
  7.         retValue = m.find();     
  8.     }     
  9.     return retValue;     
  10. }    

 

extractUrls的主要作用,是從網(wǎng)頁中獲取更多的URL,包括內部鏈接和外部鏈接,代碼如下:

Java代碼

 

 

  1. public List extractUrls(String text, CrawlerUrl crawlerUrl) {     
  2.     Map urlMap = new HashMap();     
  3.     extractHttpUrls(urlMap, text);     
  4.     extractRelativeUrls(urlMap, text, crawlerUrl);     
  5.     return new ArrayList(urlMap.keySet());     
  6. }     
  7.     
  8. //處理外部鏈接     
  9. private void extractHttpUrls(Map urlMap, String text) {     
  10.     Matcher m = httpRegexp.matcher(text);     
  11.     while (m.find()) {     
  12.         String url = m.group();     
  13.         String[] terms = url.split("a href=\"");     
  14.         for (String term : terms) {     
  15.             // System.out.println("Term = " + term);     
  16.             if (term.startsWith("http")) {     
  17.                 int index = term.indexOf("\"");     
  18.                 if (index > 0) {     
  19.                     term = term.substring(0, index);     
  20.                 }     
  21.                 urlMap.put(term, term);     
  22.                 System.out.println("Hyperlink: " + term);     
  23.             }     
  24.         }     
  25.     }     
  26. }     
  27.     
  28. //處理內部鏈接     
  29. private void extractRelativeUrls(Map urlMap, String text,     
  30.         CrawlerUrl crawlerUrl) {     
  31.     Matcher m = relativeRegexp.matcher(text);     
  32.     URL textURL = crawlerUrl.getURL();     
  33.     String host = textURL.getHost();     
  34.     while (m.find()) {     
  35.         String url = m.group();     
  36.         String[] terms = url.split("a href=\"");     
  37.         for (String term : terms) {     
  38.             if (term.startsWith("/")) {     
  39.                 int index = term.indexOf("\"");     
  40.                 if (index > 0) {     
  41.                     term = term.substring(0, index);     
  42.                 }     
  43.                 String s = "http://" + host + term;     
  44.                 urlMap.put(s, s);     
  45.                 System.out.println("Relative url: " + s);     
  46.             }     
  47.         }     
  48.     }     
  49.     
  50. }    

 

如此,便構建了一個簡單的網(wǎng)絡爬蟲程序,可以使用以下程序來測試它:

Java代碼

 

 

  1. public static void main(String[] args) {     
  2.     try {     
  3.         String url = "http://www.amazon.com";     
  4.         Queue urlQueue = new LinkedList();     
  5.         String regexp = "java";     
  6.         urlQueue.add(new CrawlerUrl(url, 0));     
  7.         NaiveCrawler crawler = new NaiveCrawler(urlQueue, 1005, 1000L,     
  8.                 regexp);     
  9.         // boolean allowCrawl = crawler.areWeAllowedToVisit(url);     
  10.         // System.out.println("Allowed to crawl: " + url + " " +     
  11.         // allowCrawl);     
  12.         crawler.crawl();     
  13.     } catch (Throwable t) {     
  14.         System.out.println(t.toString());     
  15.         t.printStackTrace();     
  16.     }     
  17. }    

 

當然,你可以為它賦予更為高級的功能,比如多線程、更智能的聚焦、結合Lucene建立索引等等。更為復雜的情況,可以考慮使用一些開源的蜘蛛程序,比如Nutch或是Heritrix等等,就不在本文的討論范圍了。

【編輯推薦】

  1. Java創(chuàng)始人:Oracle起訴Google與版權無關
  2. 薪酬與權力 Java之父講述離職Oracle內幕
  3. Java之父:我們看中的并非Java語言,而是JVM
  4. 2010年10月編程語言排行榜:Java的混亂之治
責任編輯:金賀 來源: JavaEye博客
相關推薦

2012-05-10 13:42:26

Java網(wǎng)絡爬蟲

2017-05-16 15:33:42

Python網(wǎng)絡爬蟲核心技術框架

2018-02-23 14:30:13

2010-04-20 11:40:52

網(wǎng)絡爬蟲

2024-04-30 09:33:00

JavaScriptPythonexecjs

2018-05-14 15:27:06

Python網(wǎng)絡爬蟲爬蟲架構

2023-06-01 13:15:23

2019-10-18 08:52:41

程序員爬蟲Java

2022-09-20 07:02:20

網(wǎng)絡爬蟲反爬蟲

2018-01-30 18:15:12

Python網(wǎng)絡爬蟲gevent

2024-03-08 12:17:39

網(wǎng)絡爬蟲Python開發(fā)

2023-11-27 08:51:46

PythonRequests庫

2024-11-27 06:31:02

2012-06-13 17:38:57

2019-10-08 16:35:53

Java網(wǎng)絡爬蟲webmagic

2011-03-18 10:25:20

javac++Python

2024-07-02 11:32:38

2024-11-22 16:06:21

2016-08-18 00:21:12

網(wǎng)絡爬蟲抓取網(wǎng)絡

2019-06-11 09:06:22

網(wǎng)絡爬蟲工具
點贊
收藏

51CTO技術棧公眾號

国产传媒久久文化传媒| 午夜激情久久| 一本一道久久a久久精品| 精品婷婷色一区二区三区蜜桃| 国产做受高潮漫动| 日韩av影院| 色噜噜夜夜夜综合网| 亚洲午夜精品久久| 丰满少妇一级片| 三级精品在线观看| 久久成人在线视频| 蜜桃传媒一区二区亚洲av| 成人福利片在线| 亚洲综合在线视频| 欧美日韩视频在线一区二区观看视频| 亚洲天堂999| 欧美特黄一区| 一本久久综合亚洲鲁鲁| 污污的网站免费| 国产乱码午夜在线视频| 国产精品欧美精品| 成人资源av| 真实新婚偷拍xxxxx| 国产精品激情| 精品国产欧美成人夜夜嗨| 亚洲av成人片无码| 精品视频一区二区三区| 一本在线高清不卡dvd| 特级西西人体www高清大胆| 免费人成在线观看网站| 国产成人精品免费在线| 国产精品h片在线播放| 九九久久免费视频| 精品久久久久久久| 日韩高清中文字幕| 精品人妻二区中文字幕| 日韩在线短视频| 亚洲成人在线网站| 日韩视频在线免费播放| 成人一区二区不卡免费| 风流少妇一区二区| 成人h视频在线| 久久精品五月天| 一本色道精品久久一区二区三区| 欧美成人第一页| 亚洲熟女毛茸茸| 亚洲日本三级| 日韩激情av在线播放| 性xxxxxxxxx| 国产精品视频首页| 欧美日韩在线综合| 免费在线观看毛片网站| 国产蜜臀在线| 亚洲一区二区三区在线播放| 国产又粗又爽又黄的视频| www 日韩| 欧美韩国一区二区| 日韩aⅴ视频一区二区三区| 色视频在线观看福利| aaa欧美色吧激情视频| 国产98在线|日韩| 国产农村老头老太视频| 国产一区二区调教| 成人妇女免费播放久久久| 久久久久久av无码免费看大片| 99在线精品视频在线观看| 韩国精品久久久999| 黄色一级视频在线观看| 亚洲福利电影| 欧美一区二区.| 黄色一级视频免费看| 久久久久91| 国产成人在线亚洲欧美| 中文字幕一二区| 久久成人av少妇免费| 成人伊人精品色xxxx视频| 国产精品国产三级国产aⅴ| 久久精品久久精品| 成人性生交xxxxx网站| 国产一区二区在线视频聊天| 国产曰批免费观看久久久| 99精彩视频在线观看免费| 99久久夜色精品国产亚洲| 成人免费视频网站在线观看| 麻豆av一区| 色欧美激情视频在线| 亚洲日本在线天堂| avav在线播放| cao在线视频| 91福利国产精品| 狠狠操狠狠干视频| 8848成人影院| 日韩大陆毛片av| 欧美做受高潮6| 天天精品视频| 久久久久国产精品免费网站| 欧美啪啪小视频| 蜜桃精品在线观看| eeuss一区二区三区| 日本ー区在线视频| 亚洲欧洲国产日韩| 国产日韩av网站| 婷婷激情一区| 日韩午夜在线观看| a级大片在线观看| 亚洲天堂一区二区三区四区| 国模吧一区二区| 欧美brazzers| 丰满岳乱妇一区二区三区| 日韩av一区二区三区美女毛片| 成人在线影视| 在线一区二区三区四区五区| 久久aaaa片一区二区| 伊人精品一区| 亚洲精品视频91| 香蕉成人在线视频| 欧美1区免费| 国产suv精品一区二区三区88区| 国产美女免费视频| 国产日韩综合av| 性一交一乱一伧国产女士spa| 精品国产免费人成网站| 日韩欧美成人一区| 少妇无套高潮一二三区| 亚洲小说欧美另类社区| 国产精品女人网站| 三级黄视频在线观看| 亚洲欧美日韩国产综合在线| 国产视频在线视频| 免费看成人人体视频| 免费av一区二区| 中文区中文字幕免费看| 26uuu久久天堂性欧美| 国产爆乳无码一区二区麻豆 | h1515四虎成人| 亚洲成人av片在线观看| 免费成人美女女在线观看| 日韩av在线播放中文字幕| 精品乱码一区二区三区| 久久香蕉av| 日韩丝袜美女视频| 亚洲区一区二区三| 久久国产婷婷国产香蕉| 性刺激综合网| 欧美aaa视频| 亚洲丝袜av一区| www亚洲视频| 26uuu精品一区二区三区四区在线| 欧美精品久久久久久久久久久| 伊人久久影院| 91精品国产高清久久久久久久久 | 久久婷婷一区二区三区| 国产淫片av片久久久久久| 外国成人在线视频| 热久久这里只有精品| 国产专区在线播放| 欧美体内she精视频| 国产性猛交xx乱| 精品制服美女久久| 欧洲xxxxx| 国产精品久av福利在线观看| 78色国产精品| 国产无套粉嫩白浆在线2022年| 欧美在线一二三四区| 久久免费手机视频| 国产在线国偷精品产拍免费yy| 日韩激情视频一区二区| 日韩mv欧美mv国产网站| 日韩美女写真福利在线观看| 电影在线高清| 日韩一级在线观看| 国产奶水涨喷在线播放| 91捆绑美女网站| 在线观看国产一级片| 欧美久久一区| 美女黄毛**国产精品啪啪| 岛国一区二区| 欧美国产激情18| 久久经典视频| 7777精品伊人久久久大香线蕉 | 麻豆成人在线| 亚洲一区二区三区涩| 天堂va欧美ⅴa亚洲va一国产| 97超碰色婷婷| 一级毛片视频在线观看| 日韩欧美亚洲国产精品字幕久久久 | 妖精视频一区二区三区 | 高清一区二区三区| 国产91久久婷婷一区二区| 国产在线观看a| 日韩成人黄色av| 亚洲一区二区影视| 无吗不卡中文字幕| 免费看特级毛片| 91色porny在线视频| 日本在线观看视频一区| 亚洲在线观看| 热久久最新地址| 国产探花在线精品一区二区| 国产高清自拍一区| 91成人抖音| 97精品国产91久久久久久| 三级外国片在线观看视频| 亚洲国产精品人人爽夜夜爽| 国产精品久久影视| 一本大道久久a久久精品综合| 视频国产一区二区| 久久精品一区二区三区不卡| 中文字幕99页| 精品亚洲免费视频| 欧美综合在线观看视频| 欧美精品一线| 成人手机视频在线| 欧美熟乱15p| 久久av一区二区| 亚洲网址在线观看| 国产精品丝袜一区二区三区| 夜鲁夜鲁夜鲁视频在线播放| 久久久久免费视频| 免费看美女视频在线网站| 亚洲日本成人网| 三区在线观看| 日韩h在线观看| 日本国产在线观看| 日韩一区二区三区免费看| 97人妻精品一区二区三区动漫| 一本久久综合亚洲鲁鲁五月天| 国产一级在线视频| 一区二区三区 在线观看视频| 国产黄a三级三级| 国产女人aaa级久久久级 | 欧美性做爰毛片| sm在线观看| 欧美国产乱视频| 色yeye免费人成网站在线观看| 日韩视频免费观看| 91精品专区| 在线观看久久av| 国产高清免费在线播放| 日韩精品久久久久| 无码国产精品96久久久久| 精品久久一区二区| 亚洲精品福利网站| 精品国精品自拍自在线| 国产成人三级在线观看视频| 欧美电影免费观看完整版| www.97超碰| 欧美mv日韩mv亚洲| 国产综合视频在线| 亚洲国产精品yw在线观看| 欧美 日韩 国产 精品| 亚洲精品一区二区三区福利 | 欧美午夜网站| 高清不卡日本v二区在线| 国产福利一区二区精品秒拍| 国产一区二区久久久| 视频福利一区| 日本午夜精品电影| 日韩中文在线电影| 国产免费xxx| 最新亚洲激情| 久草综合在线观看| 久久狠狠亚洲综合| 日本wwwxx| 97精品久久久久中文字幕| 国产人妻一区二区| 国产精品不卡一区二区三区| 欧美成人综合色| 精品欧美一区二区三区| 69亚洲精品久久久蜜桃小说| 欧美日韩一区 二区 三区 久久精品| 91影院在线播放| 亚洲成人三级在线| 黄色在线播放| 久久网福利资源网站| 久草在线新免费首页资源站| 国产91精品视频在线观看| 韩国精品视频在线观看 | 成人亚洲综合天堂| 久久成人精品电影| 一区二区三区短视频| 成人激情黄色网| 国产毛片久久久| 亚洲国产精品一区在线观看不卡 | 九九久久成人| 综合国产精品久久久| a91a精品视频在线观看| 中文字幕在线观看第三页| 国产伦精品一区二区三区免费 | 亚洲欧美在线观看| 五月天婷婷网站| 欧美性色综合网| 性色av蜜臀av| 一本色道久久88亚洲综合88| 日本无删减在线| 国产精品视频成人| 激情亚洲另类图片区小说区| 亚洲在线色站| 亚洲欧美卡通另类91av| 三级av免费看| 国产欧美日韩一区二区三区在线观看| a在线视频播放观看免费观看| 欧美性猛交xxxx乱大交3| 国产黄频在线观看| 中文字幕精品在线视频| 川上优av中文字幕一区二区| 国产精品亚洲自拍| 欧美一区二区三区久久| 50度灰在线观看| 久久精品国产第一区二区三区| 国产精品探花一区二区在线观看| 亚洲人妖av一区二区| 亚洲永久精品一区| 亚洲精品久久久久久久久久久久| 成人片在线看| 国产精品免费网站| 女厕嘘嘘一区二区在线播放 | 亚洲第一区中文99精品| 黄色免费在线网站| 国产精品免费久久久久影院| 妖精视频一区二区三区免费观看| 日本一本中文字幕| 国产精品18久久久久久久久| 国产喷水在线观看| 欧美日韩一级片网站| 久青青在线观看视频国产| 韩剧1988在线观看免费完整版| 51精品国产| 成人午夜视频免费观看| 国产麻豆视频一区| 久久国产波多野结衣| 欧美老肥妇做.爰bbww| 国产区视频在线播放| 热久久这里只有| 啪啪亚洲精品| 欧美成人黑人猛交| 久久久美女毛片| 日日骚av一区二区| 日韩黄色在线免费观看| 欧美日韩国产观看视频| 精品国产免费一区二区三区| 日韩午夜在线电影| 日本三级日本三级日本三级极| 午夜欧美一区二区三区在线播放| 风流少妇一区二区三区91| 97高清免费视频| 神马香蕉久久| 亚洲少妇第一页| 国产精品萝li| 99精品在线看| 久久99青青精品免费观看| eeuss鲁片一区二区三区| 缅甸午夜性猛交xxxx| 91网站最新网址| 欧美一级淫片免费视频黄| 亚洲人成在线观| 国产一区影院| 欧美日韩中文字幕在线播放| 国产不卡在线视频| 国产区在线观看视频| 亚洲欧美日韩成人| 亚洲综合av一区二区三区| 一区二区三区的久久的视频| 国产麻豆精品在线观看| 日韩美女黄色片| 亚洲欧洲中文天堂| 男人天堂久久| av片在线免费| 久久久久久久久久久黄色| 中文字幕有码无码人妻av蜜桃| 久久精品国产久精国产一老狼| 日本高清精品| 国内外成人免费激情视频| 国产精品视频在线看| www.黄色一片| 人妖精品videosex性欧美| 日韩一区二区三区免费播放| 亚洲午夜精品在线观看| 精品欧美aⅴ在线网站| 美女隐私在线观看| 国产一级精品aaaaa看| 日本视频在线一区| 国产亚洲第一页| 国产午夜一区二区| 视频欧美一区| 国产理论在线播放| 亚洲国产视频a| 电影av一区| 激情五月综合色婷婷一区二区 | 国产精品大全| 日韩1区2区3区| 精品午夜福利视频| 一本一本久久a久久精品综合小说| 精品国产亚洲一区二区在线观看 | 成人av中文字幕| 亚洲视频一区在线播放| 97久久国产精品| 欧美国产91| 欧美人与禽zoz0善交| 欧美精品一区二区三区高清aⅴ |