クローラーは、Web ページからデータを自動的に取得できるプログラムであり、さまざまな有益な情報の収集と分析に役立ちます。この記事では、わずか数ステップで、node.js で簡単なクローラーを作成する方法を説明します。
1.node.jsとnpmをインストールする
node.js は Chrome V8 エンジンに基づく JavaScript ランタイム環境であり、サーバー側で JavaScript コードを実行できるようになります。npm は、node.js のパッケージ マネージャーであり、これを使用すると、さまざまな node.js モジュールを簡単にインストールして管理できます。
node.js と npm をインストールするには、https://nodejs.org/ にアクセスして、node.js の最新バージョンをダウンロードしてインストールします。これには、npm が自動的に含まれます。他の方法を使用してインストールすることもできます。詳細については、https://nodejs.org/en/download/package-manager/ を参照してください。
インストールが完了したら、コマンド ラインに次のコマンドを入力して、インストールが成功したかどうかを確認できます。
bash
node -v
npm -v
対応するバージョン番号が表示されれば、node.js と npm が正常にインストールされています。
2. プロジェクトフォルダーとファイルを作成する
次に、クローラー コードを保持するプロジェクト フォルダーを作成する必要があります。デスクトップにクローラーというフォルダーを作成するなど、フォルダーはどこにでも作成できます。
このフォルダーに、 index.jsというファイルを作成します。このファイルは、クローラーのメイン プログラムです。このファイルを作成するには、VS Code、Sublime Text、Notepad++ などのテキスト エディターを使用できます。
次に、このフォルダーで初期化プロジェクトを実行しnpm init
、プロンプトに従ってプロジェクト関連の情報を入力します (Enter キーを押し続けても構いません)。プロジェクトがビルドされます。
3.リクエストとcheerioモジュールをインストールする
クローラーが HTTP リクエストを送信して HTML ドキュメントを解析できるようにするには、2 つの非常に便利な Node.js モジュール、request と Cheerio を使用する必要があります。
request は、さまざまな HTTP リクエストを簡単に送信し、応答データを取得できるようにするシンプルな HTTP クライアントです。
Cheerio は、HTML 要素を簡単に操作および抽出できる軽量の jQuery 実装です。
これら 2 つのモジュールをインストールするには、コマンド ラインでプロジェクト フォルダーに移動し、次のコマンドを入力する必要があります。
npm install request cheerio --save
これにより、リクエストと Cheerio モジュールがダウンロードされ、プロジェクト フォルダー内の Node_modules フォルダーに保存され、package.json ファイルに記録されます。
4. クローラーコードを書く
これで、クローラー コードの作成を開始できます。まず、index.js ファイルに request モジュールと Cheerio モジュールを導入する必要があります。
const request = require('request');
const cheerio = require('cheerio');
次に、データのクロール元となる Web ページのアドレスであるターゲット URL を定義する必要があります。たとえば、Baidu Encyclopedia の node.js に関するエントリ ページをクロールしたいとします。
const url = 'https://news.baidu.com/';
次に、リクエスト モジュールを使用して、この URL に GET リクエストを送信し、応答データを取得する必要があります。たとえば、Web ページのタイトル、要約、本文のコンテンツを抽出して印刷したいとします。
request(url, function (error, response, body) {
// 如果请求成功且状态码为 200
if (!error && response.statusCode == 200) {
// 使用 cheerio 加载 HTML 文档
const $ = cheerio.load(body);
// 存储获取到的数据
const totalData = []
// 获取hotnews下全部的li元素
$('.hotnews').find('ul').find('li').each(function (index, value){
// 向数组中存放数据
totalData.push({
title: $(value).find('strong').find('a').text(),
href: $(value).find('strong').find('a').attr('href')
})
})
// 打印结果
console.log(totalData)
}
});
どのクラスのコンテンツを取得する必要があります。$ 記号を通じて取得できます。ページの DOM 構造は次のとおりです。
次にデータをjsonファイルに書き込みます
ノードが提供する fs モジュールをインポートします
const fs = require('fs')
data.json ファイルを手動で作成し、そこにデータを保存します
// 创建存储数据的函数,在打印totalData处调用该函数
function writeFs(totalData){
fs.writeFile('./data.json', JSON.stringify(totalData), function (err, data) {
if (err) {
throw err
}
console.log('数据保存成功');
})
}
このコードを実行すると、data.json に保存されたニュースのタイトルとリンクが表示されます。このようにして、node.js を使用して単純なクローラーを作成し、Web ページからデータをフェッチすることに成功しました。
完全なコード
const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs')
const url = 'https://news.baidu.com/';
request(url, function (error, response, body) {
// 如果请求成功且状态码为 200
if (!error && response.statusCode == 200) {
// 使用 cheerio 加载 HTML 文档
const $ = cheerio.load(body);
// 存储获取到的数据
const totalData = []
// 获取hotnews下全部的li元素
$('.hotnews').find('ul').find('li').each(function (index, value){
// 向数组中存放数据
totalData.push({
title: $(value).find('strong').find('a').text(),
href: $(value).find('strong').find('a').attr('href')
})
})
writeFs(totalData)
// 打印结果
console.log(totalData)
}
});
function writeFs(totalData){
fs.writeFile('./data.json', JSON.stringify(totalData), function (err, data) {
if (err) {
throw err
}
console.log('数据保存成功');
})
}
もちろん、これは非常に基本的な例にすぎませんが、実際には、クローラーには、リクエスト ヘッダーの設定、リダイレクトの処理、例外の処理、プロキシの設定、遅延の設定、模擬ログイン、検証コードの処理、解析など、多くの高度なスキルや機能もあります。 JSON 、XML、CSV およびその他の形式、データをデータベースまたはファイルなどに保存します。クローラーについてさらに詳しく知りたい場合は、引き続き私のブログをフォローしてください。
過去のデータ:
1. インターフェースステータスコードの完全な分析: API は何について話しているのか?
2. JS 配列の Reduce メソッドと ReduceAll メソッドを 1 つの記事でマスターする
3. JS 配列メソッド百科事典: 配列操作を簡単にマスターできます。
記事は以上です、読んでいただきありがとうございました!私はまだ勉強中です。間違っている場合は修正してください。この記事が意味があり、利益やインスピレーションをもたらすことができると思われる場合は、いいねを押して集めて励ましてください。また、フォローしてください。役立つことをもっと共有します。 フロント-エンドコンテンツとスキル。私は波、あなたと一緒に成長したいと願っています〜