すべての記事

リダイレクト制御とRaw Bufferモード

FourAのAPIが、カスタマイズ可能なリダイレクト制限と生のバイナリレスポンスに対応しました。実際のスクレイピングにおけるエッジケースの処理方法を変える2つのオプションです。

リダイレクトチェーンはスクレイパーを停止させます。バイナリレスポンスはテキストとしてデコードされると破損します。これらは、「ページを取得してHTMLを解析する」段階を過ぎると、常に発生する2つの問題です。

これら両方に対処するため、2つの新しいrequestオプションであるfollowRedirectsreturnBufferをリリースしました。現在、APIで利用可能です。

仕組み

followRedirectsによるリダイレクト制御

ほとんどのスクレイピングAPIは、リダイレクトをboolean(追跡するか、しないか)として処理します。これは、ループするリダイレクトチェーンに遭遇するか、トラッキングパラメータを抽出するために中間の302 response自体が必要になるまでは機能します。

FourAのfollowRedirectsは0から20までの整数を受け取ります。省略する(または0に設定する)と、headersなどを含む生のリダイレクトresponseがそのまま返されます。5に設定すると、requestは最大5回ホップを追跡し、最終的に到達した内容を返します。

curl -X POST "https://eu.api.foura.ai/v1/request" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/short-link",
    "followRedirects": 3,
    "unblocker": true
  }'

これは最大3回のリダイレクトを追跡します。チェーンが2回で解決した場合は、最終ページを取得できます。3回より長い場合は、3回目のホップが返した内容を取得します。

この違いは想像以上に重要です。E-commerceサイトは、商品ページに到達する前にトラッキングURLを経由してリダイレクトします。これらは追跡したいはずです。しかし、アフィリエイトネットワークやURL短縮サービスは、時に6、7、8ホップも深いチェーンを作成することがあります。また、一部のリダイレクトループは決して解決しません。特定の回数で制限をかけることで、requestのタイムアウトを使い果たす無限ループに陥ることなく、データを収集できます。

これまでは、リダイレクトを無効にしてrequestを送信し、手動でLocation headerを解析してから別のrequestを送信するという回避策が必要でした。これでは最低2回のAPI呼び出しが発生し、レイテンシは2倍になり、維持管理が必要なコードも増えます。今では、数値を指定した1回の呼び出しで済みます。

returnBufferによる生のバイナリレスポンス

画像、PDF、またはprotobufのペイロードを収集する場合、テキストデコードによってデータが破壊されます。HTTPライブラリはresponseをテキストと想定し、charset検出を適用し、適合しないすべてのバイトを静かに破損させます。Protobufは読み取れなくなり、画像のheadersは破損します。結果としてファイルが破損し、その理由を説明する明確なエラーメッセージも表示されません。

returnBufferは、テキストデコードを完全にスキップするようAPIに指示します。

curl -X POST "https://eu.api.foura.ai/v1/request" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/product-image.jpg",
    "returnBuffer": true
  }'

responseのbodyは生のバイト(JSON responses内ではbase64-encoded)として返されます。手元でデコードすれば、サーバーが送信した通りのデータを正確に取得できます。charsetの想定も、エンコーディングの変換も、静かな破損も発生しません。

これは、私たちがよく目にするサポートチケットの1つでした。ユーザーが商品画像やPDFカタログを収集したものの、ファイルが開けないという問題です。修正方法は常に同じでしたが、回避策の代わりにフラグが用意されました。

影響

どちらの機能も、ジョブあたりのAPI呼び出し回数を削減します。followRedirectsは、手動によるリダイレクト追跡ループを排除します。returnBufferは、「取得し、破損していることに気づき、別の設定で再取得する」というサイクルを排除します。

リダイレクトの多いターゲット(アフィリエイトリンク、URL短縮サービス、E-commerceのトラッキングチェーンなど)において、ユーザーが手動のリダイレクト処理からfollowRedirectsに切り替えた初期テストでは、request数が40〜60%減少することが確認されています。また、バイナリ収集タスク(商品画像、ドキュメントのダウンロード)では、returnBufferによって複数ステップの回避策が単一のオプションに変わります(初期結果)。

これらは派手な機能ではありません。サイトがチェックアウトフローに余分なリダイレクトホップを追加したために、午前3時にスクレイパーが停止するまで、気にも留めないような機能です。

パワーユーザー向け

followRedirectsとresponseの検証を組み合わせることで、リダイレクトチェーンを正確に制御できます。リダイレクトを追跡しつつ、最終的な送信先が壁に突き当たった場合はrequestを失敗させます。

curl -X POST "https://eu.api.foura.ai/v1/request" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/product/12345",
    "followRedirects": 5,
    "unblocker": true,
    "validate": {
      "status": { "fail": [403, 503] },
      "data": { "fail": ["Access Denied", "captcha"] }
    }
  }'

これは最大5回のリダイレクトを追跡し、最終的なresponseをチェックします。サイトがCAPTCHAページやアクセス拒否の壁にリダイレクトした場合、requestは正常に失敗します。下流でフィルタリングする無駄なデータは発生しません。

バイナリ収集では、大きなファイルをダウンロードする前にコンテンツタイプを確認する必要がある場合、returnBufferをHEAD requestsと組み合わせます。FourAはHEADを正しく処理するため(内部で一般的なlibcurlエラーを防止します)、bodyを取得せずにheadersを検査できます。Content-Typeを確認し、ダウンロードする価値があるかを判断してから、returnBuffer: trueを指定して完全なrequestを実行します。

また、JavaScriptを多用するターゲットに対してbrowser tasksを使用している場合、これらのオプションは直接的なHTTPエンジンに適用されることに注意してください。ブラウザのrequestsはChromeの組み込みナビゲーションを介してリダイレクトを処理し、デフォルトで制限なしに追跡します。

今後の予定

私たちは、カスタムDNS解決、フェーズごとのタイムアウト調整、証明書処理オプションなど、より多くのrequestレベルの制御をAPI経由で公開することに取り組んでいます。目標は、インフラのオーバーヘッドなしに、クリーンなRESTインターフェースを通じてcurl-impersonateの完全な機能を提供することです。

必要な特定のオプションがあれば、ぜひご意見をお寄せください。dashboardでは、これらの新しいオプションを使用したrequestsのパフォーマンスがすでに表示されているため、ご自身で違いを測定できます。