关于 scrapfly-sdk-rust
scrapfly-sdk-rust 是用于通过 Scrapfly 抓取网页的异步 Rust crate,面向 Rust 开发者。它以类型化配置支持代理池、JavaScript 渲染、截图、提取和并发请求。
主要功能
- 01基于 Tokio 的异步 Rust 客户端
- 02抓取配置的类型化构建器
- 03代理池与反机器人绕过
- 04JavaScript 渲染和截图
- 05并发抓取流
- 06HTML、JSON、文本和 Markdown 输出
适用场景
- 01在 Rust 项目中抓取网页内容
- 02访问受反机器人系统保护的页面
- 03渲染 JavaScript 密集型页面
- 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