mcpField
S
scrapfly-sdk-rust

scrapfly-sdk-rust

github.com/scrapflyデータ・データベース5189 回インストール2 週間前に更新
リポジトリ

scrapfly-sdk-rust について

scrapfly-sdk-rust は、Scrapfly 経由でウェブページを取得する非同期 Rust クレートです。型付き設定により、プロキシプール、JavaScript レンダリング、スクリーンショット、抽出、並行リクエストに対応します。

主な機能

  1. 01Tokio による非同期 Rust クライアント
  2. 02スクレイプ設定用の型付きビルダー
  3. 03プロキシプールとボット対策回避
  4. 04JavaScript レンダリングとスクリーンショット
  5. 05並行スクレイピングストリーム
  6. 06HTML、JSON、テキスト、Markdown 出力

活用シーン

  1. 01Rust コードベースからのウェブ取得
  2. 02ボット対策されたページへのアクセス
  3. 03JavaScript を多用するページのレンダリング
  4. 04スクリーンショット撮影や構造化データ抽出

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/scrapfly/skills --skill scrapfly-sdk-rust

インストール後、Claude Code で/scrapfly-sdk-rustを入力して読み込まれたか確認します。

詳細

Scrapfly Rust SDK

scr apfly-sdk クレートを使用すると、Rust からウェブページをスクレイピングできます。プロキシのローテーション、アンチボットの回避(Unblocker)、JavaScript のレンダリング、スクリーンショットの撮影、AI による抽出に対応しています。クライアントは非同期(Tokio)で、すべての設定に型付きビルダーを使用します。

使用する場面

  • Rust のコードベースからウェブページ(HTML、JSON、テキスト、Markdown)をスクレイピングする場合
  • アンチボット保護(Cloudflare、DataDome、PerimeterX、Kasada)を回避する場合
  • ヘッドレスブラウザーで JavaScript を多用するページをレンダリングする場合
  • スクリーンショットを撮影したり、構造化データを抽出したりする場合

セットアップ

cargo add scrapfly-sdk
export SCRAPFLY_API_KEY="your-api-key"

scrapfly.io で API キーを取得してください。

基本的なスクレイピング

use scrapfly_sdk::{Client, ScrapeConfig};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::builder()
        .api_key(std::env::var("SCRAPFLY_API_KEY")?)
        .build()?;

    let config = ScrapeConfig::builder("https://web-scraping.dev/products").build()?;
    let result = client.scrape(&config).await?;

    println!(
        "status={} content={}",
        result.result.status_code,
        result.result.content,
    );
    Ok(())
}

アンチボットの回避、地域ターゲティング、JS レンダリング

型付きビルダーメソッドをチェーンします。proxy_pool と format には列挙型を指定します。プールのバリアント ProxyPool::Basic、ProxyPool::Unblocker、ProxyPool::UnblockerUltra、ProxyPool::Auto は scrapfly-sdk 0.6 で利用できます。移行ガイドでは、プロキシプール導入前に記述されたリクエストについて説明しています。

use scrapfly_sdk::{Client, ScrapeConfig, Format, ProxyPool};

let config = ScrapeConfig::builder("https://web-scraping.dev/products")
    .proxy_pool(ProxyPool::Unblocker)            // residential proxies + the Unblocker (anti-bot bypass)
    .country("us")                               // proxy country (ISO 3166-1 alpha-2)
    .render_js(true)                             // headless browser rendering
    .wait_for_selector("div.product")            // requires render_js
    .rendering_wait(5000)                        // ms, requires render_js
    .format(Format::Markdown)                    // clean, LLM-friendly content
    .build()?;

let result = client.scrape(&config).await?;

スクリーンショットと抽出

use scrapfly_sdk::{Client, ScreenshotConfig, ExtractionConfig};

let shot = client
    .screenshot(&ScreenshotConfig::builder("https://web-scraping.dev/products").build()?)
    .await?;
// shot.image is the raw bytes; shot.save("products", None)? writes it to disk

let html = result.result.content.into_bytes();
let extraction = ExtractionConfig::builder(html, "text/html")
    .extraction_prompt("extract all product names and prices")
    .build()?;
let data = client.extract(&extraction).await?;
println!("{}", serde_json::to_string_pretty(&data.data)?);

並行スクレイピング

concurrent_scrape は Stream を返します(buffer_unordered を使用):

use futures_util::StreamExt;

let configs = vec![
    ScrapeConfig::builder("https://web-scraping.dev/products?page=1").build()?,
    ScrapeConfig::builder("https://web-scraping.dev/products?page=2").build()?,
];

let mut stream = client.concurrent_scrape(configs, 5); // concurrency = 5
while let Some(result) = stream.next().await {
    let result = result?;
    println!("{}", result.result.content.len());
}

重要な注意事項

  • rendering_wait、wait_for_selector、スクリーンショットには render_js(true) が必要です
  • ProxyPool::Basic は Unblocker を無効にしたデータセンタープロキシ、ProxyPool::Unblocker は Unblocker を有効にした住宅用プロキシ、ProxyPool::UnblockerUltra はそれらと同じで、独自の料金が設定されたターゲットまたはアンチボット保護が受け付ける唯一のプールです。ProxyPool::Auto を指定すると、API はリクエスト前にターゲットのプロファイルに基づいてプールを選択します。データセンタープロキシで Unblocker を有効にするか、ターゲットに必要なプールを選択します(すべてのターゲットで受け付けられ、unblocker_ultra が必要なターゲットも含まれます。その場合は料金が加算され、実行に使用されるプールの料金が適用されます)。各プールで Unblocker の設定も行われます。独自の料金が設定されたターゲットまたはアンチボット保護は、basic と unblocker に対して ERR::PROXY::UNBLOCKER_ULTRA_REQUIRED(HTTP 422、請求対象外)を返します。その場合は ProxyPool::UnblockerUltra を指定して再送してください。0.6 以降、ScreenshotConfig::builder(..).proxy_pool(..) では同じ4つのプールを指定できます
  • unblocker(true) とその別名 asp(true) は非推奨です。代わりに proxy_pool を使用してください(Unblocker には ProxyPool::UnblockerUltra を指定します)。移行ガイドでは、プロキシプール導入前に記述されたリクエストについて説明しています。これにはプール名 ProxyPool::PublicDatacenterPool と ProxyPool::PublicResidentialPool も含まれます。asp を明示的に指定した場合は unblocker より優先されます。ビルド済みの ScrapeConfig では、unblocker_enabled() で設定を読み取り、set_unblocker(bool) で設定できます
  • クリーンで LLM に適したコンテンツには Format::Markdown を使用してください
  • ページ本文は result.result.content から、上流の HTTP ステータスは result.result.status_code から読み取れます
  • このクレートには HTML パーサーが含まれていません。独自のパーサー(scraper、kuchiki)を追加してください

コメント