ホームページ >ウェブフロントエンド >htmlチュートリアル >Web クローラー system_html/css_WEB-ITnose の設計

Web クローラー system_html/css_WEB-ITnose の設計

WBOY
WBOYオリジナル
2016-06-24 11:16:191088ブラウズ

Web クローラーは、特定のルールに従って World Wide Web から情報を自動的にクロールするプログラムまたはスクリプトです。データ分析を行ったり、コンテンツベースの処理アルゴリズムを学習したりするなど、大量のネットワーク データが必要な場合、クローラー プログラムが Web サイト上のデータをクロールし、ページごとに手動で検索してコピーすることはできません。現時点では、Web ページのデータを自動的にクロールするクローラーを作成する必要があります。このブログでは、Web クローラーの設計について説明します。

数日前、推奨アルゴリズム学習用のデータとして Dianping Web サイトから店舗データを取得する必要がありました。この店舗データを取得するためのクローラーを設計する必要がありました。要件に従って、このクローラは、ランドマークに基づいて店舗を分類する点評ページ上のランドマークの URL を取得し、これらの URL に基づいて店舗のリストをクロールし、リストに基づいて店舗の詳細を取得する必要があります。

一般的な Web クローラー システム アーキテクチャでは、主に次の側面を考慮する必要があります

  • 終了スケジュール: クローラーの開始またはクローラーのステータスの監視に使用されます
  • URL マネージャー: 情報を取得する必要があるリンクの保存と管理に使用されます、Web ページのダウンロード用 サーバーはこの情報を提供します
  • Web ページ ダウンローダー: 分析のために Web ページのソース コードをダウンロードします
  • Web ページ パーサー: ダウンロードされたソース コードを解析し、対応する情報を分析します
  • ログ システム: Web ページパーサーは関連データを取得し、リンクは正常に解析され、ログ システムに保存されます。ログ システムは URL マネージャーと通信して不要な URL を削除します

上記は、クローラーが考慮する必要がある最も単純な部分です。次に、実装の詳細について説明します。私は Dianping クローラーを Java で作成しました。ここでは主に Java 言語を使用します。

  • スケジューリング側 1 つ目はディスパッチ側です。これは、クローラを起動し、クローラを制御するためにさまざまなコマンドをディスパッチ側に送信するために使用されます。たとえば、ストア リストをクロールしたり、ストアの詳細を取得したりするためのクローラの制御はすべて実行されます。発送側を通じて。
  • URL マネージャー URL マネージャーは、クロールする必要がある URL を保存するキューのようなもので、通常、クロールする必要がある URL をメモ帳に保存し、URL マネージャーがテキストを分析して把握できます。クロールする必要がある URL。
  • Web ページ ダウンローダーと Web ページ パーサー

    Java は Web ページのソース コードをローカル ディスクにダウンロードせずに直接リクエストできるため、これら 2 つの部分を組み合わせることができます。 パーサーについて: Jsoup を使用することをお勧めします。 Jsoup は、URL アドレスと HTML テキスト コンテンツを直接解析できる Java HTML パーサーです。 DOM、CSS、および jQuery のような操作メソッドを通じてデータを取得および操作するための、非常に低労力の API を提供します。 Jsoup の主な機能は次のとおりです:

    1. URL、ファイル、または文字列から HTML を解析します。
    2. DOM または CSS セレクターを使用してデータを検索し、
    3. HTML 要素、属性、およびテキストを操作します。例 以下のWebページの店舗名を解析したいです
    ブラウザの開発者ツールを開くと、店舗名のメインタグの下にbasic-infoというIDのタグがあることが解析できます。このタグの中にあるnameタグです。 このタグの内容は店舗名です。もちろん、分析が難しい場所では、フィールドを分析するために正規表現を使用する必要があります。

Jsoup を使用すると、わずか数行のコードで解決できます。

Document doc =        Jsoup.connect(requestUrl).                header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0").get();Element basicBody = doc.getElementById("basic-info");String shopName = basicBody.getElementsByClass("shop-name").get(0).childNode(0).toString().trim();System.out.println(shopName);

