SerpApi Search in Rust
This Rust package enables to scrape and parse search results from Google, Bing, Baidu, Yandex, Yahoo, Ebay, Apple, Youtube, Naver, Home depot and more. It's powered by SerpApi which delivered a consistent JSON format accross search engines. SerpApi.com enables to do localized search, leverage advanced search engine features and a lot more... A completed documentation is available at SerpApi.
Installation
To install in your rust application, update Cargo.toml
serpapi="1.1.0"
Usage
Let's start by searching for Coffee on Google:
// search example for google
//
use Client;
use HashMap;
use env;
async
Google search documentation. More hands on examples are available below.
Documentations
For more information how to build a paramaters HashMap see serpapi.com documentation
Location API
let default = new;
let client = new.unwrap;
let mut parameter = new;
parameter.insert;
let data = client.location.await.expect;
let locations = data.as_array.unwrap;
It returns the first 3 locations matching Austin (Texas, Texas, Rochester)
Search Archive API
let mut default = new;
default.insert;
default.insert;
let client = new.unwrap;
// initialize the search engine
let mut parameter = new;
parameter.insert;
parameter.insert;
let initial_results = client.search.await.expect;
let mut id = initial_results.to_string;
// remove extra quote " from string convertion
id = id.replace;
println!;
assert_ne!;
// search in archive
let archived_results = client.search_archive.await.expect;
let archive_id = archived_results.as_str;
let search_id = initial_results.as_str;
println!;
assert_eq!;
Account API
let client = new;
let mut parameter = new;
parameter.insert;
let account = client.account.await.expect;
It returns your account information.
Technical features
- Dynamic JSON decoding using Serde JSON
- Asyncronous HTTP request handle method using tokio and reqwest
- Async tests using Tokio
Changes log
- 1.1.0: Always reuse the same client object instead of creating a new one for each search.
- This is a breaking change for the API because the client must be unwrapped in the main function.
# now: 1.1 let client = new.unwrap; # old: 1.0 let client = new;
- This is a breaking change for the API because the client must be unwrapped in the main function.
- 1.0.0: Initial release
References
- https://www.lpalmieri.com/posts/how-to-write-a-rest-client-in-rust-with-reqwest-and-wiremock/
- Serdes JSON
Examples in rust
To run an example:
file: (examples/google_search.rs)
The keyword google can be replaced by any supported search engine:
- baidu
- bing
- duckduckgo
- yahoo
- yandex
- ebay
- youtube
- walmart
- home_depot
- apple_app_store
- naver
More example to come to match all search engines supported by SerpApi.com.
Search bing
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let organic_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/bing_search.rs see: https://serpapi.com/bing-search-api
Search baidu
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let organic_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/baidu_search.rs see: https://serpapi.com/baidu-search-api
Search yahoo
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let organic_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/yahoo_search.rs see: https://serpapi.com/yahoo-search-api
Search youtube
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let video_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/youtube_search.rs see: https://serpapi.com/youtube-search-api
Search walmart
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let organic_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/walmart_search.rs see: https://serpapi.com/walmart-search-api
Search ebay
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let organic_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/ebay_search.rs see: https://serpapi.com/ebay-search-api
Search naver
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let ads_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/naver_search.rs see: https://serpapi.com/naver-search-api
Search home depot
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let products = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/home_depot_search.rs see: https://serpapi.com/home-depot-search-api
Search apple app store
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let organic_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/apple_app_store_search.rs see: https://serpapi.com/apple-app-store
Search duckduckgo
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let organic_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/duckduckgo_search.rs see: https://serpapi.com/duckduckgo-search-api
Search google
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let organic_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/google_search.rs see: https://serpapi.com/search-api
Search google scholar
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let organic_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/google_scholar_search.rs see: https://serpapi.com/google-scholar-api
Search google autocomplete
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let suggestions = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/google_autocomplete_search.rs see: https://serpapi.com/google-autocomplete-api
Search google product
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let product_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/google_product_search.rs see: https://serpapi.com/google-product-api
Search google reverse image
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let image_sizes = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
Search google events
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let events_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/google_events_search.rs see: https://serpapi.com/google-events-api
Search google local services
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let local_ads = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/google_local_services_search.rs see: https://serpapi.com/google-local-services-api
Search google maps
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
parameter.insert;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let local_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/google_maps_search.rs see: https://serpapi.com/google-maps-api
Search google jobs
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let jobs_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/google_jobs_search.rs see: https://serpapi.com/google-jobs-api
Search google play
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
parameter.insert;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let organic_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/google_play_search.rs see: https://serpapi.com/google-play-api
Search google images
let mut default = new;
default.insert;
default.insert;
// initialize the search engine
let client = new.unwrap;
// let's search for coffee in Austin, TX
let mut parameter = new;
parameter.insert;
parameter.insert;
parameter.insert;
// copy search parameter for the html search
let mut html_parameter = new;
html_parameter.clone_from;
// search returns a JSON as serde_json::Value which can be accessed like a HashMap.
println!;
let results = client.search.await?;
let images_results = results.as_array.unwrap;
println!;
println!;
let status = &results;
if status != "Success" else
print!;
Ok
- source code: examples/google_images_search.rs see: https://serpapi.com/images-results
License
MIT License
Continuous integration
We love "true open source" and "continuous integration", and Test Drive Development (TDD). We are using RSpec to test [our infrastructure around the clock]) using Github Action to achieve the best QoS (Quality Of Service).
The directory spec/ includes specification which serves the dual purposes of examples and functional tests.
Set your secret API key in your shell before running a test.
Contributions are welcome. Feel to submit a pull request!