实战教程:基于Selenium+BeautifulSoup爬取易车网新能源汽车销量数据

python 复制代码
def example_function(input_param):
    """
    示例函数说明
    
    参数:
        input_param: 输入参数说明
        
    返回:
        返回值说明
    """
    # 实现逻辑
    result = input_param * 2
    return result

# 调用示例
if __name__ == "__main__":
    input_value = 10
    output = example_function(input_value)
    print(f"输入: {input_value}, 输出: {output}")
 
 ```在数据驱动的时代,爬取汽车行业的销量数据能够为市场分析、竞品调研提供重要支撑。本文将详细讲解如何使用Selenium结合BeautifulSoup爬取易车网新能源汽车销量排名数据,并将数据保存为CSV文件,全程附带完整代码与核心思路解析。

## 一、技术栈选择与核心思路
### 1. 技术栈说明
- **Selenium**:一款自动化测试工具,能够模拟浏览器的操作(如点击、翻页),解决动态网页数据加载的问题。本文中用于访问目标页面、点击"下一页"按钮加载更多数据。
- **BeautifulSoup**:Python的HTML解析库,擅长从网页源代码中提取结构化数据,搭配正则表达式可高效定位目标信息。
- **csv模块**:Python内置模块,用于将爬取的数据写入CSV文件,方便后续分析与使用。

### 2. 核心思路
1. 配置Selenium浏览器环境,访问易车网销量排名页面;
2. 模拟点击"下一页"按钮,加载更多数据(本文示例为1次翻页,可按需扩展);
3. 使用BeautifulSoup解析网页源代码,结合正则表达式提取汽车排名、型号、售价、销量、历史销量链接;
4. 将提取的数据整理后写入CSV文件;
5. 关闭浏览器,释放资源。

## 二、完整代码实现与逐行解析
### 1. 完整代码
```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup as bs
import re
import csv

# 定义一个函数,该函数等待直到页面上出现n个特定CSS选择器所指定的元素
def wait_for_nth_element(n, css_selector):
    def condition(driver):
        elements = driver.find_elements(By.CSS_SELECTOR, css_selector)
        print(len(elements))  # 打印当前已加载的元素数量
        return elements if len(elements) >= n else False  # 如果达到期望的数量则返回,否则返回False
    return condition

# 定义一个函数,解析并获取网页上的新能源汽车销售数据
def get_newdata_source_page(data_list, source_page, count):
    bs_html = bs(source_page)  # 使用BeautifulSoup解析网页源代码
    content_list = bs_html.find_all('div', attrs={'class': 'rk-item ka'})  # 找到包含销售数据的div元素

    # 遍历每一个包含销售数据的div元素
    for row in content_list:
        count += 1  # 计数器,用于记录当前处理的是第几辆车
        rank = count  # 排名根据计数器得到
        # 提取汽车型号
        car_type = re.findall('<div class="rk-car-name">(.*?)</div>', str(row), re.S)[0].strip()
        # 提取售价
        price = re.findall('<div class="rk-car-price">(.*?)</div>', str(row), re.S)[0].strip()
        # 提取销量
        car_num = re.findall('<span class="rk-car-num">(.*?)</span>', str(row), re.S)[0].strip()
        # 提取历史销量的链接
        salary = re.findall('href="(.*?)" target', str(row), re.S)
        # 完善历史销量的链接
        lishixiaoliang = 'https://car.yiche.com' + salary[-2]
        # 将数据添加到列表中
        data_list.append([rank, car_type, price, car_num, lishixiaoliang])

    return data_list, count

# 配置Selenium
driver = webdriver.Chrome()
driver.maximize_window()
driver.set_page_load_timeout(1200)
# 访问易车网销量排名页面
driver.get("https://car.yiche.com/newcar/salesrank/")

data_list = []  # 用于存储爬取的数据

# 循环点击"下一页",加载更多数据
for i in range(1):
    div = driver.find_element(By.CSS_SELECTOR, 'a.next')
    div.click()
    data_list, count = get_newdata_source_page(data_list, driver.page_source, i * 10)  # 获取当前页面的数据
    print(f"第【{i + 1}】次点击翻页按钮成功!")

# 将爬取的数据保存到CSV文件中
fp_newcar = open(r'易车网数据.csv', 'w', encoding='utf-8', newline='')
writer_newcar = csv.writer(fp_newcar)
writer_newcar.writerow(['排名', '汽车型号', '售价', '销量', '历史销量'])  # 写入表头
writer_newcar.writerows(data_list)  # 写入数据

