响应形状在前面表示
在设计消费者之前,请知道引擎是否会返回分析结果收集或源SERP有效载荷.
没有扫描器的搜索数据
在设计消费者之前,请知道引擎是否会返回分析结果收集或源SERP有效载荷.
保持引擎,查询,本地,语言,设备,垂直和页面输入,
WebScrapingAPI运行支持的搜索检索路径,并保持记录的响应处理.
对于分析终端点,当返回的SERP暴露它们时,可选的结果收集才会出现;缺失并不自动是收集失败.
保存请求指纹,并存储结果,以便比较保持相似.
记录的覆盖
每个引擎都有自己的参数和响应形状. 首先选择终点,然后通过代表性查询验证所需的结果类型.
谷歌搜索支持记录的网页,图像,视频,新闻,购物和工作控制.专用端点覆盖了更多的谷歌表面.
googlegoogle_asyncgoogle_mapsgoogle_flightsgoogle_maps_reviewsgoogle_reverse_imagegoogle_trendsgoogle_hotels接收记录的JSON结果收集,并使用市场,位置,语言,安全搜索,偏移和结果计数控制.
接收请求元数据和源SERPHTML有效载荷在JSON封装中,有文档区域,界面语言,安全搜索,时间范围和设备控制.
接收请求元数据和源SERPHTML有效载荷在JSON封装中,有文档位置,语言,设备,页面和时间范围控制.
覆盖范围: 引擎名称并不意味着相同的控制或解析.谷歌和宾格文档解析了JSON结果集合;DuckDuckGo和Yandex文档包含源SERPHTML有效载荷的JSON包裹.当前的终端点文档仍然是生产真相来源.
发动机的反应
分析的集合和源有效载荷需要不同的消费者. 首先选择引擎,验证其当前响应形状,并保留请求文本,除了输出.
引擎,查询和响应级别的元数据由选择的终端点暴露.
search_parameters · general标题,链接,描述,观察到的位置和可选的模块,在记录和返回时.
organic[] · related[] · module?源 HTML 实用载荷返回JSON封面内,你的应用程序拥有任何从中提取的内容.
search_results: "<html>…</html>"当结果进入系统时,添加运行ID,请求时间印,查询组识别符和方案版本.
run_id · observed_at · schema谷歌搜索控制
首先要使用所需的查询. 仅添加需要的文档文本,使观察有用和可比拟.
使用查询,支持垂直或文档工作搜索控制.
qtbmibp设置支持域名,编码位置,语言,国家和设备值.
domainuulehlgldevice使用您需要的页面窗口的记录的偏移和请求结果数.
startnumengine=google使用标准记录的路径,当应用程序需要等待当前的响应时.
Review synchronous parametersengine=google_async在排队 Google 检索适合工作负载时使用专门的文档工作流程.不要假设每个引擎都分享异步行为.
Review asynchronous workflow一个要求
定义观察
选择引擎,查询,支持位置,语言,设备,搜索类型和页面参数.
发送请求
通过API密钥拨打服务器端 SERP. WebScrapingAPI 运行支持的检索和响应处理.
验证和使用
检查HTTP状态和引擎特定响应形状,然后保留排名,提取,警报或研究工作流所需的文本.
整合
保持API键在客户端代码之外,URL编码搜索值,设置时间限,并在解析响应之前检查未成功的HTTP状态.
WSA_API_KEY 服务器侧api_key + engine + qgl + hl + devicecurl --get --fail-with-body --max-time 120 \
"https://serpapi.webscrapingapi.com/v2" \
--data-urlencode "api_key=$WSA_API_KEY" \
--data-urlencode "engine=google" \
--data-urlencode "q=running shoes" \
--data-urlencode "gl=us" \
--data-urlencode "hl=en" \
--data-urlencode "device=mobile"import os
import requests
response = requests.get(
"https://serpapi.webscrapingapi.com/v2",
params={
"api_key": os.environ["WSA_API_KEY"],
"engine": "google",
"q": "running shoes",
"gl": "us",
"hl": "en",
"device": "mobile",
},
timeout=120,
)
response.raise_for_status()
print(response.json())const parameters = new URLSearchParams({
api_key: process.env.WSA_API_KEY,
engine: "google",
q: "running shoes",
gl: "us",
hl: "en",
device: "mobile",
});
const response = await fetch(
"https://serpapi.webscrapingapi.com/v2?" + parameters,
{ signal: AbortSignal.timeout(120_000) }
);
if (!response.ok) throw new Error("API status " + response.status);
console.log(await response.json());<?php
$parameters = http_build_query([
"api_key" => getenv("WSA_API_KEY"),
"engine" => "google",
"q" => "running shoes",
"gl" => "us",
"hl" => "en",
"device" => "mobile",
]);
$client = curl_init("https://serpapi.webscrapingapi.com/v2?" . $parameters);
curl_setopt_array($client, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($client);
$status = curl_getinfo($client, CURLINFO_RESPONSE_CODE);
$error = curl_error($client);
curl_close($client);
if ($body === false) throw new RuntimeException($error);
if ($status >= 400) throw new RuntimeException("API status " . $status);
echo $body;package main
import (
"fmt"
"io"
"net/http"
"net/url"
"os"
"time"
)
func main() {
parameters := url.Values{}
parameters.Add("api_key", os.Getenv("WSA_API_KEY"))
parameters.Add("engine", "google")
parameters.Add("q", "running shoes")
parameters.Add("gl", "us")
parameters.Add("hl", "en")
parameters.Add("device", "mobile")
client := &http.Client{Timeout: 120 * time.Second}
response, err := client.Get(
"https://serpapi.webscrapingapi.com/v2?" + parameters.Encode(),
)
if err != nil { panic(err) }
defer response.Body.Close()
if response.StatusCode >= 400 { panic(fmt.Sprintf("API status %d", response.StatusCode)) }
body, err := io.ReadAll(response.Body)
if err != nil { panic(err) }
fmt.Println(string(body))
}import java.net.URI;
import java.net.URLEncoder;
import java.net.http.*;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
public final class SerpApiExample {
public static void main(String[] args) throws Exception {
String queryString = "api_key=" + URLEncoder.encode(
System.getenv("WSA_API_KEY"), StandardCharsets.UTF_8
) + "&engine=google&q=running%20shoes"
+ "&gl=us&hl=en&device=mobile";
var request = HttpRequest.newBuilder()
.uri(URI.create("https://serpapi.webscrapingapi.com/v2?" + queryString))
.timeout(Duration.ofSeconds(120))
.GET().build();
var response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() >= 400) {
throw new RuntimeException("API status " + response.statusCode());
}
System.out.println(response.body());
}
}
using System;
using System.Net;
var apiKey = WebUtility.UrlEncode(
Environment.GetEnvironmentVariable("WSA_API_KEY")
);
var requestUrl =
"https://serpapi.webscrapingapi.com/v2?api_key=" + apiKey +
"&engine=google&q=running%20shoes" +
"&gl=us&hl=en&device=mobile";
using var client = new HttpClient();
client.Timeout = TimeSpan.FromSeconds(120);
var response = await client.GetAsync(requestUrl);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());require "net/http"
require "uri"
uri = URI("https://serpapi.webscrapingapi.com/v2")
uri.query = URI.encode_www_form(
api_key: ENV.fetch("WSA_API_KEY"),
engine: "google",
q: "running shoes",
gl: "us",
hl: "en",
device: "mobile"
)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.open_timeout = 10
http.read_timeout = 120
response = http.get(uri.request_uri)
raise "API status #{response.code}" unless response.is_a?(Net::HTTPSuccess)
puts response.body运营所有权
WebScrapingAPI运营
你的团队拥有
决策界限: SERP API does not define a universal rank, decide whether an absence is commercially meaningful, or operate your downstream analytics. Use eligible public results in line with the 服务协议 and applicable requirements.
使用情况
产品选择
你的团队拥有搜索客户端,访问逻辑,分析,维护和结果模型.
WebScrapingAPI申请人在申请中获得可接受公开页面.
发送支持的搜索查询,并在文档中接收解析的集合,或者在JSON封内提供源 SERP实用载荷.
使用浏览器支持的REST请求,在引擎特定的SERP参数不适合时,使用记录的等待和交互步骤.
WebScrapingAPI运行已达成的查询集,随机,方案,质量流程和交付.
产量评估
现在的价格和计划限制仍然是商业真理的来源.
FAQ
SERP API 是一个服务器端点,用于发送文档文本的搜索查询,并接收该引擎支持的响应形状.谷歌和宾格文档解析了JSON结果收集;DuckDuckGo和Yandex文档包含请求元数据和源SERPHTML有效载荷的JSON封装.
答案取决于选择的引擎.谷歌和宾格文件 JSON 转化数据 plus解析结果收集.DuckDuckGo和Yandex文件 JSON 转化数据 plus源头 SERP HTML 实用载荷,您的应用程序可以根据自己的数据模型存储或提取.
对于有文档解析集合的引擎,返回模块取决于引擎,查询,位置,设备和搜索类型. 仅在返回搜索页面暴露时才会出现有机结果和广告,本地元素,购物,媒体或相关搜索等终点特定模块.
使用已为选定的引擎记录的参数.谷歌搜索文件域名,编码位置,界面语言,国家和桌面,移动或平板电脑设备控制;其他引擎使用自己的市场和本地化参数.
文件包括专用无同步的谷歌搜索引擎用于排队检索. 处理无同步行为为终点特定,并在执行提交和结果检索时使用当前的工作流文档.
WebScrapingAPI 在端点文档提供时维护支持响应处理和解析集合.DuckDuckGo和Yandex目前将源SERPHTML有效载荷返回JSON包裹中,因此您的团队拥有任何从该有效载荷中提取的数据以及内部数据模型和下游决策.
检查HTTP状态和记录错误体,酌情使用限度复试,并区分未成功的请求与未成功的搜索响应,其中可选的结果集合是缺失或空的.