コンテンツにスキップ

アルゴリア検索をスクレイピングする方法

これは「アルゴリア検索をスクレイピングする方法」に関する 2000 ワード以上のブログ投稿です。

概要

Algolia は、インターネット上の多くの Web サイトの検索機能を強化する人気の検索 API です。これにより、Web サイトは複雑な検索インフラストラクチャ自体を実行する必要がなく、高速で関連性の高い検索を実装できるようになります。

Algolia を使用する人気のある Web サイトの例としては、次のようなものがあります。

  • Reddit
  • M
  • GitHubの
  • StackOverflowの
  • ハッカーニュース

この投稿の目的は、次のことを説明することです。

  1. Algolia とは何か、そしてその仕組み
  2. Python を使用して Algolia 検索結果をスクレイピングする方法
  3. Algolia を大規模に効率的にスクレイピングするテクニック
  4. Algolia のスクレイピング中にブロックされないようにする方法

最後には、Web サイト向けにスケーラブルな Algolia Web スクレイパーを構築する方法を理解できるようになります。

アルゴリアとは何ですか?

Algolia は、インデックス作成、検索、推奨などのサービスを提供するホスト型検索 API です。これは、Service-as-a-Service (SaaS) プロバイダーと呼ばれることがよくあります。

Algolia の主な価値提案には次のものがあります。

  • 高速検索 – Algolia は、100 ミリ秒未満で数十億のレコードを検索できると主張しています。これは、独自のインフラストラクチャで検索を行うよりも桁違いに高速です。

  • 関連検索 – Algolia は、タイプミスの許容度、同義語、ユーザーの行動に基づいた学習などを処理して、最も関連性の高い結果を返します。

  • ホスト型サービス – Algolia は、スケーリングや冗長性などを処理します。あなたが管理できるインフラストラクチャはありません。

  • APIアクセス – 検索機能には API 経由でアクセスできるため、Web サイトやモバイル アプリなどに簡単に統合できます。

Algolia は、API 通信を処理するほとんどの主要言語とフレームワーク用のクライアント ライブラリを提供します。フロントエンドでは、開発者は JavaScript コードを追加して、Algolia の API とインターフェースします。

要約すると、Algolia は API 経由でホストされたスケーラブルな検索を提供します。これにより、Web サイトは複雑なシステム自体を構築することなく、優れた検索を迅速に構築できるようになります。

Python を使用したアルゴリズム検索のスクレイピング

Algolia とは何かを理解したところで、Python を使用して Algolia の検索結果をスクレイピングする方法を見てみましょう。

API は公開され文書化されているため、アルゴリズムのスクレイピングは簡単です。必要なことは次のとおりです。

  1. API エンドポイントとパラメータを特定する
  2. アクセスキーを抽出します
  3. 検索リクエストを送信し、JSON レスポンスを解析します

Algolia を利用した Web サイトをスクレイピングする完全な例を見てみましょう。

API エンドポイントの検索

まず、Web サイトが検索に使用する API エンドポイントを見つける必要があります。最も簡単な方法は、ブラウザでサイトを開いて検索クエリを実行し、開発者ツールでネットワーク リクエストを確認することです。

たとえば、 ハッカーニュース 次のようなリクエストが行われていることがわかります。

https://hn.algolia.com/api/v1/search?query=python

  /api/v1/search パスにより、これが Algolia 検索 API であることがわかります。検索語も表示されます python クエリパラメータとして渡されます。

応答を確認すると、結果を含む JSON が返されることがわかります。これで、使用する API エンドポイントと検索パラメーターがわかりました。

API キーの取得

次に、認証に必要な API キーを取得する必要があります。ネットワークリクエストを再度確認すると、それが X-Algolia-API-Key ヘッダ。

この API キーを抽出してリクエストに追加できます。キーが JavaScript で難読化されている場合は、追加のリバース エンジニアリングが必要になる場合があります。