# 关闭Selenium的浏览器窗口
driver.quit()

2. 关键代码解析

(1)等待元素加载函数(wait_for_nth_element)

该函数是一个高阶函数,返回一个判断条件:当页面中匹配指定CSS选择器的元素数量达到n个时,返回元素列表,否则返回False。可用于解决页面加载延迟导致的元素定位失败问题(本文示例未直接调用,可根据实际场景扩展)。

(2)数据解析函数(get_newdata_source_page)
  • 入参:data_list(存储数据的列表)、source_page(网页源代码)、count(数据计数器);
  • 核心步骤:
    1. 使用bs(source_page)解析网页源代码;
    2. 通过find_all('div', attrs={'class': 'rk-item ka'})定位包含销量数据的核心标签;
    3. 遍历每个数据标签,使用正则表达式re.findall提取汽车型号、售价、销量、历史销量链接等信息;
    4. 完善历史销量链接(补充域名),并将数据追加到data_list中;
    5. 返回更新后的data_list和计数器count
(3)Selenium浏览器配置与翻页逻辑
  • webdriver.Chrome():初始化Chrome浏览器驱动(需提前配置ChromeDriver环境);
  • driver.maximize_window():最大化浏览器窗口,避免元素因窗口大小问题无法定位;
  • driver.set_page_load_timeout(1200):设置页面加载超时时间(单位:秒),防止页面加载卡住;
  • 翻页循环:for i in range(1)表示仅点击1次"下一页",可修改数值实现多页爬取;通过driver.find_element(By.CSS_SELECTOR, 'a.next')定位"下一页"按钮并点击。
(4)数据保存
  • 打开CSV文件(指定编码为utf-8newline=''避免行尾出现空行);
  • 使用csv.writer写入表头和数据,writerow写入单行(表头),writerows批量写入多行(数据)。

三、注意事项与优化方向

1. 注意事项

  • ChromeDriver配置:需保证ChromeDriver版本与本地Chrome浏览器版本一致,否则会导致驱动初始化失败;
  • 反爬机制应对 :频繁爬取可能触发网站反爬,建议添加time.sleep()设置间隔,或使用代理IP;
  • 正则表达式容错 :当前代码中re.findall结果直接取[0],若标签结构变化可能导致索引越界,建议添加异常处理(如try-except);
  • 元素定位稳定性 :CSS选择器(如a.next)可能随网站改版变化,需定期检查调整。

2. 优化方向

  • 添加显式等待 :结合WebDriverWaitwait_for_nth_element函数,实现智能等待元素加载,替代固定延时;
  • 多页爬取扩展 :将翻页循环的range(1)改为动态判断(如判断"下一页"按钮是否存在),实现自动爬取所有页面;
  • 数据去重与清洗:爬取完成后对数据进行去重、格式标准化(如售价统一单位);
  • 日志记录 :添加日志模块(如logging),记录爬取过程中的关键信息,方便排查问题;
  • 封装成类:将爬取逻辑封装为类,提高代码复用性(如支持爬取不同分类的汽车数据)。

四、总结

本文通过Selenium解决动态网页的翻页加载问题,结合BeautifulSoup与正则表达式完成数据提取,最终将数据保存为CSV文件,完整实现了易车网新能源汽车销量数据的爬取。该思路可迁移到其他动态网页的数据爬取场景,如电商平台商品数据、资讯网站内容数据等。

相关推荐
sheepfagdng2 小时前
Python-web自动化-selenium(2)
运维·selenium·自动化
虚幻如影5 小时前
Selenium 自动化测试中 Chrome 浏览器弹出“您的连接不是私密连接”
chrome·selenium·测试工具
sheepfagdng15 小时前
python-web自动化-selenium(1)
selenium·测试工具
武汉禹力自动化科技1 天前
Carlo Gavazzi Dupline 测试工具 GTU8 深度解析:现场总线调试与诊断的核心利器
测试工具·佳乐现场总线·gtu8
qq_427940341 天前
java-UI自动化selenium+TestNG
java·selenium·自动化
程序员小远1 天前
单元测试知识详解
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
半个俗人1 天前
2.postman断言
测试工具·postman
Wpa.wk1 天前
自动化测试 - Playwrigh简单介绍+基础使用
经验分享·测试工具·playwright