こんにちは、今日はRuby、Python、JavaではなくNode.jsを使用してWebクローラーを作成する方法について紹介します。特に、Google ChromeまたはChromiumを制御できる強力なNode.jsライブラリであるPuppeteerとその拡張機能であるPuppeteer-Extraについて詳しく見ていきます。
Puppeteerとは何ですか?
Puppeteerは、Webページのクローリングやユーザーと同じようにウェブサイトと対話することを可能にするNode.jsライブラリです。Puppeteerは基本的にヘッドレスモードで動作し、GUIなしでバックグラウンドで作業を行いますが、必要に応じてフルブラウザUIを持つヘッドフルモードにも設定できます。
Puppeteerを使用する理由は何ですか?
1. Chromeに最適化されたパフォーマンス
PuppeteerはChrome DevTools Protocolを使用してChromeブラウザと直接通信します。これにより、他の自動化ツールであるSeleniumなどが提供するWebDriver APIを使用するよりも、より高速で正確な制御が可能になります。
2. 動的Webコンテンツの処理に強力
静的ページだけでなく、JavaScriptで動的に生成されるコンテンツを処理する際、Puppeteerは優れたパフォーマンスを発揮します。これは現代のWebの複雑な相互作用や動的要素を効果的に処理できることを意味します。
3. ブロッキングの回避
実際のクローリング作業では、Puppeteerはブロッキングを回避し、データ収集に効果的です。特にPuppeteer-ExtraとStealth Pluginを使用すると、自動化検出メカニズムをバイパスしてより安定してデータを収集できます。
Puppeteer-ExtraとStealth Plugin
Puppeteer-Extra
Puppeteer-Extraは基本のPuppeteerライブラリの上に構築された拡張機能であり、柔軟なプラグインシステムを介してユーザーが必要に応じて追加機能を簡単に統合できます。これにより機能が向上し、クローラーの使いやすさが向上します。
Stealth Plugin
Puppeteer-Extraのプラグインの1つであるStealth Pluginは、クローリング時によく発生する自動化検出を効果的に回避します。多くのウェブサイトはクローラーをブロックしますが、このプラグインを使用すると、自動化されたクローラーであってもユーザーのブラウザのように見せることができます。
実際の使用例
さて、Puppeteer-ExtraとStealth Pluginを使用して簡単なクローリング作業を行う方法を見ていきましょう。
1. 必要なモジュールのインストール
puppeteer-extraとpuppeteer-extra-plugin-stealthモジュールをインストールするために、以下のコマンドを入力してインストールします。
npm install puppeteer-extra puppeteer-extra-plugin-stealth
2. 必要なモジュールの読み込み
import puppeteer from "puppeteer-extra";
import StealthPlugin from "puppeteer-extra-plugin-stealth";
import fs from "fs";
3. コマンドにURLを入力するかどうかの例外処理
後で node node_js.mjs https://www.example.com このようなコマンドを使用して直接URLを入力するため、URLがない場合は例外をスローするコードを追加しました。
const args = process.argv.slice(2); // 첫 번째 요소는 Node.js 실행 경로이므로 제외
if (args.length < 1) {
console.error("URL 파라미터가 필요합니다.");
process.exit(1); // 오류로 종료
}
4. stealthpluginを適用する
puppeteer.use(StealthPlugin());
5. ブラウザの対話を適用する
puppeteer.launch({ headless: false }).then(async browser => {
// 해당 headless는 하지 않고 눈에 보이게 브라우저를 띄워줍니다.
const url = args[0]; // 첫 번째 파라미터로부터 URL 가져오기
const page = await browser.newPage(); // 새 브라우저 열기
await page.goto(url); // url로 페이지 이동
await page.waitForTimeout(5000); // 렌더링 완료를 위해 5초 대기
const currentUrl = await page.url(); // url을 변수에 저장
console.log("현재 페이지의 URL:", currentUrl); // url이 제대로 담겼는지 출력
// 페이지의 HTML을 변수에 저장
const html = await page.content();
// HTML 내용을 파일로 저장합니다
fs.writeFile("pageContent.html", html, (err) => {
if (err) {
console.error("파일 저장 중 오류 발생:", err);
} else {
console.log("HTML이 성공적으로 저장됨: pageContent.html");
}
});
});
6. コマンドを実行
入力形式で受け取るためにmjsファイルとして作成しました。
node [파일명].mjs https://www.naver.com
URLが直接開かれ、ターミナルに出力が表示されます。
7. HTMLファイルの確認
上記の手順を経て、pageContent.html が保存されたことを確認できます。
結論
このスクリプトは、ユーザーが指定したURLに移動し、ページのHTMLを取得してpageContent.htmlファイルに保存します。Puppeteer-ExtraとStealth Pluginを使用すると、ウェブサイトの自動化検出ロジックを効果的にバイパスできます。
この記事がNode.jsを使用してクローラーを作成する方法を理解するのに役立つことを願います。Puppeteerとその拡張機能を活用すると、より強力で効果的なWebクローリングソリューションを実装できます。




