Skip to main content
 首页 » 编程设计

java之专门用于下载图像和文件的网络爬虫

2023年09月14日399thcjp

我正在为我的一门课做作业。

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

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

在处理 url 之前,我使用了默认的 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

请您参考如下方法:

使用jSoup我认为此 API 足以满足您的需求。你也可以在这个网站上找到好的食谱。

几个步骤:

  1. Jsoup: how to get an image's absolute url?
  2. how to download image from any web page in java
  3. 您可以编写自己的递归方法,遍历包含必要域名或相关链接的页面上的链接。使用这种方式抓取所有链接并找到其上的所有图像。自己写,这不是坏习惯。

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

例如

只需一行代码即可获取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(); 

更新1 尝试在您的代码中添加下一行:

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