mcpField
S
scrapfly-sdk-rust

scrapfly-sdk-rust

github.com/scrapfly数据与数据库5189 次安装2 周前更新
代码仓库

关于 scrapfly-sdk-rust

scrapfly-sdk-rust 是用于通过 Scrapfly 抓取网页的异步 Rust crate,面向 Rust 开发者。它以类型化配置支持代理池、JavaScript 渲染、截图、提取和并发请求。

主要功能

  1. 01基于 Tokio 的异步 Rust 客户端
  2. 02抓取配置的类型化构建器
  3. 03代理池与反机器人绕过
  4. 04JavaScript 渲染和截图
  5. 05并发抓取流
  6. 06HTML、JSON、文本和 Markdown 输出

适用场景

  1. 01在 Rust 项目中抓取网页内容
  2. 02访问受反机器人系统保护的页面
  3. 03渲染 JavaScript 密集型页面
  4. 04截图或提取结构化数据

安装

复制下面的命令,在终端中运行。

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

安装后在 Claude Code 中输入/scrapfly-sdk-rust确认已加载。

详细介绍

Scrapfly Rust SDK

使用 scrapfly-sdk crate,即可在 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(..) 也接受相同的四种代理池
  • unblocker(true) 及其别名 asp(true) 已弃用:请改用 proxy_pool(启用 Unblocker 时使用 ProxyPool::UnblockerUltra)。迁移指南介绍了代理池推出前编写的请求,包括代理池名称 ProxyPool::PublicDatacenterPool 和 ProxyPool::PublicResidentialPool。如果显式提供 asp,则以 asp 为准,而非 unblocker;对于已构建的 ScrapeConfig,可使用 unblocker_enabled() 读取开关状态,并使用 set_unblocker(bool) 设置开关状态
  • 使用 Format::Markdown 获取整洁、适合大模型处理的内容
  • 通过 result.result.content 读取页面正文;上游 HTTP 状态码为 result.result.status_code
  • 此 crate 不包含 HTML 解析器,请自行选择(scraper、kuchiki)

评论

支持 Markdown