DuckGo搜索API ·源-有效载荷终端点
查询数据的数据.
设置查询和记录DuckDuckGo过器,然后收到包含请求元数据和源SERPHTML有效载荷的JSON封装.您的应用程序拥有提取,验证和方案维护.
服务器端 GET 请求 ·engine=duckduckgo · 讨论您的数据源工作流程
- 集中搜索控制查询,地方,界面,安全,时间
- 保存的来源在JSON中输入的SERPHTML
- 具体的所有权您的提取器,方案和验证
- 附带的文本要求除了有效载荷之外的元数据
kl en_US
kad en_US
kp -1
moderate
清晰的交换
捕获源响应,而不模糊数据模型的所有者.
WebScrapingAPI运行了文档化的DuckDuckGo请求路径.您的应用程序接收了源码有效载荷,并决定如何提取,验证,版本,存储和使用它.
01
限制观察
随着每次捕获,请将查询,本地,接口语言,安全搜索水平,时间范围和设备放在旁边.
02
保持源
接收源SERPHTML有效载荷在JSON封装中,而不是假设固定下游方案.
03
设计你的取器
选择您的工作流程所需的领域,并与代表性有效载荷进行验证.
04
版本布局变化
处理提取规则和记录方案作为应用程序代码,
WebScrapingAPI文件要求执行
响应界限转载数据
您的申请提取+维护方案
DuckGo 网页搜索
控制源-SERP观测的集中终点.
使用DuckDuckGo引擎进行文件过器家族的网页搜索请求.验证您的产品所依赖的查询组合的实际有效载荷.
地方
国家和语言
使用记录的结合本地值进行搜索.
演讲
接口语言
设置 DuckDuckGo 控制器和标签使用的语言.
政策
安全搜索
选择一个文件安全搜索水平.
过去
时间范围
要求记录日,周,月或年窗口,或者省略过器.
演讲
设备
选择所需结果页面的文档设备文本.
覆盖范围:杜克达克可改变其页面所显示的字段和标记. 测试代表性有效载荷,并将抽取假设保存在一个版本的客户所有的消费者内.
文件选器组件
在比较捕获之前,请明确搜索文本.
首先要使用所需查询. 加入只属于你打算复制的观察的可选DuckDuckGo过器.
q Required
搜索查询
提供DuckDuckGo应该搜索和编码URL空间或特殊字符的术语.
kl Optional
国家+语言
使用文件组合的本地代码,如 en_US,当请求需要该文本时.
kad Optional
接口语言
选择 DuckDuckGo 控制器和标签的文档语言.
kp Optional
安全搜索水平
设置,调节或关闭,以记录的数值.
df Optional
时间范围
限制结果到过去的一天,一个星期,一个月或一个年,或者任何时间都省略过器.
device Optional
设备背景
选择文件设备值,当要求的演示文本重要时.
参数真相来源在生产使用前确认已接受的值.
源有效载荷响应
处理JSON封面作为一个运输界限,而不是最终的记录模型.
终点响应是包含请求元数据和源SERPHTML有效载荷的JSON封装.您的应用程序拥有提取,验证和方案维护.
文件的形状
附加于有效载荷的元数据
其他类型
{
"search_parameters": {
"search_engine": "duckduckgo",
"query": "privacy research"
},
"search_results": "<html>...source SERP HTML...</html>"
}存储和检查只需要工作流程的内容.
消费者合同
你的团队定义了稳定的层.
检查
检查HTTP结果和预期封面字段.
提取物
阅读下游使用情况所要求的元素.
验证
区分缺失内容,改变标记和未能提取.
版本
记录采集器和图案版本,并使用衍生数据.
拥有权规则
WebScrapingAPI 返回文件封面.您的应用程序拥有源SERPHTML有效载荷的任何提取和维护每一个下游的现场合约.
要求保持记录
建立捕获和提取生命周期作为单独的阶段.
保持终端响应与业务方案分开,使得拥有权,验证和布局更容易处理.
- 01
定义环境
选择查询,只需观察所需的文件过器.
- 02
发送和验证
调用服务器端,检查HTTP状态,并确认预期的源-有效载荷包.
- 03
摘录和版本
应用测试的规则,验证所需的字段,并附加你的方案版本.
整合
开始一个DuckDuckGo请求和一个明确的故障路径.
保存凭据服务器侧,URL编码请求值,设置限期,检查未成功的HTTP状态,并在提取前验证封面.
- 秘密
WSA_API_KEY服务器侧- 发动机
engine=duckduckgo- 过器的例子
kl=en_US- 消费者
- 检查状态,封面,然后来源
using System;
using System.Net;
using System.Net.Http;
var rawApiKey = Environment.GetEnvironmentVariable("WSA_API_KEY");
if (string.IsNullOrWhiteSpace(rawApiKey)) {
throw new InvalidOperationException("WSA_API_KEY is required");
}
var key = WebUtility.UrlEncode(rawApiKey);
var url = "https://serpapi.webscrapingapi.com/v2" +
"?api_key=" + key + "&engine=duckduckgo" +
"&q=privacy%20research&kl=en_US&kad=en_US" +
"&kp=1&df=w&device=desktop";
using var client = new HttpClient {
Timeout = TimeSpan.FromSeconds(120)
};
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());: "${WSA_API_KEY:?WSA_API_KEY is required}"
curl --get --fail-with-body --max-time 120 \
"https://serpapi.webscrapingapi.com/v2" \
--data-urlencode "api_key=$WSA_API_KEY" \
--data-urlencode "engine=duckduckgo" \
--data-urlencode "q=privacy research" \
--data-urlencode "kl=en_US" \
--data-urlencode "kad=en_US" \
--data-urlencode "kp=1" \
--data-urlencode "df=w" \
--data-urlencode "device=desktop"package main
import (
"fmt"
"io"
"net/http"
"net/url"
"os"
"time"
)
func main() {
apiKey := os.Getenv("WSA_API_KEY")
if apiKey == "" { panic("WSA_API_KEY is required") }
endpoint, err := url.Parse(
"https://serpapi.webscrapingapi.com/v2?engine=duckduckgo&q=privacy%20research",
)
if err != nil { panic(err) }
query := endpoint.Query()
query.Set("api_key", apiKey)
query.Set("kl", "en_US")
query.Set("kad", "en_US")
query.Set("kp", "1")
query.Set("df", "w")
query.Set("device", "desktop")
endpoint.RawQuery = query.Encode()
client := &http.Client{Timeout: 120 * time.Second}
response, err := client.Get(endpoint.String())
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 DuckDuckGoExample {
public static void main(String[] args) throws Exception {
String apiKey = System.getenv("WSA_API_KEY");
if (apiKey == null || apiKey.isBlank()) {
throw new IllegalStateException("WSA_API_KEY is required");
}
String key = URLEncoder.encode(apiKey, StandardCharsets.UTF_8);
String url = "https://serpapi.webscrapingapi.com/v2" +
"?api_key=" + key + "&engine=duckduckgo" +
"&q=privacy%20research&kl=en_US&kad=en_US" +
"&kp=1&df=w&device=desktop";
var request = HttpRequest.newBuilder(URI.create(url))
.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());
}
}const apiKey = process.env.WSA_API_KEY;
if (!apiKey) throw new Error("WSA_API_KEY is required");
const parameters = new URLSearchParams({
api_key: apiKey,
"engine": "duckduckgo",
"q": "privacy research",
kl: "en_US",
kad: "en_US",
kp: "1",
df: "w",
device: "desktop",
});
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
$apiKey = getenv("WSA_API_KEY");
if ($apiKey === false || $apiKey === "") {
throw new RuntimeException("WSA_API_KEY is required");
}
$endpoint = "https://serpapi.webscrapingapi.com/v2?engine=duckduckgo&q=privacy%20research";
$parameters = http_build_query([
"api_key" => $apiKey,
"kl" => "en_US",
"kad" => "en_US",
"kp" => "1",
"df" => "w",
"device" => "desktop",
]);
$client = curl_init($endpoint . "&" . $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;import os
import requests
api_key = os.environ.get("WSA_API_KEY")
if not api_key:
raise RuntimeError("WSA_API_KEY is required")
response = requests.get(
"https://serpapi.webscrapingapi.com/v2",
params={
"api_key": api_key,
"engine": "duckduckgo",
"q": "privacy research",
"kl": "en_US",
"kad": "en_US",
"kp": "1",
"df": "w",
"device": "desktop",
},
timeout=120,
)
response.raise_for_status()
print(response.json())require "net/http"
require "uri"
api_key = ENV["WSA_API_KEY"]
raise "WSA_API_KEY is required" if api_key.nil? || api_key.empty?
uri = URI("https://serpapi.webscrapingapi.com/v2?engine=duckduckgo&q=privacy%20research")
parameters = URI.decode_www_form(uri.query)
parameters << ["api_key", api_key]
parameters << ["kl", "en_US"]
parameters << ["kad", "en_US"]
parameters << ["kp", "1"]
parameters << ["df", "w"]
parameters << ["device", "desktop"]
uri.query = URI.encode_www_form(parameters)
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)
unless response.is_a?(Net::HTTPSuccess)
raise "API status #{response.code}"
end
puts response.body源首次使用情况
通过控制捕获,你的团队需要自己的采集合同.
资源有效载荷是输入,而不是完成的决定. 在比较或操作衍生数据之前,保存请求文本和提取版本.
产品选择
根据您想要拥有的源到方案工作流量,
克达克戈搜索API处理了记录的引擎请求和源-有效载荷包裹. 邻近的产品将责任转移到访问基础设施或托管数据交付.
代理基础设施
你的团队构建了搜索客户端,检索逻辑,提取和响应模型.
抓取 API
发送一个符合条件的公开页面URL,并拥有完整的提取和方案层.
DuckGo搜索 API
发送文档搜索文本,并收到在 JSON 封内的源SERP HTML plus.
托管数据
通过 WebScrapingAPI 完成一致的查询集,序列,方案,质量流程和交付.
产量评估
在选择计划之前验证有效载荷适应.
试验普通,本地化,时间过,空,改编,未成功的案例.目前的定价和计划描述仍然是商业的真相来源.
现场问题
- 环境
什么样的过器组合有什么关系?
- 合同
必须存在哪些源域?
- 质量
标记变化是如何检测的?
- 恢复
哪些失败可能会再次尝试?
- 拥有权
谁维护了提取器和方案?
FAQ
为了进行基础评估,
作为实践的真相来源,使用当前的文档和代表性来源的有效载荷.
达克戈搜索API返回了什么?
终点返回一个包含请求元数据和源SERPHTML有效载荷的JSON包.它不定义下游记录方案;你的应用程序拥有提取和方案维护.
子子的布局改变,谁拥有取?
当DuckDuckGo改变页面时,在推动更改之前,测试您的提取器与代表性反应.
我可以控制哪些DuckDuckGo过器?
在本页面上使用的文档控制器是查询的q,国家和语言的kl,接口语言的 kad,安全搜索的 kp,时间范围的df. 删除您不需要的可选过器.
源源的有效载荷已经符合我的方案吗?
答案保存源SERPHTML用量在JSON封装中.应用程序决定要提取哪些字段,如何建模它们,以及如何版本结果的方案.
我申请申请未能申请的情况应该如何处理?
在阅读机器之前检查HTTP状态,保留足够的请求文本来调查故障,并使用适合工作流程的限度重试行为. 视响应分析和验证为明确的应用步骤.
什么时候考虑托管数据?
当您的团队想要捕获请求时间时,选择API,并将运行提取,方案,存储和安排. 当您想在托管数据号为WebScrapingAPI提供一致的查询集,序列,方案,质量流程和交付时,请考虑WebScrapingAPI.