ホームページ >ウェブフロントエンド >htmlチュートリアル >Web クローラー system_html/css_WEB-ITnose の設計
Web クローラーは、特定のルールに従って World Wide Web から情報を自動的にクロールするプログラムまたはスクリプトです。データ分析を行ったり、コンテンツベースの処理アルゴリズムを学習したりするなど、大量のネットワーク データが必要な場合、クローラー プログラムが Web サイト上のデータをクロールし、ページごとに手動で検索してコピーすることはできません。現時点では、Web ページのデータを自動的にクロールするクローラーを作成する必要があります。このブログでは、Web クローラーの設計について説明します。
数日前、推奨アルゴリズム学習用のデータとして Dianping Web サイトから店舗データを取得する必要がありました。この店舗データを取得するためのクローラーを設計する必要がありました。要件に従って、このクローラは、ランドマークに基づいて店舗を分類する点評ページ上のランドマークの URL を取得し、これらの URL に基づいて店舗のリストをクロールし、リストに基づいて店舗の詳細を取得する必要があります。
一般的な Web クローラー システム アーキテクチャでは、主に次の側面を考慮する必要があります
上記は、クローラーが考慮する必要がある最も単純な部分です。次に、実装の詳細について説明します。私は Dianping クローラーを Java で作成しました。ここでは主に Java 言語を使用します。
Java は Web ページのソース コードをローカル ディスクにダウンロードせずに直接リクエストできるため、これら 2 つの部分を組み合わせることができます。 パーサーについて: Jsoup を使用することをお勧めします。 Jsoup は、URL アドレスと HTML テキスト コンテンツを直接解析できる Java HTML パーサーです。 DOM、CSS、および jQuery のような操作メソッドを通じてデータを取得および操作するための、非常に低労力の API を提供します。 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 アクセスが拒否されました:
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状态错误,数组越界,空指针等等,如果爬虫因为未知的错误而停止了运行,因为短期开发的过程中不可能想到所有可能出现的错误情况,第二次爬虫重新启动之后可以读取日志,这样就不会因为一个崩溃错误而导致爬虫把抓取过的信息再抓取一遍了。
以下是我设计的爬虫系统的结构:
因为我的爬虫需要抓取三种不同的网页,所以我设计了一个CrawlerManager类来管理调度不同类型的爬虫,这个Manager使得整个爬虫系统更加易于维护和调整,并且使得整个程序的逻辑结构更加清楚;
之后就可以开始抓取啦~