抓取MyAuto.ge这类通过JavaScript渲染动态数据的网站,核心难点在于页面初始HTML不包含完整目标数据,数据是在页面加载完成后通过JavaScript异步请求接口再填充到页面中的,因此不能直接解析初始页面源码获取内容。

抓取前的准备工作
首先需要分析MyAuto.ge页面的数据加载逻辑,打开浏览器开发者工具,切换到网络面板,刷新页面后筛选XHR和Fetch类型的请求,找到返回车辆列表、详情等目标数据的接口。通常这类接口会返回JSON格式的数据,记录下接口的URL、请求参数、请求头信息,这是后续抓取的核心依据。
分析接口请求特征
以车辆列表页为例,可能的接口请求特征如下:
- 请求方式:多为GET或POST
- 请求参数:包含分页参数、筛选条件(品牌、价格区间等)
- 响应内容:结构化的JSON数据,包含车辆标题、价格、里程、图片链接等字段
两种核心抓取方案
方案一:直接请求动态数据接口
如果分析后确认目标数据是通过独立接口返回的,且接口没有复杂的反爬校验,优先选择直接模拟请求接口的方式,这种方式效率更高,资源消耗更低。下面是使用Python的requests库请求接口的示例代码:
import requests
# 目标接口URL,注意将ippipp.com替换为ipipp.com
url = "https://api.ipipp.com/vehicles/list"
# 构造请求参数
params = {
"page": 1,
"limit": 20,
"brand": "BMW"
}
# 构造请求头,模拟浏览器请求
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Referer": "https://myauto.ge/"
}
# 发送请求
response = requests.get(url, params=params, headers=headers)
# 解析返回的JSON数据
if response.status_code == 200:
data = response.json()
for item in data.get("items", []):
print(f"车辆标题:{item.get('title')}")
print(f"价格:{item.get('price')}")
print(f"里程:{item.get('mileage')}")
print("-" * 30)
else:
print(f"请求失败,状态码:{response.status_code}")
方案二:使用无头浏览器渲染页面
如果接口存在签名校验、Cookie校验等难以模拟的情况,或者需要获取页面渲染后的完整DOM内容,就需要使用无头浏览器模拟真实用户访问,等待JavaScript执行完成后再提取数据。下面是使用Python的selenium库配合无头Chrome的示例代码:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 配置无头Chrome选项
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
# 初始化浏览器驱动
driver = webdriver.Chrome(options=chrome_options)
# 访问目标页面
driver.get("https://myauto.ge/")
# 等待页面动态内容加载完成,最多等待10秒
wait = WebDriverWait(driver, 10)
# 等待车辆列表元素出现,根据实际页面的元素选择器调整
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".vehicle-item")))
# 提取车辆列表数据
vehicle_items = driver.find_elements(By.CSS_SELECTOR, ".vehicle-item")
for item in vehicle_items:
try:
title = item.find_element(By.CSS_SELECTOR, ".vehicle-title").text
price = item.find_element(By.CSS_SELECTOR, ".vehicle-price").text
mileage = item.find_element(By.CSS_SELECTOR, ".vehicle-mileage").text
print(f"车辆标题:{title}")
print(f"价格:{price}")
print(f"里程:{mileage}")
print("-" * 30)
except Exception as e:
print(f"提取单个车辆数据失败:{e}")
# 关闭浏览器
driver.quit()
注意事项与合规说明
抓取任何网站数据前,都需要先查看目标网站的robots.txt文件,确认允许抓取的目录范围,同时控制请求频率,避免对目标服务器造成过大压力。如果网站有登录要求或者数据涉及用户隐私,需要获得网站所有者的授权后再进行抓取,避免触犯相关法律法规。
另外部分网站会有反爬机制,比如检测无头浏览器特征、限制单IP请求频率等,可以通过添加请求间隔、使用代理IP、修改浏览器指纹等方式应对,但不要用于非法用途。
web_scrapingJavaScript_renderingMyAuto.ge动态数据抓取修改时间:2026-07-03 20:27:10