限制观察
随着每次捕获,请将查询,本地,接口语言,安全搜索水平,时间范围和设备放在旁边.
清晰的交换
随着每次捕获,请将查询,本地,接口语言,安全搜索水平,时间范围和设备放在旁边.
接收源SERPHTML有效载荷在JSON封装中,而不是假设固定下游方案.
选择您的工作流程所需的领域,并与代表性有效载荷进行验证.
处理提取规则和记录方案作为应用程序代码,
DuckGo 网页搜索
使用DuckDuckGo引擎进行文件过器家族的网页搜索请求.验证您的产品所依赖的查询组合的实际有效载荷.
捕获范围
封筒将提交的搜索元数据与DuckDuckGo结果有效载荷相邻,以便您的管道可以保留所需的来源.
使用记录的结合本地值进行搜索.
设置 DuckDuckGo 控制器和标签使用的语言.
选择一个文件安全搜索水平.
要求记录日,周,月或年窗口,或者省略过器.
选择所需结果页面的文档设备文本.
文件选器组件
首先要使用所需查询. 加入只属于你打算复制的观察的可选DuckDuckGo过器.
q要求提供DuckDuckGo应该搜索和编码URL空间或特殊字符的术语.
kl选择性使用文件组合的本地代码,如 en_US,当请求需要该文本时.
kad选择性选择 DuckDuckGo 控制器和标签的文档语言.
kp选择性设置,调节或关闭,以记录的数值.
df选择性限制结果到过去的一天,一个星期,一个月或一个年,或者任何时间都省略过器.
device选择性选择文件设备值,当要求的演示文本重要时.
源有效载荷响应
终点响应是包含请求元数据和源SERPHTML有效载荷的JSON封装.您的应用程序拥有提取,验证和方案维护.
{
"search_parameters": {
"search_engine": "duckduckgo",
"query": "privacy research"
},
"search_results": "<html>...source SERP HTML...</html>"
}存储和检查只需要工作流程的内容.
从请求到持续维护的记录
选择查询,只需观察所需的文件过器.
调用服务器端,检查HTTP状态,并确认预期的源-有效载荷包.
应用测试的规则,验证所需的字段,并附加你的方案版本.
整合
保存凭据服务器侧,URL编码请求值,设置限期,检查未成功的HTTP状态,并在提取前验证封面.
: "${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"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());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())<?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;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());
}
}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());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.bodyWSA_API_KEY 服务器侧
engine=duckduckgo
kl=en_US
检查状态,封面,然后来源
产品选择
你的团队构建了搜索客户端,检索逻辑,提取和响应模型.
大多数应用程序所有权 页面检索发送一个符合条件的公开页面URL,并拥有完整的提取和方案层.
互联网通用发送文档搜索文本,并收到在 JSON 封内的源SERP HTML plus.
通过 WebScrapingAPI 完成一致的查询集,序列,方案,质量流程和交付.
已达成的运营模式FAQ
终点返回一个包含请求元数据和源SERPHTML有效载荷的JSON包.它不定义下游记录方案;你的应用程序拥有提取和方案维护.
当DuckDuckGo改变页面时,在推动更改之前,测试您的提取器与代表性反应.
在本页面上使用的文档控制器是查询的q,国家和语言的kl,接口语言的 kad,安全搜索的 kp,时间范围的df. 删除您不需要的可选过器.
答案保存源SERPHTML用量在JSON封装中.应用程序决定要提取哪些字段,如何建模它们,以及如何版本结果的方案.
在阅读机器之前检查HTTP状态,保留足够的请求文本来调查故障,并使用适合工作流程的限度重试行为. 视响应分析和验证为明确的应用步骤.
当您的团队想要捕获请求时间时,选择API,并将运行提取,方案,存储和安排. 当您想在托管数据号为WebScrapingAPI提供一致的查询集,序列,方案,质量流程和交付时,请考虑WebScrapingAPI.