ヘッダーを設定する必要があることに注意してください。そうしないと、一部の Web サイトはクローラーへのアクセス要求を 403 で直接拒否します。完全なヘッダー情報はありません。

ログ システム ログ システムと URL マネージャーをメモ帳に保存することもでき、ログ テキストと URL マネージャー テキストの違いを比較することで、どの URL がキャプチャされたか、どの URL がキャプチャされていないかを確認できます。手動クロールに使用できる、無効な URL を保存する別のコードを作成することもできます。

  • 上記は詳細の一部であり、発生する可能性のある問題について説明します。

Web サイト 403 アクセスが拒否されました:
  • 現在、Web サイトは、クローラーが大量にアクセスする場合に、クローラー システムがデータを取得できないように処理されている必要があります。短期間に Web サイトへの接続数が増えると、相手のサーバーがあなたの IP を見つけてブロックします。この時点では、クローラーがアクセスを拒否するまでに 30 分または一定の時間がかかる場合があります。ウェブサイトへのアクセスを再開できます。現時点では、Java の例外処理メカニズムにより、クローラは一定期間休止してから、例外キャプチャを通じて 403 エラーについて学習し、HttpStatusException をキャプチャして他のサーバーによって検出されたかどうかを分析できます。そしてアクセスが拒否されました。これにより、クローラーの作業が一時停止されます。もちろん、IP が多数ある場合は、この例外をキャッチした後にコードを使用してプロキシ IP を変更することもできます。

try{    //连接并解析Html}catch (HttpStatusException e){//异常捕获    if (e.getStatusCode()==403){        try {            logUtil.writeToHttpStatesException(); //日志写入            System.out.println("HttpStatusException! Program will sleep for "+configuration.forbiddenSleepTime/1000/60+"min.");            Thread.sleep(configuration.forbiddenSleepTime); //进程休眠        } catch (InterruptedException e1) {            e1.printStackTrace();        }    }    }

这个时候日志系统的用途就体现出来了,日志系统无形中提升了爬虫的稳定性,在抓取的时候可能会遇到各种异常,Socket超时,Http状态错误,数组越界,空指针等等,如果爬虫因为未知的错误而停止了运行,因为短期开发的过程中不可能想到所有可能出现的错误情况,第二次爬虫重新启动之后可以读取日志,这样就不会因为一个崩溃错误而导致爬虫把抓取过的信息再抓取一遍了。

  • 并发需求 刚在说了,快速的访问会导致403拒绝访问,我抓取大众点评的时候,每抓取一次休息5秒钟才不会被服务器拒绝访问,所以说这样算下来,爬虫的效率是很慢的,一分钟最多十几个店铺,但是如果需要抓取很多店铺,这就需要好几天了。所以说,编写的爬虫系统必须具备横向扩展能力,用更多的机器同时抓取来节省宝贵的时间。比如有10台空闲机器,我们可以将爬虫分别部署在10台机器上进行抓取,这个时候就需要更改URL管理器让其变得更加智能,可以增加URL任务分配相关的代码,比如我有1000个网页需要抓取,有5台电脑,URL管理器应该为第一台电脑分配抓取1-200个URL,第二个机器201-400,以此类推,这样的代码也很好写,小学数学问题就可以解决。
  • 工具类设计 爬虫设计完之后还需要设计一些小工具类来完成一些基本操作,比如文件合并,用来合并多台机器上抓取的信息,条目去重复,用来删掉重复抓取的店铺(可能的话),过滤器:用来过滤不要的店铺之类的。这样的工具类也是必不可少的。

以下是我设计的爬虫系统的结构:

因为我的爬虫需要抓取三种不同的网页,所以我设计了一个CrawlerManager类来管理调度不同类型的爬虫,这个Manager使得整个爬虫系统更加易于维护和调整,并且使得整个程序的逻辑结构更加清楚;

之后就可以开始抓取啦~

以上店铺数据仅为程序测试用,并未作为商业用途使用,如构成侵权,请直接留言,我会删除文章。

我的博客MikeTech app现已登陆iPhone和Android

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。