Web Crawler专门用于下载图像和文件

时间:2013-02-15 12:28:32

标签: java html-parsing jsoup web-crawler

我正在为我的一个班级做作业。

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

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

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

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

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

我需要在循环链接时检查contentType,以有效的方式检查链接是否是文件,但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);

        }**

更新 根据Yoshi的回答,我能够让我的代码正常工作。这是链接:

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

1 个答案:

答案 0 :(得分: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域名或相关链接的链接。使用这种方式获取所有链接并查找其中的所有图像。自己写吧,这不是一种不好的做法。
  4. 你不需要使用URLConnection类,jSoup有它的包装。

    <强> e.g

    您只能使用一行代码来获取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();