2013-02-15 24 views
1

我正在为我的一个课程做作业。专门用于下载图像和文件的网页爬虫

我应该写一个webcrawler,从给定指定爬网深度的网站下载文件和图像。

我被允许使用第三方解析API,所以我使用Jsoup。我也试过htmlparser。这两个不错的软件,但他们并不完美。

我使用默认java URLConnection在处理url之前检查内容类型,但随着链接数量增长,它变得非常慢。

问题:任何人都知道图像和链接的任何专业解析器API?

我可以开始使用Jsoup写我的,但我很懒。除了为什么要重新发明轮子,如果有可行的解决方案呢?任何帮助,将不胜感激。

我需要检查contentType while循环链接来检查链接是否是一个文件,在一个有效的方式,但Jsoup没有我所需要的。继承人我有什么: **

HttpConnection mimeConn =null; 
    Response mimeResponse = null; 
    for(Element link: links){ 

     String linkurl =link.absUrl("href"); 
     if(!linkurl.contains("#")){ 

      if(DownloadRepository.curlExists(link.absUrl("href"))){ 
       continue; 
      } 

      mimeConn = (HttpConnection) Jsoup.connect(linkurl); 
      mimeConn.ignoreContentType(true); 
      mimeConn.ignoreHttpErrors(true); 
      mimeResponse =(Response) mimeConn.execute(); 

      WebUrl webUrl = new WebUrl(linkurl,currentDepth+1); 
      String contentType = mimeResponse.contentType(); 

      if(contentType.contains("html")){ 
       page.addToCrawledPages(new WebPage(webUrl)); 
      }else if(contentType.contains("image")){      
       page.addToImages(new WebImage(webUrl)); 
      }else{ 
       page.addToFiles(new WebFile(webUrl)); 
      } 

      DownloadRepository.addCrawledURL(linkurl); 

     }** 

UPDATE 基于Yoshi的答案,我能得到我的代码工作的权利。这里的链接:

https://github.com/unekwu/cs_nemesis/blob/master/crawler/crawler/src/cu/cs/cpsc215/project1/parser/Parser.java

+0

如果您的懒惰检查'wget'可以做同样的工作 – Viren 2013-02-15 12:30:32

+1

Java开发对于研究来说很重要,它为给定问题域找到最好的API并使用它来解决您的问题。当然,懒惰,不要重蹈覆辙,但不要懒惰,不要做自己的研究。 – sbk 2013-02-15 12:39:54

回答

3

使用jSoup我觉得这个API是你的目的不够好。你也可以在这个网站上找到好的食谱。

几个步骤:

  1. Jsoup: how to get an image's absolute url?
  2. how to download image from any web page in java
  3. 您可以编写通过包含nesessary域名或相关的链接网页上的链接走出自己的递归方法。用这种方法抓住所有链接并找到它上面的所有图像。自己写这不是一个坏习惯。

你不需要使用URLConnection类,jSoup有它的包装。

e。摹

可以使用的只有一行代码来获得DOM对象:

Document doc = Jsoup.connect("http://en.wikipedia.org/").get(); 

,而不是验证码:

URL oracle = new URL("http://www.oracle.com/"); 
    URLConnection yc = oracle.openConnection(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(
           yc.getInputStream())); 
    String inputLine; 
    while ((inputLine = in.readLine()) != null) 
     System.out.println(inputLine); 
    in.close(); 

UPDATE1 尝试在你的代码下一行添加:

Connection.Response res = Jsoup.connect("http://en.wikipedia.org/").execute(); 
String pageContentType = res.contentType(); 
+0

我需要检查contentType有效的方式,但Jsoup没有我所需要的。 – unekwu 2013-02-19 03:01:26

+0

我更新了我的答案。 – 2013-02-19 08:23:03