如何实现PHP SEO爬虫自动增量处理谷歌表格域名批量任务?
自动增量批量处理爬虫任务的可行方案
针对你的PHP爬虫批量处理300个站点时的超时问题,以下是几个无需手动修改参数的自动增量处理方案:
方案1:利用Google Sheet状态列追踪进度(推荐)
直接在存储域名的Sheet中新增一列(比如B列)作为「处理状态」,值可选「未处理」「处理中」「已完成」。脚本每次启动时自动筛选出未处理的域名,取前5个处理,完成后更新状态,全程无需手动干预。
核心代码示例:
// 初始化Google Sheets服务(假设你已完成API授权) $service = new Google_Service_Sheets($client); $spreadsheetId = '你的表格ID'; // 1. 筛选未处理的前5个域名及对应行号 $range = 'Sheet1!A2:B'; // A列存域名,B列存处理状态 $response = $service->spreadsheets_values->get($spreadsheetId, $range); $values = $response->getValues(); $pendingDomains = []; $targetRows = []; foreach ($values as $index => $row) { // 未设置状态或状态为未处理的域名 if (!isset($row[1]) || $row[1] !== '已完成') { $pendingDomains[] = $row[0]; $targetRows[] = $index + 2; // 转换为Sheet的行号(表头是第1行) if (count($pendingDomains) >= 5) break; } } // 无待处理域名时终止脚本 if (empty($pendingDomains)) { echo "所有站点处理完成"; exit; } // 2. 标记选中的域名为「处理中」(避免重复处理) $updateRange = 'Sheet1!B' . implode(':B', $targetRows); $updateBody = new Google_Service_Sheets_ValueRange([ 'values' => array_fill(0, count($pendingDomains), ['处理中']) ]); $service->spreadsheets_values->update( $spreadsheetId, $updateRange, $updateBody, ['valueInputOption' => 'USER_ENTERED'] ); // 3. 批量处理SEO检测 foreach ($pendingDomains as $site) { getAllPagesSEO($site); } // 4. 更新状态为「已完成」 $updateBody->setValues(array_fill(0, count($pendingDomains), ['已完成'])); $service->spreadsheets_values->update( $spreadsheetId, $updateRange, $updateBody, ['valueInputOption' => 'USER_ENTERED'] );
方案2:本地文件存储处理进度
创建一个本地文本文件记录上次处理到的Sheet行号,脚本启动时读取该值,从对应行开始取5个域名,处理完成后更新行号。
核心代码示例:
$progressFile = './crawl_progress.txt'; $startRow = file_exists($progressFile) ? (int)file_get_contents($progressFile) : 2; // 从第2行开始(跳过表头) $spreadsheetId = '你的表格ID'; $service = new Google_Service_Sheets($client); // 读取下一批5个域名 $endRow = $startRow + 4; $range = "Sheet1!A{$startRow}:A{$endRow}"; $response = $service->spreadsheets_values->get($spreadsheetId, $range); $domains = array_column($response->getValues(), 0); // 无域名可处理时清理进度文件并终止 if (empty(array_filter($domains))) { echo "所有站点处理完成"; unlink($progressFile); exit; } // 处理这批域名 foreach ($domains as $site) { getAllPagesSEO($site); } // 更新进度到文件 file_put_contents($progressFile, $endRow + 1);
额外优化建议
- 用CLI模式运行脚本:CLI环境下PHP的默认超时限制更宽松,也可通过
set_time_limit(0)取消超时限制,避免中途中断。 - 增加单站点处理延迟:在
getAllPagesSEO函数末尾添加sleep(1)或类似延迟,降低目标服务器的请求压力,同时减少脚本超时概率。 - 异常捕获:在处理每个站点时加入try-catch块,避免单个站点爬取失败导致整批任务中断,同时可在Sheet中新增「错误信息」列记录失败原因。
内容的提问来源于stack exchange,提问作者Alex Douglas
相关产品推荐
相关产品推荐

