汽车之家抓取

This commit is contained in:
2026-01-22 18:08:51 +08:00
parent c7d3fdc30e
commit da1dc7a3da
3 changed files with 77 additions and 6 deletions
@@ -59,7 +59,62 @@ class UsedCarCrawlSingle
$finalUrl = end($history);
$pcUrl = $this->getPcUrl($finalUrl);
return $pcUrl;
}
/**
* 通过汽车之家分享链接获取pc端地址
*
* @param string $url
* @return string
* @throws GuzzleException
*/
public function get168FinaUrl(string $url): string
{
$client = new Client([
'verify' => false,
'timeout' => 10,
'headers' => [
'User-Agent' => 'Mozilla/5.0 (Linux; Android 13; Mobile)'
]
]);
$response = $client->get($url);
$html = (string) $response->getBody();
preg_match(
'/var\s+oUrl\s*=\s*[\'"]([^\'"]+che168\.com[^\'"]+)[\'"]/',
$html,
$m
);
if(empty($m[1])){ //如果没有获取到移动端地址
throw new \Exception('168移动端地址解析失败');
}
$pcUrl = $this->getChe168UrlByMobile($m[1]);
return $pcUrl;
}
/**
* 根据移动端url获取汽车之家pc端url
*
* @param string $url
* @return string
* @throws GuzzleException
*/
public function getChe168UrlByMobile(string $url): string
{
// 解析 URL获取车辆id
$parsedUrl = parse_url($url);
$path = $parsedUrl['path']; // "/dealer/162138/56723550.html"
// 使用 pathinfo 获取文件名
$pathParts = explode('/', $path);
$filename = end($pathParts); // "56723550.html"
$carId = pathinfo($filename, PATHINFO_FILENAME); // "56723550"
$pcUrl = 'https://www.che168.com/dealer/111/' . $carId . '.html?pvareaid=0';
return $pcUrl;
}
@@ -143,6 +198,7 @@ class UsedCarCrawlSingle
// 请求 HTML
$response = $client->get($url);
$html = (string)$response->getBody();
file_put_contents(runtime_path('craw.html'), $html);
// 检查是否获取到 HTML
if (empty($html)) {
@@ -151,7 +207,6 @@ class UsedCarCrawlSingle
// 使用 QueryList 解析 HTML
$ql = QueryList::html($html);
file_put_contents(runtime_path('168.html'),$html);
// 解析车辆列表,每辆车可能在 li.cards-li 或类似类名里
$cars = $ql->find('div#nav1 ul.basic-item-ul li')->map(function($item) {
@@ -174,7 +229,9 @@ class UsedCarCrawlSingle
$cars = array_merge(...$cars);
$cars['product_name'] = $cars['car_name'] = $ql->find('div.car-box .car-brand-name')->text();
$cars['price'] = $ql->find('span.price')->text();
$cars['price'] = !empty($cars['price'])?str_replace('万', '', $cars['price'])*10000:0;
$cars['price'] = explode('万', $cars['price'])[0]??0;
$cars['price'] = str_replace(['¥', '¥'], '', $cars['price']);
$cars['price'] = $cars['price']*10000;
//$cars['price'] = $ql->find('#overlayPrice')->text();
$cars['title'] = $cars['product_name'];
$cars['condition_desc'] = $ql->find('div.leave-message-box #messageBox')->text();
@@ -184,9 +241,9 @@ class UsedCarCrawlSingle
$links = $ql->find('.bread-crumbs a')->map(function ($a) {
return trim($a->text());
})->all();
$cars['brand_name'] = $links[3] ?str_replace('二手','',$links[3]): null;
$cars['brand_name'] = !empty($links[3]) ? str_replace('二手','',$links[3]): null;
$cars['brand_id'] = 0;
$cars['series_name'] = $links[4] ?str_replace('二手','',$links[4]): null;
$cars['series_name'] = !empty($links[4]) ?str_replace('二手','',$links[4]): null;
$cars['series_id'] = 0;
$cars['car_id'] = 0;
$info = explode(' ',$cars['product_name']);