优化爬虫,增加缓存,线程池,保存浏览器用户信息
This commit is contained in:
@@ -112,14 +112,21 @@ abstract class AbstractScrmSpider
|
||||
// 'apiUrls' => $apiUrlsToIntercept,
|
||||
// 'authActions' => $config['authActions']
|
||||
// ]);
|
||||
$antiBot = $config['antiBot'] ?? null;
|
||||
|
||||
// 【阶段一】:初始化并首屏拦截
|
||||
$initResult = $this->requestNode('/api/auth-and-intercept', [
|
||||
'pageUrl' => $config['pageUrl'],
|
||||
'apiUrls' => $apiUrlsToIntercept,
|
||||
'authActions' => $config['authActions']
|
||||
]);
|
||||
'authActions' => $config['authActions'],
|
||||
'antiBot' => $antiBot,
|
||||
], $this->resolveAuthInterceptTimeout($antiBot));
|
||||
|
||||
if (empty($initResult['success'])) {
|
||||
$cfCode = (string) ($initResult['code'] ?? '');
|
||||
if ($cfCode === 'CF_TURNSTILE_FAILED') {
|
||||
throw new Exception('Cloudflare Turnstile 验证失败: ' . ($initResult['stage'] ?? 'timeout'));
|
||||
}
|
||||
throw new Exception("初始化失败: " . ($initResult['error'] ?? '未知'));
|
||||
}
|
||||
|
||||
@@ -161,7 +168,8 @@ abstract class AbstractScrmSpider
|
||||
'paramList' => $paramList,
|
||||
'method' => $config['listMethod'] ?? 'GET'
|
||||
]],
|
||||
'cookies' => $cookies
|
||||
'cookies' => $cookies,
|
||||
'antiBot' => $antiBot,
|
||||
], 120);
|
||||
|
||||
if (!empty($fetchResult['success'])) {
|
||||
@@ -189,7 +197,8 @@ abstract class AbstractScrmSpider
|
||||
'cookies' => $cookies,
|
||||
'firstPageData' => $firstPageData, // 传递原始数据源
|
||||
// 🔥 核心补充:把登录剧本原封不动地传给翻页引擎!
|
||||
'authActions' => $config['authActions']
|
||||
'authActions' => $config['authActions'],
|
||||
'antiBot' => $antiBot,
|
||||
], 1200); // 增加 PHP 端的 cURL 超时时间到 400 秒,以包容多次重试产生的耗时
|
||||
|
||||
if (!empty($uiResult['success']) && !empty($uiResult['data'])) {
|
||||
@@ -220,6 +229,19 @@ abstract class AbstractScrmSpider
|
||||
return $unifiedData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Real Browser + Turnstile 首屏耗时较长,单独放宽 auth-and-intercept 超时
|
||||
*
|
||||
* @param array<string, mixed>|null $antiBot
|
||||
*/
|
||||
private function resolveAuthInterceptTimeout($antiBot)
|
||||
{
|
||||
if (!is_array($antiBot) || empty($antiBot['enabled'])) {
|
||||
return 120;
|
||||
}
|
||||
return 180;
|
||||
}
|
||||
|
||||
private function requestNode($endpoint, $payload, $timeout = 60)
|
||||
{
|
||||
$ch = curl_init($this->nodeHost . $endpoint);
|
||||
@@ -227,6 +249,7 @@ abstract class AbstractScrmSpider
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
|
||||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
|
||||
$response = curl_exec($ch);
|
||||
if (curl_errno($ch)) throw new Exception(curl_error($ch));
|
||||
|
||||
Reference in New Issue
Block a user