ぽっぺんしゃんにょろりんこ

匿名・非追跡型アダルト動画検索エンジンの設計ノート

Node.jsで不要ページを事前にフィルタリングし、クロール高速化&帯域削減するというお話

※全体のクローリング処理では Puppeteer を使用していますが、この記事で紹介するフィルタリング処理は Node.js 単体で完結しています。

こんにちは、にょろりんこです。

今回は、クローリング処理を高速化&軽量化するために導入している、「事前URLフィルタリング」の仕組みについて紹介します。

髪を触るティアラ

私が開発・運用しているポルノ動画検索エンジン「SaePorns」では、Node.js + Puppeteer を用いて、動画ページのメタデータを自動抽出しています。

しかし、すべてのURLを律儀に開いていたのでは時間も帯域もいくらあっても足りません。

とくに以下のようなページは、解析の対象にならないにも関わらず、HTML取得だけでリソースを消費してしまうため、無駄が多いのです。


例えば、こんなURLはスキップ対象

 

会員登録ページ、プロフィール一覧、カテゴリページ、検索結果画面、ヘルプやインフォメーションページ、これらは動画本体ではないため、インデクシングにも不要ですし、メタデータ収集対象からも除外したいURL群です。

対象外URLを弾くロジック(実装)

以下は実際のコードで、1件ごとの解析処理関数 `analyzeUrl()` の冒頭で、次のように記述しています:

※現バージョンでは analyzeUrl() 内で直接フィルタしていますが、将来的にはこのスキップ対象リストを JSON または DB に切り出し、外部管理する予定です。そうすることで、コードに手を入れずに柔軟な除外パターンの管理が可能になります。

## ✅ スキップ処理は analyzeUrl の冒頭に書く

async function analyzeUrl({ page, browser, pool, id, url }) {
  console.log(`🔍 ID=${id} を解析: ${url}`);

  if (
    url.includes('/signup?redirect=')  ||
    url.includes('/login?redirect=')   ||
    url.includes('/album/')            ||
    url.includes('/users/')            ||
    url.includes('/channels/')         ||
    url.includes('/model/')            ||
    url.includes('/categories/')       ||
    url.includes('/download/')         ||
    url.includes('/search/')           ||
    url.includes('/information/')
  ) {
    console.log('スキップ対象URLのためスキップします。');
    await incrementAnalyzed(pool, id);
    return;
  }
}

補足:全体構成とanalyzeUrl()関数とは?

analyzeUrl() は、1件のURLを解析する中心的な関数です。
内部では以下のような流れで、URLの中身を順番にチェック・抽出していきます:

URLを受け取る
 ↓
不要なURLはスキップ
 ↓
ページ遷移(page.goto)
 ↓
noindexタグを検出 → スキップ
 ↓
動画ページかどうか判定 → スキップ
 ↓
各種メタデータを抽出
 ↓
DBに保存して、analyzed=1に更新

このブロックによって、Puppeteer の page.goto() を行う前に、明らかに不要なページを弾いています。

この処理の何が良いのか?

  • プロキシ帯域を節約できる:DB上の処理だけで完結するので、有料回線の負荷も軽減
  • DB上もクリーンに管理できる:analyzed=1 にして処理済み扱いにできる
  • 圧倒的に速い:ページ遷移しないので1件あたり数msで処理完了

結果として、1万件以上のURLから対象動画ページだけを抽出する処理において、全体クロール時間を大幅に短縮できるようになりました。

このように、「見る必要のないページは最初から見ない」というだけで、クローリング処理は劇的に軽くなります。

とくに、プロキシを利用中で帯域制限を気にしなくてはならない時など、コストのかかる資源を使っている場合は、こうした「事前フィルタリング」が、全体パフォーマンスと運用コストの両面に効いてきます。

小さな工夫ですが、運用する側からすると、効果はバカになりません。

だからこそ、「開かなくていいページを開かない」という判断を、最初に済ませてしまうという設計が、地味ながらも実は一番インパクトのある最適化だったりします。

Sae-Pornsは、地味な最適化の積み重ねで成り立っています。このコードが実際に動いている追跡されないアダルト動画の検索エンジン「Sae‐Porns」はこらから!よかったら見ていってください。

※18歳未満の方はご利用できません。

sae-porns.org