検索リクエストを行う

エンドポイントと API キーを使用して、Python で検索リクエストを行うことができるようになりました。

import requests 

api_key = "abc123" # Extracted key 

search_url = "https://hn.algolia.com/api/v1/search"

params = {
  ‘query‘: ‘python‘,
  ‘hitsPerPage‘: 100, 
  ‘attributesToSnippet‘: [‘title:10‘]
}

headers = {
  "X-Algolia-API-Key": api_key
}

response = requests.get(search_url, params=params, headers=headers)
data = response.json()

print(data[‘hits‘])

API エンドポイントに GET リクエストを送信し、検索用語、ページごとのヒット数、および API キー ヘッダーを渡します。結果には、必要に応じて解析して処理できる JSON としての検索ヒットが含まれます。

これで、基本的な Algolia スクレーパーが完成しました。

追加ページのスクレイピング

1 つの制限は、API が結果の最初のページのみを返すことです。追加のページを取得するには、 page 0から増加するパラメータ:

# First page
params[‘page‘] = 0 

# Second page
params[‘page‘] = 1 

# Third page
params[‘page‘] = 2

すべてのページをスクレイピングするには、結果が返されなくなるまでリクエストをループしてページ番号を増加させます。

これをまとめると次のようになります。

from typing import Iterator

def scrape_search(search_term: str) -> Iterator[dict]:

  params = {
    ‘query‘: search_term,
    ‘hitsPerPage‘: 100,
  }

  page = 0
  while True:
    params[‘page‘] = page
    resp = requests.get(search_url, params=params, headers=headers)
    data = resp.json()

    if not data[‘hits‘]:
      break

    yield from data[‘hits‘]

    page += 1

これはページ間で反復され、すべての結果が得られます。

すべての結果を収集するには:

results = []

for result in scrape_search("python"):
  results.append(result)

print(len(results))

そして、すべての Algolia 検索結果を収集するための完全なページネーターが完成しました。

大規模なアルゴリアのスクレイピング

上記の基本的なスクレイパーは機能しますが、大規模なスクレイピングには最適化されていません。発生する可能性のある問題:

  • 遅く – 同期リクエストにより、数百ページのスクレイピングが遅くなります。
  • 壊れやすい – 1 回失敗すると、スクレイピング プロセス全体が中断されます。
  • 禁止された – 1 つの IP からスクレイピングするとブロックされる危険があります。

堅牢な大規模スクレイピングのためにこれらの問題に対処する方法を見てみましょう。

非同期リクエスト

スクレイピングを高速化するために、非同期リクエストを活用できます。これにより、多くのリクエストを同時に実行できるようになります。

たとえば、 asyncio モジュール:

import asyncio

async def fetch_page(page):
  params[‘page‘] = page
  resp = await asyncio.to_thread(requests.get, search_url, params=params) 
  return resp.json()

async def async_scrape():
  page = 0 
  while True:
    tasks = [asyncio.create_task(fetch_page(page + i)) for i in range(10)]
    results = await asyncio.gather(*tasks)

    for data in results:
      if not data[‘hits‘]:
        return

      for hit in data[‘hits‘]:
        yield hit

    page += 10

pages = async_scrape()  

これにより、反復ごとに 10 ページが同時にフェッチされます。非同期リクエストでは、スクレイパーは桁違いに高速です。

再試行とフォールト トレランス

ネットワーク リクエストは断続的に障害が発生する傾向があります。エラーを適切に処理するために再試行を追加できます。

from time import sleep

async def fetch_page(page):

  for retry in range(3):

    try:
      return await asyncio.to_thread(requests.get, search_url, params=params) 
    except Exception as e:
      print(f"Error: {e}, retrying")
      sleep(1)

  print(f"Failed to fetch page {page} after {retries} retries")
  return {‘hits‘: []} # Return empty result

