如果你做过关键词研究、竞品监控或内容选题,大概率遇到过同一个需求:批量拿到 Google 搜索结果,再把标题、链接、摘要整理成可用的数据。
手动复制粘贴当然能做,但一旦量上来,就会变成纯体力活。
用 PHP 自己写网络爬虫也能搞定,不过流程通常是:请求页面 → 解析 HTML → 遍历 DOM → 自己兜底各种异常。写着写着你会发现,最耗时间的不是“拿数据”,而是“和各种不确定性对抗”。
在这类“网页抓取 + 搜索结果抓取”的场景里,把请求层交给更稳定的方案,往往能把维护成本直接打下来。
👉 用 ScraperAPI 稳定抓取网页内容,省掉一堆请求层麻烦
你可以把精力放回到真正重要的部分:数据字段怎么抽、怎么存、怎么用。
即便你只想做最基础的 Google 搜索结果抓取,也会遇到一些“看起来不难、做起来很烦”的问题:
请求不稳定:同样的 URL,有时能拿到页面,有时返回异常内容或被限制
HTML 结构易变:搜索结果页结构更新很频繁,靠 DOM 解析很容易“昨天还能用,今天就空了”
解析成本高:DOMDocument/DOMXPath 很强,但要写 XPath、处理编码和错误,代码会越堆越多
调试困难:你以为是解析写错了,结果可能是请求返回的 HTML 根本不是你想要的内容
所以,**“能抓到页面”**本身就成了一个长期成本点。
这种方式适合你需要高度自定义提取规则,或者想对页面做更复杂的二次处理。思路很直白:
用 ScraperAPI 请求 Google 搜索页 URL
拿到 HTML 响应
用 DOMDocument / DOMXPath 提取结果列表
在这里,ScraperAPI 更像一个“请求通道”,让你更顺畅地拿到页面内容,然后继续用 PHP 的方式解析。
👉 了解 ScraperAPI 的抓取入口:把目标 URL 交给它拿回 HTML
接下来你只需要专心做 DOM 解析就行。
php
<?php
$apiKey = 'YOUR_API_KEY';
$query = 'php web scraping';
$googleUrl = 'https://www.google.com/search?q=' . urlencode($query);
$endpoint = 'https://api.scraperapi.com/?api_key=' . urlencode($apiKey)
. '&url=' . urlencode($googleUrl);
$ch = curl_init($endpoint);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_TIMEOUT => 30,
]);
$html = curl_exec($ch);
if ($html === false) {
throw new RuntimeException('Request failed: ' . curl_error($ch));
}
curl_close($ch);
php
<?php
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();
$xpath = new DOMXPath($dom);
// 注意:Google 搜索页结构变化很快,这里的 XPath 仅作示意
$nodes = $xpath->query("//a[@href]");
$results = [];
foreach ($nodes as $a) {
$href = $a->getAttribute('href');
$text = trim($a->textContent);
if ($text !== '' && str_starts_with($href, 'http')) {
$results[] = ['title' => $text, 'url' => $href];
}
}
要点提醒:HTML 解析法的最大风险在于“结构变了就得改规则”。如果你追求长期稳定、少维护,下面这个方案通常更省心。
当你的目标是“稳定拿字段”,而不是“研究页面结构”,Structured Data 这种方式会更符合生产环境:
返回的是 结构化 JSON,不用再写一堆 DOM 遍历
数据字段更清晰,比如常见的 organic_results
对页面结构变化更不敏感,维护成本更低
如果你的工作是持续跑的(比如每天监控一批关键词),Structured Data 往往能让你从“修解析器”变成“用数据做分析”。
👉 试试 ScraperAPI Structured Data:直接获取 Google 搜索结果 JSON
你拿到的数据更像 API 返回,而不是一整页 HTML。
php
<?php
$apiKey = 'YOUR_API_KEY';
$query = 'php web scraping';
$country = 'cn';
// Structured Data 端点以官方文档为准,这里展示参数思路:api_key / query / country
$endpoint = 'https://api.scraperapi.com/structured/google/search?api_key=' . urlencode($apiKey)
. '&query=' . urlencode($query)
. '&country=' . urlencode($country);
$ch = curl_init($endpoint);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_TIMEOUT => 30,
]);
$json = curl_exec($ch);
if ($json === false) {
throw new RuntimeException('Request failed: ' . curl_error($ch));
}
curl_close($ch);
$data = json_decode($json, true, flags: JSON_THROW_ON_ERROR);
$organicResults = $data['organic_results'] ?? [];
foreach ($organicResults as $item) {
$title = $item['title'] ?? '';
$url = $item['link'] ?? '';
// 按需保存:title / link / snippet / position 等字段
}
不管你用哪种方式,下面这些细节能让 PHP 爬虫更稳定、更好维护:
做好异常处理:超时、空响应、JSON 解析失败都要可追踪(日志很关键)
控制节奏:批量抓取时要限制并发和频率,避免把自己送进“反爬地狱”
参数一致:同一批关键词建议固定国家/语言参数,数据更可比
缓存与去重:同一关键词短时间重复请求的性价比很低,缓存能降成本
合规优先:抓取前先确认目标站点的服务条款与相关规定,避免不必要风险
如果你要做的是 Google 搜索结果抓取 + 结构化入库,并且希望长期跑得稳、维护更少:优先考虑 Structured Data。
如果你需要高度自由的页面级处理、或者要抓取的字段非常非标准:HTML + DOM 解析更灵活,但要接受更高的维护成本。
总之,用 PHP 做网页抓取不是难在“写代码”,而是难在“让它一直能跑”。把不确定性最高的请求层处理好,你的抓取链路就会更稳定、更快,也更容易规模化。