如何不使用Selenium,用BeautifulSoup抓取需点击显示的汽车详情?
不用Selenium抓取售车网站详情的方案
你当前的代码直接从列表页找详情元素肯定拿不到数据——因为点击才加载的内容根本不会包含在列表页的HTML里,得换两种思路解决:
思路一:爬取车辆详情页
列表页里的每辆车都对应独立的详情页,先把这些详情页链接提取出来,再逐个请求详情页抓取数据:
修改后的完整代码
import headers import requests from bs4 import BeautifulSoup page_num = 1 url = f"https://www.example.com/vehicles/cars?page={page_num}" # 请求列表页 req = requests.get(url, headers=headers.get_headers()).text soup = BeautifulSoup(req, "html.parser") # 提取列表中的车辆行元素 def get_car_rows(soup): return soup.find_all('div', class_="feeditem table") # 从车辆行里提取详情页链接 def get_car_detail_links(rows): detail_links = [] for car in rows: # 找车辆对应的a标签(根据网站实际结构调整,有的可能在特定class里) link_tag = car.find('a', href=True) if link_tag: # 补全相对链接为完整URL full_link = "https://www.example.com" + link_tag['href'] detail_links.append(full_link) return detail_links # 逐个请求详情页,提取所需数据 def fetch_car_details(detail_links): for link in detail_links: try: req = requests.get(link, headers=headers.get_headers()).text soup = BeautifulSoup(req, "html.parser") # 提取里程(根据详情页实际HTML结构调整选择器) kilometrage = soup.find('div', id='accordion_wide_0') kilometrage_text = kilometrage.get_text(strip=True) if kilometrage else "未找到里程数据" print(f"详情页链接:{link}\n里程:{kilometrage_text}\n---") except Exception as e: print(f"请求详情页失败:{link},错误:{str(e)}") # 执行流程 car_rows = get_car_rows(soup) detail_links = get_car_detail_links(car_rows) fetch_car_details(detail_links)
思路二:调用网站的API接口(更高效)
很多网站点击车辆详情时,是通过AJAX请求后端API获取数据,而非跳转页面。这种情况下直接抓API比爬详情页更快:
- 打开浏览器开发者工具的「网络」面板,切换到「XHR/fetch」标签
- 点击一辆车查看详情,观察新出现的请求,找到返回车辆详情的API(一般返回JSON格式)
- 分析API的请求参数(比如车辆ID),从列表页的车辆元素里提取对应参数(比如
data-car-id属性) - 直接拼接API URL,用requests请求获取JSON数据,不用解析HTML
比如列表页车辆元素有data-car-id="12345",API地址可能是https://www.example.com/api/car/detail?id=12345,请求后直接从返回的JSON里取里程、配置等数据。
内容的提问来源于stack exchange,提问作者Ahmad Abdelbaset
相关产品推荐
相关产品推荐