これにより、失敗した場合は単純に最大 3 回再試行されます。指数関数的バックオフなどの他の改善も追加できる可能性があります。

さらに回復力を高めるために、スクレイピング ループ全体を try/excel でラップし、予期しないクラッシュが発生した場合は再試行できます。

複数のレベルでの再試行により、スクレイパーはさまざまな障害から回復し、実行を続けることができます。

回転プロキシ

単一の IP から大量にスクレイピングすると、ブロックされる危険があります。これを防ぐために、次のようなモジュールを使用して、さまざまなプロキシ経由でリクエストをルーティングできます。 requests-proxy-killer:

from proxy_killer import KillerScraper

scraper = KillerScraper(use_cache=False, max_retries=3)

async def fetch_page(page):

  for retry in range(3): 
    try:
      proxy = scraper.get_proxy() # Rotate proxy
      resp = scraper.get(search_url, proxies=proxy, params=params)
      return resp.json()
    except Exception as e:
      print(f"Error: {e}, retrying")
      sleep(1)

# Remainder same as above

各リクエストを異なるプロキシ IP 経由でルーティングすることで、ブロックを気にせずに大規模にスクレイピングできます。

上記の手順により、堅牢で高性能、大規模な Algolia スクレーパーを Python で構築できます。同じ原則がどの言語にも当てはまります。

Algolia をスクレイピングする際のブロックの回避

対処すべき最後の問題は、Algolia サービス自体からのブロックを回避することです。積極的なリクエストが多すぎると、Algolia が IP をブロックしたり、リクエストをスロットルしたりする可能性があります。

丁寧にスクレイピングしてブロックを最小限に抑えるためのヒントをいくつか紹介します。

  • リミットレート: 数百もの同時リクエストで API を過負荷にしないでください。小さく始めて徐々に増やしてください。

  • プロキシを使用する: 異なる IP をローテーションして負荷を分散し、リクエストの集中を回避します。

  • ユーザーエージェントをランダム化する: リクエスト間でユーザー エージェント ヘッダーを変更します。

  • robots.txtをフォローする: スクレイパーが robots.txt ルールに従っていることを確認してください。

  • 再試行ロジックを使用する: レート制限またはブロックされた場合の指数バックオフ。

  • トラフィックが少ない時間帯にスクレイピングする:負荷が低い平日の夜をターゲットにします。

  • 注意深く監視してください: 障​​害の増加やスロットルが発生していないか確認してください。

適切なケアを行えば、持続可能で長期間稼働する Algolia スクレイパーを構築できます。ただし、時間をかけてアプローチを注意深く監視し、適応させるようにしてください。

ヘルパー ライブラリのスクレイピング

スケーリングと復元力の複雑さをすべて手動で処理するのは面倒な場合があります。 Web スクレイピングを簡素化するためのさまざまな商用ツールが存在します。

例:

これらのツールを使用すると、複雑なロジックを自分でコーディングすることなく、堅牢なスクレイパーを簡単に構築できます。私のガイドを参照してください スクレイピング API をいつどのように使用するか.

アップラッピング

主なポイントは次のとおりです。

  • Algolia は、サイトに簡単に統合できるように、API 経由でホストされた検索を提供します。
  • 検索 API はパブリックであり、エンドポイントとキーを抽出することでスクレイピングできます。
  • 大規模なスクレイピングには、非同期リクエストとプロキシ ローテーションが必要です。
  • 注意深く観察し、ブロックを避けるために丁寧にこすってください。
  • 商用スクレイピング サービスを利用すると、大規模なスクレイピング ジョブを簡素化できます。

この投稿が、Python を使用して大規模に Algolia 検索 API を効果的にスクレイピングする方法の概要を理解できることを願っています。同じ原則が他の言語にも当てはまります。

他にご質問がございましたら、お知らせください。

タグ:

参加する

あなたのメールアドレスは公開されません。 必須フィールドは、マークされています *