Rust搜索引擎集成库serpapi-search-rust的使用,通过SerpAPI实现Google搜索等引擎的高效数据抓取
Rust搜索引擎集成库serpapi-search-rust的使用,通过SerpAPI实现Google搜索等引擎的高效数据抓取
这个Rust包可以抓取和解析来自Google、Bing、Baidu、Yandex、Yahoo、Ebay、Apple、Youtube、Naver、Home depot等搜索引擎的结果。它由SerpApi提供支持,该API提供了跨搜索引擎的一致JSON格式。
要在你的Rust应用程序中安装,更新Cargo.toml:
serpapi-search-rust="0.1.0"
基本应用示例
use serpapi_search_rust::serp_api_search::SerpApiSearch;
use std::collections::HashMap;
use std::env;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 从环境变量读取API密钥
let api_key = match env::var_os("API_KEY") {
Some(v) => v.into_string().unwrap(),
None => panic!("$API_KEY is not set"),
};
println!("let's search about coffee on google");
let mut params = HashMap::<String, String>::new();
params.insert("q".to_string(), "coffee".to_string());
params.insert("location".to_string(), "Austin, TX, Texas, United States".to_string());
// 初始化搜索引擎
let search = SerpApiSearch::google(params, api_key);
// 搜索返回serde_json::Value格式的JSON
println!("waiting...");
let results = search.json().await?;
let organic_results = results["organic_results"].as_array().unwrap();
println!("results received");
println!("--- JSON ---");
println!(" - number of organic results: {}", organic_results.len());
println!(" - organic_results first result description: {}", results["organic_results"][0]["about_this_result"]["source"]["description"]);
let places = results["local_results"]["places"].as_array().unwrap();
println!("number of local_results: {}", places.len());
println!(" - local_results first address: {}", places[0]["address"]);
// 搜索返回文本
println!("--- HTML search ---");
let raw = search.html().await?;
print!(" - raw HTML size {} bytes\n", raw.len());
print!(" - async search completed with {}\n", results["search_parameters"]["engine"]);
print!("ok");
Ok(())
}
运行示例
cargo build --example google_search_example
文件: (examples/google_search_example.rs)
关键字google可以替换为任何支持的搜索引擎:
- baidu
- bing
- duckduckgo
- yahoo
- yandex
- ebay
- youtube
- walmart
- home_depot
- apple_app_store
- naver
运行测试
cargo test
技术特性
- 使用Serde JSON进行动态JSON解码
- 使用tokio和reqwest进行异步HTTP请求处理
- 使用Tokio进行异步测试
TODO
- 更多测试以提高代码覆盖率(每个搜索引擎)
- 添加更多示例
- 更好的文档
完整示例代码
use serpapi_search_rust::serp_api_search::SerpApiSearch;
use std::collections::HashMap;
use std::env;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 获取API密钥
let api_key = env::var("API_KEY").expect("API_KEY environment variable not set");
// 设置搜索参数
let mut params = HashMap::new();
params.insert("q".to_string(), "Rust programming".to_string());
params.insert("location".to_string(), "San Francisco, CA, United States".to_string());
// 创建Google搜索实例
let search = SerpApiSearch::google(params, api_key);
// 执行搜索并获取JSON结果
let results = search.json().await?;
// 处理搜索结果
if let Some(organic_results) = results["organic_results"].as_array() {
println!("Found {} organic results:", organic_results.len());
for (i, result) in organic_results.iter().enumerate() {
println!("{}. {}", i + 1, result["title"].as_str().unwrap_or("No title"));
println!(" {}", result["link"].as_str().unwrap_or("No link"));
}
}
Ok(())
}
这个示例展示了如何使用serpapi-search-rust库进行Google搜索并处理返回的JSON结果。你可以根据需要修改搜索参数和结果处理逻辑。
1 回复
Rust搜索引擎集成库serpapi-search-rust使用指南
简介
serpapi-search-rust
是一个Rust库,用于通过SerpAPI服务集成Google、Bing、Yahoo等搜索引擎的搜索功能。它提供了简单易用的API来执行搜索并获取结构化结果,非常适合需要搜索引擎数据的Rust应用程序。
主要特性
- 支持多种搜索引擎(Google、Bing、Yahoo等)
- 获取结构化搜索结果(普通搜索、图片、购物、新闻等)
- 异步请求支持
- 类型安全的API设计
- 支持地理位置和语言定制
安装
在Cargo.toml
中添加依赖:
[dependencies]
serpapi-search-rust = "0.1"
tokio = { version = "1.0", features = ["full"] }
基本使用方法
1. 初始化客户端
首先需要获取API密钥。
use serpapi_search_rust::serp_api_search::SerpApiSearch;
#[tokio::main]
async fn main() {
let api_key = "你的API密钥";
let search = SerpApiSearch::google(api_key);
}
2. 执行基本搜索
let params = maplit::hashmap! {
"q" => "Rust programming",
"hl" => "en",
};
let results = search.search(params).await.unwrap();
println!("{:#?}", results);
3. 获取特定类型结果
// 获取图片搜索结果
let image_params = maplit::hashmap! {
"q" => "Rust logo",
"tbm" => "isch", // 图片搜索
};
let image_results = search.search(image_params).await.unwrap();
println!("Image results: {:#?}", image_results["images_results"]);
高级用法
分页获取结果
let mut all_results = Vec::new();
let mut current_page = 0;
loop {
let params = maplit::hashmap! {
"q" => "Rust web framework",
"start" => (current_page * 10).to_string(),
};
let page_results = search.search(params).await.unwrap();
if page_results["organic_results"].as_array().unwrap().is_empty() {
break;
}
all_results.extend(page_results["organic_results"].as_array().unwrap().clone());
current_page += 1;
// 避免请求过于频繁
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
}
println!("Total results: {}", all_results.len());
获取本地化搜索结果
let local_params = maplit::hashmap! {
"q" => "restaurants",
"location" => "New York,NY,United States",
"hl" => "en",
"gl" => "us",
};
let local_results = search.search(local_params).await.unwrap();
println!("Local results: {:#?}", local_results["local_results"]);
错误处理
match search.search(params).await {
Ok(results) => {
println!("Search successful: {:#?}", results);
},
Err(e) => {
eprintln!("Search failed: {}", e);
}
}
注意事项
- SerpAPI是付费服务,注意API调用配额
- 大量请求时建议添加适当的延迟
- 敏感查询可能需要特殊权限
- 结果格式可能因搜索引擎类型而异
完整示例
use serpapi_search_rust::serp_api_search::SerpApiSearch;
use maplit::hashmap;
#[tokio::main]
async fn main() {
let api_key = "你的API密钥";
let search = SerpApiSearch::google(api_key);
// 搜索Rust相关新闻
let params = hashmap! {
"q" => "Rust programming",
"tbm" => "nws", // 新闻搜索
"hl" => "en",
"num" => "5",
};
match search.search(params).await {
Ok(results) => {
println!("News about Rust:");
for item in results["news_results"].as_array().unwrap() {
println!("- {} ({})", item["title"], item["link"]);
}
},
Err(e) => eprintln!("Error: {}", e),
}
}
这个库为Rust开发者提供了访问主流搜索引擎数据的便捷方式,适用于数据分析、市场研究、内容聚合等多种场景。