ブラウザのトラフィック使用量を最適化する方法は?

Senior Web Scraping Engineer
概要
Puppeteerを使用してデータスクレイピングを行う際、トラフィック消費は重要な考慮事項です。 特にプロキシサービスを使用する場合、トラフィックコストが大幅に増加する可能性があります。 トラフィックの使用を最適化するために、以下の戦略を採用できます。
- リソースのインターセプション: 不要なリソースリクエストをインターセプトすることでトラフィック消費を削減します。
- リクエストURLのインターセプション: URLの特性に基づいて特定のリクエストをインターセプトすることでトラフィックをさらに削減します。
- モバイルデバイスのシミュレーション: モバイルデバイスの設定を利用して、軽量版のページを取得します。
- 包括的最適化: 上記の方法を組み合わせて最良の結果を達成します。
最適化方案1: リソースのインターセプション
リソースインターセプションの紹介
Puppeteerでは、page.setRequestInterception(true)
を使用することで、ブラウザによって開始されたすべてのネットワークリクエストをキャプチャし、続行する(request.continue()
)、終了させる(request.abort()
)、またはレスポンスをカスタマイズする(request.respond()
)ことができます。
この方法は、特にクロール、スクリーンショット、およびパフォーマンス最適化シナリオに適しており、帯域幅消費を大幅に削減できます。
インターセプト可能なリソースタイプと提案
リソースタイプ | 説明 | 例 | インターセプト後の影響 | 推奨 |
---|---|---|---|---|
image |
画像リソース | JPG/PNG/GIF/WebP画像 | 画像が表示されなくなります | ⭐ 安全 |
font |
フォントファイル | TTF/WOFF/WOFF2フォント | システムデフォルトフォントが使用されます | ⭐ 安全 |
media |
メディアファイル | ビデオ/音声ファイル | メディアコンテンツが再生できなくなります | ⭐ 安全 |
manifest |
ウェブアプリマニフェスト | PWA設定ファイル | PWA機能に影響が出る可能性があります | ⭐ 安全 |
prefetch |
プリフェッチリソース | <link rel="prefetch"> |
ページへの影響は最小限 | ⭐ 安全 |
stylesheet |
CSSスタイルシート | 外部CSSファイル | ページスタイルが失われ、レイアウトに影響があります | ⚠️ 注意 |
websocket |
ウェブソケット | リアルタイム通信接続 | リアルタイム機能が無効になります | ⚠️ 注意 |
eventsource |
サーバ送信イベント | サーバプッシュデータ | プッシュ機能が無効になります | ⚠️ 注意 |
preflight |
CORSプレフライトリクエスト | OPTIONSリクエスト | クロスオリジンリクエストが失敗します | ⚠️ 注意 |
script |
JavaScriptスクリプト | 外部JSファイル | 動的機能が無効になり、SPAがレンダリングされない可能性があります | ❌ 回避 |
xhr |
XHRリクエスト | AJAXデータリクエスト | 動的データを取得できなくなります | ❌ 回避 |
fetch |
フェッチリクエスト | モダンAJAXリクエスト | 動的データを取得できなくなります | ❌ 回避 |
document |
メインドキュメント | HTMLページ自体 | ページが読み込まれません | ❌ 回避 |
推奨レベルの説明:
- ⭐ 安全: インターセプションはデータスクレイピングやファーストスクリーンレンダリングにほとんど影響がなく、デフォルトでブロックすることが推奨されます。
- ⚠️ 注意: スタイル、リアルタイム機能、またはクロスオリジンリクエストが破損する可能性があり、ビジネスの判断が必要です。
- ❌ 回避: SPA/dynamicサイトが正常にレンダリングまたはデータを取得できなくなる可能性が高く、これらのリソースが絶対に必要ないと確信していない限り回避するべきです。
リソースインターセプションの例コード
javascript
import puppeteer from 'puppeteer-core';
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
async function scrapeWithResourceBlocking(url) {
const browser = await puppeteer.connect({
browserWSEndpoint: scrapelessUrl,
defaultViewport: null
});
const page = await browser.newPage();
// リクエストインターセプションを有効にする
await page.setRequestInterception(true);
// ブロックするリソースタイプを定義
const BLOCKED_TYPES = new Set([
'image',
'font',
'media',
'stylesheet',
]);
// リクエストをインターセプト
page.on('request', (request) => {
if (BLOCKED_TYPES.has(request.resourceType())) {
request.abort();
console.log(`ブロックしました: ${request.resourceType()} - ${request.url().substring(0, 50)}...`);
} else {
request.continue();
}
});
await page.goto(url, {waitUntil: 'domcontentloaded'});
// データを抽出
const data = await page.evaluate(() => {
return {
title: document.title,
content: document.body.innerText.substring(0, 1000)
};
});
await browser.close();
return data;
}
// 使用方法
scrapeWithResourceBlocking('https://www.scrapeless.com');
ja
.then(data => console.log('スクレイピング結果:', data))
.catch(error => console.error('スクレイピングに失敗しました:', error));
最適化スキーム 2: リクエストURLのインターセプト
リソースタイプによるインターセプトに加えて、URLの特性に基づいたより細かなインターセプト制御も可能です。これは特に広告、分析スクリプト、その他の不必要なサードパーティのリクエストをブロックするのに効果的です。
URLインターセプト戦略
- ドメインによるインターセプト: 特定のドメインからのすべてのリクエストをブロック
- パスによるインターセプト: 特定のパスからのリクエストをブロック
- ファイルタイプによるインターセプト: 特定の拡張子を持つファイルをブロック
- キーワードによるインターセプト: 特定のキーワードを含むURLのリクエストをブロック
一般的にインターセプト可能なURLパターン
URLパターン | 説明 | 例 | 推奨 |
---|---|---|---|
広告サービス | 広告ネットワークドメイン | ad.doubleclick.net , googleadservices.com |
⭐ 安全 |
アナリティクスサービス | 統計とアナリティクススクリプト | google-analytics.com , hotjar.com |
⭐ 安全 |
ソーシャルメディアプラグイン | ソーシャルシェアボタンなど | platform.twitter.com , connect.facebook.net |
⭐ 安全 |
トラッキングピクセル | ユーザー行動を追跡するピクセル | pixel , beacon , tracker を含むURL |
⭐ 安全 |
大きなメディアファイル | 大きな動画、音声ファイル | .mp4 , .webm , .mp3 のような拡張子 |
⭐ 安全 |
フォントサービス | オンラインフォントサービス | fonts.googleapis.com , use.typekit.net |
⭐ 安全 |
CDNリソース | 静的リソースCDN | cdn.jsdelivr.net , unpkg.com |
⚠️ 注意 |
URLインターセプト例コード
javascript
import puppeteer from 'puppeteer-core';
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
async function scrapeWithUrlBlocking(url) {
const browser = await puppeteer.connect({
browserWSEndpoint: scrapelessUrl,
defaultViewport: null
});
const page = await browser.newPage();
// リクエストのインターセプトを有効化
await page.setRequestInterception(true);
// ブロックするドメインとURLパターンを定義
const BLOCKED_DOMAINS = [
'google-analytics.com',
'googletagmanager.com',
'doubleclick.net',
'facebook.net',
'twitter.com',
'linkedin.com',
'adservice.google.com',
];
const BLOCKED_PATHS = [
'/ads/',
'/analytics/',
'/pixel/',
'/tracking/',
'/stats/',
];
// リクエストをインターセプト
page.on('request', (request) => {
const url = request.url();
// ドメインをチェック
if (BLOCKED_DOMAINS.some(domain => url.includes(domain))) {
request.abort();
console.log(`ブロックしたドメイン: ${url.substring(0, 50)}...`);
return;
}
// パスをチェック
if (BLOCKED_PATHS.some(path => url.includes(path))) {
request.abort();
console.log(`ブロックしたパス: ${url.substring(0, 50)}...`);
return;
}
// 他のリクエストを許可
request.continue();
});
await page.goto(url, {waitUntil: 'domcontentloaded'});
// データを抽出
const data = await page.evaluate(() => {
return {
title: document.title,
content: document.body.innerText.substring(0, 1000)
};
});
await browser.close();
return data;
}
// 使用方法
scrapeWithUrlBlocking('https://www.scrapeless.com')
.then(data => console.log('スクレイピング結果:', data))
.catch(error => console.error('スクレイピングに失敗しました:', error));
最適化スキーム 3: モバイルデバイスのシミュレーション
モバイルデバイスをシミュレートすることは、トラフィック最適化戦略の一つであり、モバイルウェブサイトは通常、より軽量なページコンテンツを提供します。
モバイルデバイスシミュレーションの利点
- 軽量なページバージョン: 多くのウェブサイトはモバイルデバイス向けに簡潔なコンテンツを提供
- 小さい画像リソース: モバイル版は通常、小さい画像を読み込み
- 簡略化されたCSSとJavaScript: モバイル版は通常、簡略化されたスタイルとスクリプトを使用
- 広告や非コアコンテンツの削減: モバイル版はしばしば非コアの機能を削除
- 適応的なレスポンス: 小さい画面に最適化されたコンテンツレイアウトを取得
モバイルデバイスシミュレーション設定
以下は、いくつかの一般的に使用されるモバイルデバイスの設定パラメータです。
javascript
const iPhoneX = {
viewport: {
width: 375,
height: 812,
deviceScaleFactor: 3,
isMobile: true,
hasTouch: true,
isLandscape: false
}
};
または、puppeteerの組み込みメソッドを直接使用してモバイルデバイスをシミュレートすることもできます。
javascript
import { KnownDevices } from 'puppeteer-core';
const iPhone = KnownDevices['iPhone 15 Pro'];
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.emulate(iPhone);
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
async function optimizedScraping(url) {
console.log(最適化されたスクレイピングを開始しています: ${url}
);
// トラフィック使用量を記録
let totalBytesUsed = 0;
const browser = await puppeteer.connect({
browserWSEndpoint: scrapelessUrl,
defaultViewport: null
});
const page = await browser.newPage();
// リクエストのインターセプトを設定
await page.setRequestInterception(true);
// リクエストをインターセプト
page.on('request', (request) => {
request.continue();
});
// ネットワークトラフィックを監視
page.on('response', async (response) => {
const headers = response.headers();
const contentLength = headers['content-length'] ? parseInt(headers['content-length'], 10) : 0;
totalBytesUsed += contentLength;
});
await page.goto(url, {waitUntil: 'domcontentloaded'});
// レイジーロードコンテンツをトリガーするためにスクロールをシミュレート
await page.evaluate(() => {
window.scrollBy(0, window.innerHeight);
});
await new Promise(resolve => setTimeout(resolve, 1000))
// データを抽出
const data = await page.evaluate(() => {
return {
title: document.title,
content: document.body.innerText.substring(0, 1000),
links: Array.from(document.querySelectorAll('a')).slice(0, 10).map(a => ({
text: a.innerText,
href: a.href
}))
};
});
// トラフィック使用統計を出力
console.log(\nトラフィック使用統計:
);
console.log(使用量: ${(totalBytesUsed / 1024 / 1024).toFixed(2)} MB
);
await browser.close();
return data;
}
// 使用方法
optimizedScraping('https://www.scrapeless.com')
.then(data => console.log('スクレイピング完了:', data))
.catch(error => console.error('スクレイピング失敗:', error));
最適化されていないコードを実行した後、印刷された情報からトラフィックの違いを非常に直感的に見ることができます:
| シナリオ | 使用されたトラフィック (MB) | 削減率 |
|---------|:---------------:|:------------:|
| 最適化されていない | 6.03 | — |
| **最適化された** | **0.81** | **≈ 86.6 %** |
上記の最適化手法を組み合わせることで、プロキシトラフィックの消費を大幅に削減し、スクレイピングの効率を向上させ、必要なコアコンテンツを確実に取得できるようになります。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。