2 ---爬虫類爬虫類にフレームワークwebmagicを取得

取得爬虫類1 --- Webクローラーの話

2 ---爬虫類爬虫類にフレームワークwebmagicを取得

---本物の爬虫類爬虫類の3を取得

2クローラフレームWebmagic

      2.1アーキテクチャの決意   

        WebMagicは、シンプルで柔軟なJavaフレームワークの爬虫類です。基づきWebMagicは、あなたはすぐにクローラーを維持するために簡単に、高効率を開発することができます。

        構造体は、互いに編成するために四つの成分スパイダーによってWebMagicダウンローダ、PageProcessor、スケジューラ、パイプラインに分割されています。これら四つの成分に相当ダウンロード爬虫類のライフサイクル、処理、管理、および永続性機能。スパイダーは、それらが互いに相互作用することができるように、これらの構成要素を整理するプロセス指向の実装、スパイダーと考えることができるであろう、それはまた、コアWebMagicロジックで、大きい容器です。

      四つの成分

  • Downloaderの    その後の処理のために、インターネットのページからダウンロードする責任のダウンローダ。WebMagic ApacheHttpClientは、デフォルトのダウンロードツールとして使用しました。
  • PageProcessor      PageProcessorページを解析するための責任、ウェルは、新しいリンクを発見するなど、有用な情報を抽出します。分析ツールのXPath Xsoupの発展に基づいて、HTMLの解析ツールとしてJsoupを使用WebMagic。これら四つの成分では、各サイトの各ページのPageProcessor同じではありません、セクションをカスタマイズするユーザーの必要性があります。
  • スケジューラ       スケジューラは、再作業にURL、およびそれらのいくつかをキャプチャするために管理しています。WebMagicデフォルトJDKメモリは、キュー管理URLを提供し、重みのセットで行くことに。Redisのは、分散管理の使用をサポートしています。
  • パイプライン      の計算を含め、結果を取るための責任を負う処理パイプラインは、ファイル、データベースなどに永続化 WebMagicは、「ファイルに保存」二つの結果の治療プログラムを「コンソールへの」デフォルトで提供して。

      2.2 PageProcessor

            2.2.1は、ページの内容全体をクロール

        クローラシステムを構築するために私達と手の下に、ブログの内容にCSDNをクロールhttps://blog.csdn.net/

1 )プロジェクト、依存性の導入を作成します

<dependency>
     <groupId>us.codecraft</groupId> 
     <artifactId>webmagic‐core</artifactId> 
     <version>0.7.3</version> 
</dependency> 
<dependency> 
     <groupId>us.codecraft</groupId> 
     <artifactId>webmagic‐extension</artifactId> 
     <version>0.7.3</version> 
</dependency>

 2 )Webコンテンツをクロールクラス筆記具


/**
 * 爬取类
 */
public class MyProcessor implements PageProcessor {


    public void process(Page page) {
        //打印页面内容
        System.out.println( page.getHtml().toString()  );
    }

    public Site getSite() {
        return Site.me().setSleepTime(100).setRetryTimes(3);
    }

