Python网页抓取问题:CarDekho车型对比数据无法精准获取
解决CarDekho车型对比数据抓取的URL精准性问题
看起来你遇到的核心问题是没有获取到对应选定四款车型的正确对比URL,导致请求返回的不是你要的目标数据。我来帮你拆解问题并给出具体的解决办法:
问题根源
CarDekho的多车型对比页面并非简单通过静态URL拼接生成,当你在下拉菜单选择多款车型时,网站可能会通过动态请求(比如AJAX)生成专属的对比页面URL,或者会话状态会影响返回内容。你之前用的是两款车型的固定URL,直接复用或修改的话,自然无法匹配你选定的四款车型数据。
具体解决步骤
1. 获取精准的多车型对比URL
- 手动复制法:直接在浏览器中完成四款车型及变体的选择,等页面加载完成后,复制地址栏里的完整URL。这个URL就是对应你选定车型的专属对比链接,把它替换到代码中的
url变量即可。 - 开发者工具抓包法:如果需要自动化生成URL,打开浏览器F12进入「Network」标签,在你选择车型的过程中,观察名为类似
compare的请求(通常是POST或GET),查看它的请求参数和返回的URL,后续可以通过构造相同的请求来获取正确的对比页面。
2. 处理动态加载的内容(如果需要)
如果发现用requests.get获取的页面源码和浏览器中看到的不一致(说明数据是JS动态渲染的),建议改用Selenium模拟浏览器操作,确保能拿到完整的渲染后页面:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import csv def job(): # 初始化Chrome浏览器(需提前下载对应版本的chromedriver) driver = webdriver.Chrome() # 直接使用手动复制的精准四款车型对比URL driver.get("你复制的四款车型对比完整URL") # 等待页面核心表格加载完成 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "table"))) page_source = driver.page_source driver.quit() soup = BeautifulSoup(page_source, 'html.parser') stat_tables = soup.find_all('table') # 用with语句管理文件流,自动处理关闭操作 csv_paths = [ "D:/CarDekho_Data/maruti/maruti_2/overview.csv", "D:/CarDekho_Data/maruti/maruti_2/engine.csv", "D:/CarDekho_Data/maruti/maruti_2/transmission.csv", "D:/CarDekho_Data/maruti/maruti_2/steering.csv", "D:/CarDekho_Data/maruti/maruti_2/brake_system.csv" ] # 循环处理表格,避免硬编码索引 for idx, table in enumerate(stat_tables[:5]): with open(csv_paths[idx], 'wt', encoding="utf-8", newline='') as csv_file: writer = csv.writer(csv_file) for row in table.find_all('tr'): # 去除文本多余空格和换行,让CSV数据更整洁 csv_row = [cell.get_text(strip=True) for cell in row.find_all(['td', 'th'])] writer.writerow(csv_row)
3. 优化现有代码的健壮性
- 避免硬编码
stat_table_1[0]到[4],改用循环处理,防止页面表格数量变化导致索引报错。 - 使用
with语句管理文件流,自动处理关闭操作,比手动close()更安全可靠。 - 添加
strip=True到get_text()中,去除文本中的多余空格和换行,提升CSV数据的整洁度。
最后提醒
注意网站的robots协议和反爬机制,不要频繁发送请求,建议添加请求间隔时间(比如time.sleep(2)),避免被封禁IP。
内容的提问来源于stack exchange,提问作者Shravan Kumar
相关产品推荐
相关产品推荐

