2 个版本
0.1.1 | 2021 年 12 月 24 日 |
---|---|
0.1.0 | 2021 年 12 月 23 日 |
#5 在 #google-search
9,075 每月下载量
11KB
169 行
SerpApi 在 Rust 中的搜索
这个 Rust 包允许从 Google、Bing、Baidu、Yandex、Yahoo、Ebay、Apple、Youtube、Naver、Home depot 等搜索引擎抓取和解析搜索结果。它由 SerpApi 提供,为所有搜索引擎提供了统一的 JSON 格式。SerpApi.com 允许进行本地化搜索,利用高级搜索引擎功能等... 在 SerpApi 上有完整的文档。
在您的 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>> {
// read secret api key from environment variable
// To get the key simply copy/paste from https://serpapi.com/dashboard.
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());
// initialize the search engine
let search = SerpApiSearch::google(params, api_key);
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
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"]);
// search returns text
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"]);
// // edit the location in the search
// println!("--- JSON search with a different location ---");
// params = HashMap::<String, String>::new();
// params.insert("location".to_string(), "Destin, Florida, United States".to_string());
// search = SerpApiSearch::google(params, api_key);
// let results = search.json().await?;
// println!(">> search_parameters: {}", results["search_parameters"]);
// let places = results["local_results"]["places"].as_array().unwrap();
// println!("number of local_results: {}\n", places.len());
// println!("local_results first address: {}\n", places[0]["address"]);
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
有关如何构建参数 HashMap 的更多信息,请参阅 serpapi.com 文档
技术特性
- 使用 Serde JSON 动态 JSON 解码
- 使用 tokio 和 reqwest 的异步 HTTP 请求处理方法
- 使用 Tokio 的异步测试
待办事项
- 更多测试以关闭代码覆盖率(每个搜索引擎)
- 添加更多示例
- 更好的文档
依赖项
~5–18MB
~256K SLoC