    public static void main(String[] args) {
        Spider.create( new MyProcessor() ).addUrl("https://blog.csdn.net").run();
    }

}

        Spiderは爬虫類開始入り口です。爬虫類を開始する前に、我々は、使用する必要がPageProcessorをスパイダー作成したオブジェクトを、次に使用)(実行を開始します。

       スパイダー一方、他のコンポーネント(ダウンローダスケジューラパイプライン)により5月セットの設定方法に関する。

       ページの代表Downloaderのページへのダウンロードは- かもしれHTML 、それはかもしれJSONのコンテンツまたは他のテキスト形式。ページがあるWebMagicの中核オブジェクト抽出処理、それは結果を保存しように、抽出のための多数の方法を提供します。

       サイトいくつかの構成このような符号化、などのサイト自体を定義する情報、のためのHTTP ヘッダ、タイムアウト、再試行戦略など、および他の薬剤は、サイトによって提供することができるオブジェクトを構成することができます。

            指定されたコンテンツをクロール2.2.2(XPathの)

       私たちは、ページのコンテンツ部分をクロールしたい場合は、XPathを指定する必要がありますあるXPathの、XMLのパス言語(XMLPathLanguage 決定するための方法である)、XMLの文書内の位置の一部に言語。XPathは、選択するために、パス式を使用したXML 文書のノードまたはノードのセットを。これらのパス式と当社従来コンピュータファイルの表現は、システムが非常に似てご覧ください。

       私たちは、XPathを指定するページのコンテンツのグラブ一部に

System.out.println(page.getHtml().xpath("//*[@id=\"nav\"]/div/div/ul/li[5]/a").toString());

      CSSは、遠位靴は、見ることができる学習したIDは:上記のコードの意味があるNAV 下ノードのdiv の下にノードDIV 下ノードUL 次の5 番目のLi ノードの下のノード、出力を見て:

<a href="/nav/ai">人工智能</a>

            2.2.3 宛先アドレスを追加 

      私たちは、より多くのページをクロールするシードのページから、ターゲットアドレスを追加することができます

 public void process(Page page) {
        page.addTargetRequests(page.getHtml().links().regex("https://blog.csdn.net/[a-z 0-9 -]+/article/details/[0-9]{8}").all());//将当前页面里的所有链接都添加到目标页面中
        System.out.println(page.getHtml().xpath("//*[@id=\"nav\"]/div/div/ul/li[5]/a" ).toString() );
    }

     ランニングは、アドレスの多くを見つけた後、コンソールに表示されます  

            2.2.4 ターゲットアドレス定期的な試合

    詳細ページコンテンツのみというブログ記事を抽出し、タイトルを抽出する方法?


/**
 * 爬取类
 */
public class MyProcessor implements PageProcessor {


    public void process(Page page) {

        //page.addTargetRequests( page.getHtml().links().all() );//将当前页面里的所有链接都添加到目标页面中
         page.addTargetRequests(  page.getHtml().links().regex("https://blog.csdn.net/[a-z 0-9 -]+/article/details/[0-9]{8}").all());
         System.out.println(page.getHtml().xpath("//* [@id=\"mainBox\"]/main/div[1]/div[1]/h1/text()").toString());
    }

    public Site getSite() {
        return Site.me().setSleepTime(100).setRetryTimes(3);
    }

    public static void main(String[] args) {
        Spider.create( new MyProcessor() )
                .addUrl("https://blog.csdn.net/")
                .run();
    }

}

      2.3パイプライン  

            2.3.1 ConsolePipelineコンソール出力

/**
 * 爬取类
 */
public class MyProcessor implements PageProcessor {


    public void process(Page page) {
        //打印页面内容
        //System.out.println( page.getHtml().toString()  );
        //page.addTargetRequests( page.getHtml().links().all()  );

        page.addTargetRequests(  page.getHtml().links().regex("https://blog.csdn.net/[a-z 0-9 -]+/article/details/[0-9]{8}").all());
        //System.out.println( page.getHtml().xpath("//*[@id=\"nav\"]/div/div/ul/li[5]/a" ).toString() );
        //System.out.println(page.getHtml().xpath("//*[@id=\"mainBox\"]/main/div[1]/div/div/div[1]/h1"));
        page.putField("title" ,page.getHtml().xpath("//*[@id=\"mainBox\"]/main/div[1]/div/div/div[1]/h1").toString() );
    }

    public Site getSite() {
        return Site.me().setSleepTime(100).setRetryTimes(3);
    }

    public static void main(String[] args) {
        Spider.create( new MyProcessor() )
                .addUrl("https://blog.csdn.net/")
                .addPipeline(new ConsolePipeline())
                .run();
    }

}

            2.3.2 FilePipelineファイルが保存されています  

public static void main(String[] args) {
        Spider.create( new MyProcessor() )
                .addUrl("https://blog.csdn.net/")
                .addPipeline(new ConsolePipeline())
                .addPipeline(new FilePipeline("e:/data"))
                .run();
    }

            2.3.3 JsonFilePipeline

public static void main(String[] args) {
        Spider.create( new MyProcessor() )
                .addUrl("https://blog.csdn.net/")
                .addPipeline(new ConsolePipeline())
                .addPipeline(new FilePipeline("e:/data"))
                .addPipeline(new JsonFilePipeline("e:/json"))
                .run();
    }

            2.3.4カスタムパイプライン

       パイプライン以上の場合は、あなたのニーズを満たすことができない、あなたがカスタマイズすることができますパイプラインを

     (1 )クラスを作成MyPipelineをインターフェイス実装パイプライン


public class MyPipeline implements Pipeline {
    public void process(ResultItems resultItems, Task task) {
        String title = resultItems.get("title");
        System.out.println("定制  title:"+title);

    }
}

    2 )変更のメインメソッドを

public static void main(String[] args) {
        Spider.create( new MyProcessor() )
                .addUrl("https://blog.csdn.net/")
                .addPipeline(new ConsolePipeline())
                .addPipeline(new FilePipeline("e:/data"))
                .addPipeline(new JsonFilePipeline("e:/json"))
                .addPipeline(new MyPipeline())
                .run();
    }

        2.4スケジューラ  

       私達はちょうどこれは何の意味ではなく、それぞれの実行の機能が重複ページをクロールすることができるが完了しました。スケジューラ(URL管理最も基本的な機能はすでにクロール達成することにあるURLをマークすること。これを達成することができるURL 増分重複排除を。

       現在、スケジューラ三つの主要な方法があります。

  1. メモリー・キューQueueScheduler
  2. ファイルキューFileCacheQueueScheduler
  3.  RedisのキューRedisScheduler

            2.4.1メモリキュー

       使用setScheduler セットにスケジューラ

public static void main(String[] args) {
        Spider.create( new MyProcessor() )
                .addUrl("https://blog.csdn.net/")            
                .setScheduler(new QueueScheduler())
                .run();
    }

            2.4.2ファイルキュー

      使用ファイルの保存クロールURL 、あなたがつかむする前から、プログラムを終了し、次回起動時にできるURLをクロール継続します

   (1 )フォルダを作成\スケジューラ:Dを

   2 )コードを変更

public static void main(String[] args) {
        Spider.create( new MyProcessor() )
                .addUrl("https://blog.csdn.net")
                //.setScheduler(new QueueScheduler())//设置内存队列 
                .setScheduler(new FileCacheQueueScheduler("D:\\scheduler"))//设置文件队列
                .run();
    }

     フォルダDを実行した後:\スケジューラーは、2つのファイルが生成されますblog.csdn.net.urls.txt とblog.csdn.net.cursor.txt

            2.4.3 Redisのキュー

     使用Redisのは、いわゆるであるクロール、作業中に複数のマシンを、クロールキューを保存することができ、分散クロールを

  (1 )実行中のRedisのサーバーを

  (2 )コードを変更

public static void main(String[] args) {
        Spider.create( new MyProcessor() )
                .addUrl("https://blog.csdn.net")
                //.setScheduler(new QueueScheduler())//设置内存队列 
                //.setScheduler(new FileCacheQueueScheduler("D:\\scheduler"))//设置文件队列
                .setScheduler(new RedisScheduler("127.0.0.1"))//设置Redis队列
                .run();
    }

 

 

公開された41元の記事 ウォン称賛47 ビュー30000 +

おすすめ

転載: blog.csdn.net/u014526891/article/details/102690606