scrapfly-sdk-rust について
scrapfly-sdk-rust は、Scrapfly 経由でウェブページを取得する非同期 Rust クレートです。型付き設定により、プロキシプール、JavaScript レンダリング、スクリーンショット、抽出、並行リクエストに対応します。
主な機能
- 01Tokio による非同期 Rust クライアント
- 02スクレイプ設定用の型付きビルダー
- 03プロキシプールとボット対策回避
- 04JavaScript レンダリングとスクリーンショット
- 05並行スクレイピングストリーム
- 06HTML、JSON、テキスト、Markdown 出力
活用シーン
- 01Rust コードベースからのウェブ取得
- 02ボット対策されたページへのアクセス
- 03JavaScript を多用するページのレンダリング
- 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)を追加してください
コメント
Markdown 対応