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(数据计数器); - 核心步骤:
- 使用
bs(source_page)解析网页源代码; - 通过
find_all('div', attrs={'class': 'rk-item ka'})定位包含销量数据的核心标签; - 遍历每个数据标签,使用正则表达式
re.findall提取汽车型号、售价、销量、历史销量链接等信息; - 完善历史销量链接(补充域名),并将数据追加到
data_list中; - 返回更新后的
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-8,newline=''避免行尾出现空行); - 使用
csv.writer写入表头和数据,writerow写入单行(表头),writerows批量写入多行(数据)。
三、注意事项与优化方向
1. 注意事项
- ChromeDriver配置:需保证ChromeDriver版本与本地Chrome浏览器版本一致,否则会导致驱动初始化失败;
- 反爬机制应对 :频繁爬取可能触发网站反爬,建议添加
time.sleep()设置间隔,或使用代理IP; - 正则表达式容错 :当前代码中
re.findall结果直接取[0],若标签结构变化可能导致索引越界,建议添加异常处理(如try-except); - 元素定位稳定性 :CSS选择器(如
a.next)可能随网站改版变化,需定期检查调整。
2. 优化方向
- 添加显式等待 :结合
WebDriverWait和wait_for_nth_element函数,实现智能等待元素加载,替代固定延时; - 多页爬取扩展 :将翻页循环的
range(1)改为动态判断(如判断"下一页"按钮是否存在),实现自动爬取所有页面; - 数据去重与清洗:爬取完成后对数据进行去重、格式标准化(如售价统一单位);
- 日志记录 :添加日志模块(如
logging),记录爬取过程中的关键信息,方便排查问题; - 封装成类:将爬取逻辑封装为类,提高代码复用性(如支持爬取不同分类的汽车数据)。
四、总结
本文通过Selenium解决动态网页的翻页加载问题,结合BeautifulSoup与正则表达式完成数据提取,最终将数据保存为CSV文件,完整实现了易车网新能源汽车销量数据的爬取。该思路可迁移到其他动态网页的数据爬取场景,如电商平台商品数据、资讯网站内容数据等。