2

私は自分のクラスの1つに割り当てを行っています。

指定されたクロール深度を指定して、Webサイトからファイルと画像をダウンロードするWebクローラーを作成することになっています。

サードパーティの解析APIの使用が許可されているため、Jsoupを使用しています。htmlparserも試しました。どちらも素晴らしいソフトウェアですが、完璧ではありません。

デフォルトのJavaURLConnectionを使用して、URLを処理する前にコンテンツタイプを確認しましたが、リンクの数が増えると非常に遅くなります。

質問:画像とリンクに特化したパーサー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);

        }**

更新 ヨッシーの答えに基づいて、私は自分のコードを正しく動作させることができました。リンクは次のとおりです。

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

4

1 に答える 1

5

jSoupを使用してください。この API は目的には十分だと思います。また、このサイトで優れたクックブックを見つけることができます。

いくつかの手順:

  1. Jsoup: 画像の絶対 URL を取得するには?
  2. Javaで任意のWebページから画像をダウンロードする方法
  3. 必要なドメイン名または相対リンクを含むページ上のリンクをたどる独自の再帰メソッドを作成できます。この方法を使用して、すべてのリンクを取得し、その上のすべての画像を見つけます。自分で書くのは悪い習慣ではありません。

URLConnection クラスを使用する必要はありません。jSoup にはラッパーがあります。

例えば

DOM オブジェクトを取得するには、1 行のコードのみを使用できます。

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();
于 2013-02-15T12:45:13.653 に答える