Rust搜索引擎集成库serpapi-search-rust的使用,通过SerpAPI实现Google搜索等引擎的高效数据抓取

Rust搜索引擎集成库serpapi-search-rust的使用,通过SerpAPI实现Google搜索等引擎的高效数据抓取

CI serpapi-search-rust

这个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可以替换为任何支持的搜索引擎:

  • 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);
    }
}

注意事项

  1. SerpAPI是付费服务,注意API调用配额
  2. 大量请求时建议添加适当的延迟
  3. 敏感查询可能需要特殊权限
  4. 结果格式可能因搜索引擎类型而异

完整示例

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开发者提供了访问主流搜索引擎数据的便捷方式,适用于数据分析、市场研究、内容聚合等多种场景。

回到顶部