修改爬虫服务

This commit is contained in:
mzl
2025-11-25 10:55:56 +08:00
parent 79d19a53e6
commit 134505be8c
2 changed files with 75 additions and 46 deletions
+73 -44
View File
@@ -46,7 +46,7 @@ class UsedCarCrawlService
if (!$raw) {
return false;
}
echo '开始抓取~:'.date('Y-m-d H:i:s').PHP_EOL;
$html = $this->getHtml($raw['url']);
switch ($raw['scene']) {
@@ -54,15 +54,11 @@ echo '开始抓取~:'.date('Y-m-d H:i:s').PHP_EOL;
$info = $this->getUsedDetail($html, $raw['url']);
$id = $this->saveUsedcarBasicToDb($info);
$this->iUrl($info['car_id_url'], 'config', $id);
echo '一阶段 抓取成功~:'.date('Y-m-d H:i:s').PHP_EOL;
break;
case 'config':
$data = $this->getConfigDetail($html);
$this->saveUsedcarConfigToDb($data, $raw['id']);
echo '二阶段 抓取成功~:'.date('Y-m-d H:i:s').PHP_EOL;
break;
}
@@ -142,7 +138,9 @@ echo '开始抓取~:'.date('Y-m-d H:i:s').PHP_EOL;
// 能源类型
$fuelForm = $jsonArray['props']['pageProps']['skuDetail']['car_config_overview']['power']['fuel_form'] ?? '';
$newFuelForm = $jsonArray['props']['pageProps']['skuDetail']['car_config_overview']['new_energy_power']['fuel_form'] ?? '';
$resultFuelForm = $fuelForm === '' ? $newFuelForm : $fuelForm;
// 使用里程
$importantText = $jsonArray['props']['pageProps']['skuDetail']['important_text'] ?? '';
$importantTextArray = explode(' | ', $importantText);
@@ -186,8 +184,8 @@ echo '开始抓取~:'.date('Y-m-d H:i:s').PHP_EOL;
$info['car_id_url'] = $carIdUrl;
$info['used_detail'] = $jsonText;
$info['format_shop_info'] = json_encode($formatShopInfo);
$info['fuel_form'] = $fuelForm;
$info['classify_energy'] = $this->classifyEnergy($fuelForm);
$info['fuel_form'] = $resultFuelForm;
$info['classify_energy'] = $this->detectEnergyType($resultFuelForm);
$info['usage_mileage'] = $usageMileage;
$info['brand_name'] = $brandName;
$info['series_name'] = $seriesName;
@@ -291,54 +289,85 @@ echo '开始抓取~:'.date('Y-m-d H:i:s').PHP_EOL;
}
/**
* 获取能源类型
* 根据给定字符串判断车辆能源类型
*
* 返回:
* - new_energy 新能源(纯电、插电混动、增程、氢燃料等)
* - traditional 传统能源(汽油、柴油、天然气、非插电混动等)
* - unknown 无法判断
*
* @param string $text 例如:'2022款 某某牌 2.0L 油电混合 双擎'
* @return string
*/
public function classifyEnergy($input)
public function detectEnergyType(string $text): string
{
$ce = ['汽油', '柴油', '天然气'];
$re = ['纯电', '电动', '氢能', '氢燃料', '太阳能', '油电混动', '混动', '插电混动', '插电式', '增程式', '增程'];
// 标准化输入:去除空格等
$input = trim($input);
// 1. 精确或子串匹配(优先)
foreach ($re as $keyword) {
if (strpos($input, $keyword) !== false) {
return 'RE'; // 新能源
}
if (function_exists('mb_internal_encoding')) {
mb_internal_encoding('UTF-8');
}
foreach ($ce as $keyword) {
if (strpos($input, $keyword) !== false) {
return 'CE'; // 传统能源
// 明确定义的新能源关键字(纯电 / 插电 / 增程 / 氢 / 太阳能 等)
$newEnergyKeywords = [
// 纯电
'纯电', '纯电动', '电动车', 'BEV',
// 插电式混合
'插电混动', '插电式混合', '插电式', '插电', 'PHEV',
// 增程式
'增程式', '增程', 'REEV',
// 氢能 / 燃料电池
'氢能', '氢燃料', '燃料电池', 'FCEV',
// 其它
'太阳能',
];
// 传统能源关键字(包括燃油/燃气)
$traditionalKeywords = [
'汽油',
'柴油',
'天然气', 'LNG', 'CNG',
];
// 普通混动关键字(按你的要求,统一归为传统能源)
$hybridKeywords = [
'油电混合', '油电混动', '油电',
'混动', // 不带“插电”的混动
'双擎', // 丰田常见表达
'HEV',
];
// 辅助:不区分大小写的包含判断,优先 mb_stripos
$contains = function (string $haystack, string $needle): bool {
if ($needle === '') {
return false;
}
if (function_exists('mb_stripos')) {
return mb_stripos($haystack, $needle) !== false;
}
return stripos($haystack, $needle) !== false;
};
// 1. 先判断“明确新能源”关键词(插电、增程、氢、纯电等)
foreach ($newEnergyKeywords as $kw) {
if ($contains($text, $kw)) {
return 'RE';
}
}
// 2. 如果没匹配上,尝试模糊匹配(相似度 > 80%)
$bestMatch = null;
$bestScore = 0;
$bestType = null;
// 检查 RE
foreach ($re as $keyword) {
similar_text($input, $keyword, $percent);
if ($percent > $bestScore && $percent >= 80) {
$bestScore = $percent;
$bestMatch = $keyword;
$bestType = 'RE';
// 2. 再判断“普通油电混动”——按照你的业务,一律归为传统能源
foreach ($hybridKeywords as $kw) {
if ($contains($text, $kw)) {
return 'CE';
}
}
// 检查 CE
foreach ($ce as $keyword) {
similar_text($input, $keyword, $percent);
if ($percent > $bestScore && $percent >= 80) {
$bestScore = $percent;
$bestMatch = $keyword;
$bestType = 'CE';
// 3. 再判断传统能源(纯燃油/气)
foreach ($traditionalKeywords as $kw) {
if ($contains($text, $kw)) {
return 'CE';
}
}
return $bestType ?? 'UNKNOWN'; // 未识别
// 4. 都没匹配上
return 'UNKNOWN';
}
/**
+2 -2
View File
@@ -161,13 +161,13 @@ class IndexController
{
$service = new \app\common\service\UsedCarCrawlService();
$result = $service->iUrl('https://www.dongchedi.com/usedcar/21557932');
$result = $service->iUrl('https://www.dongchedi.com/usedcar/21725410');
// $result = $service->doData();
// $result = $service->decodeDongchediPrice('.');
// $result = $service->classifyEnergy('插电式混合动力');
// $result = $service->detectEnergyType('油电混合');
return json($result);
}