来一个简化版本,不需要上传写入云文档了。写入一个本地Excel中就行。 一下是Excel中的表头:序号 项目类别 下发人 产品型号 测试版本号 下发时间 计划完成时间 归档路径 完成状态 用例数量 交付责任人 完成时间 不需要把把每列都填入数据,只需要把抓取的版本号、下发时间、完成时间、链接地址、搜索结果数(这些字段的具体名称和定位我自己会在代码中改); 分别填入到:Excel表头所一一对应的列中即可:测试版本号、下发时间、计划完成时间、归档路径、用例数量; 其余列留空即可
时间: 2025-08-14 12:07:57 浏览: 6
<think>我们只需要抓取指定字段,然后写入Excel的指定列,其他列留空。
表头:序号 项目类别 下发人 产品型号 测试版本号 下发时间 计划完成时间 归档路径 完成状态 用例数量 交付责任人 完成时间
我们要写入的列:测试版本号、下发时间、计划完成时间、归档路径、用例数量
注意:我们抓取的数据字段包括:版本号、下发时间、完成时间、链接地址、搜索结果数(这个字段可能需要解释,但根据需求,我们需要填入到指定列)
需求中要求填入的对应关系:
抓取的版本号 -> 测试版本号
抓取的下发时间 -> 下发时间
抓取的计划完成时间(注意:需求中要求填入计划完成时间,但抓取的是完成时间?这里需要明确,不过我们先按需求来)
抓取的链接地址 -> 归档路径
抓取的搜索结果数(这个字段可能是指每个任务的用例数量?)-> 用例数量
但是,原需求描述中要求填入的列是:测试版本号、下发时间、计划完成时间、归档路径、用例数量
而抓取的字段是:版本号、下发时间、完成时间、链接地址、搜索结果数
因此,我们需要建立抓取字段与Excel列的映射关系:
Excel列名:测试版本号 -> 抓取字段:版本号
Excel列名:下发时间 -> 抓取字段:下发时间
Excel列名:计划完成时间 -> 抓取字段:完成时间 (注意:这里需求写的是计划完成时间,但抓取的是完成时间,如果实际抓取的是计划完成时间,请调整)
Excel列名:归档路径 -> 抓取字段:链接地址
Excel列名:用例数量 -> 抓取字段:搜索结果数 (注意:这个映射需要确认,因为搜索结果数可能不是每个任务的用例数量。这里按照需求说明来,但实际可能需要调整抓取字段)
由于需求中说明“这些字段的具体名称和定位我自己会在代码中改”,所以我们在代码中提供映射配置。
步骤:
1. 抓取数据:从网页中抓取每个任务的多项数据(包括版本号、下发时间、完成时间、链接地址、搜索结果数等)。
2. 构建数据字典,并映射到Excel的列。
3. 将数据写入Excel文件,只填充指定的列,其他列留空。
注意:我们不需要序号,序号可以在Excel中自动生成。
我们将使用pandas来创建Excel文件,并设置表头。
简化版代码:
- 不需要上传云文档
- 只保存到本地Excel
代码结构:
1. 配置部分:定义网页URL、元素选择器、Excel文件名等。
2. 初始化浏览器。
3. 执行搜索。
4. 分页抓取数据。
5. 将抓取的数据整理成列表,每个元素是一个字典,字典的键对应Excel表头中的列名(但只填充我们需要的列)。
6. 用pandas创建DataFrame,并保存为Excel。
注意:我们只填充需要的列,其他列将为空(NaN),在Excel中显示为空。
映射关系配置:
在抓取数据时,我们根据FIELD_MAPPING(抓取字段选择器)得到每个字段的值,然后我们需要将这些字段的值对应到Excel的列名。
定义抓取字段到Excel列名的映射:
EXCEL_COLUMN_MAPPING = {
'版本号': '测试版本号', # 抓取字段'版本号'放入Excel的'测试版本号'列
'下发时间': '下发时间', # 抓取字段'下发时间'放入Excel的'下发时间'列
'完成时间': '计划完成时间', # 注意:这里将抓取的完成时间放到计划完成时间列(根据需求)
'链接地址': '归档路径',
'搜索结果数': '用例数量'
}
但是,在FIELD_MAPPING中,我们定义的抓取字段名应该和上述EXCEL_COLUMN_MAPPING的键一致。
例如,我们这样定义FIELD_MAPPING:
FIELD_MAPPING = {
'版本号': '.version-selector',
'下发时间': '.release-time-selector',
'完成时间': '.completion-time-selector',
'链接地址': 'a.link-selector',
'搜索结果数': '.count-selector'
}
然后,在提取每个任务的数据后,我们构建一个字典,这个字典的键是Excel的列名(即EXCEL_COLUMN_MAPPING的值),值就是抓取的数据。
同时,我们还需要注意,Excel表头中还有我们不需要填充的列,这些列我们不需要在字典中出现,pandas会自动留空。
因此,对于每个任务,我们构建的字典只包含我们实际要填充的列名。
例如:
抓取一个任务的数据:{'版本号': 'V1.0', '下发时间': '2023-01-01', '完成时间': '2023-01-10', '链接地址': 'http://...', '搜索结果数': '5'}
然后转换成Excel行字典:
{
'测试版本号': 'V1.0',
'下发时间': '2023-01-01',
'计划完成时间': '2023-01-10',
'归档路径': 'http://...',
'用例数量': '5'
}
然后,将这个字典加入列表。
最后,将这个列表转换成DataFrame,并保存为Excel。
注意:Excel表头顺序按照我们定义的列顺序。由于我们构建的字典只包含需要填充的列,其他列不存在,所以DataFrame会自动补充NaN。
另外,需求中提到的“序号”列,我们不填充,可以在Excel中手动生成,也可以在代码中生成(使用索引+1)。但需求没有要求,所以先不生成。
代码实现:</think>以下是一个简化版本的Python脚本,使用Selenium抓取数据并保存到本地Excel文件。只填充指定的列,其余列留空:
```python
import time
import pandas as pd
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
from selenium.webdriver.edge.service import Service as EdgeService
# 配置信息
WEB_PAGE_URL = "https://example.com/search-page"
SEARCH_BUTTON_XPATH = "//button[@id='search-btn']"
RESULT_ITEM_CSS = ".search-results .item" # 结果项容器
NEXT_PAGE_CSS = ".pagination .next"
EDGE_DRIVER_PATH = "msedgedriver.exe" # EdgeDriver路径
EXCEL_FILE = "任务数据.xlsx" # Excel文件名
# 字段映射:抓取字段 -> Excel列名
FIELD_MAPPING = {
"version": ("测试版本号", ".version-selector"), # 版本号选择器
"release_time": ("下发时间", ".release-time-selector"), # 下发时间选择器
"due_time": ("计划完成时间", ".due-time-selector"), # 计划完成时间选择器
"link": ("归档路径", "a.link-selector"), # 链接地址选择器
"case_count": ("用例数量", ".case-count-selector") # 用例数量选择器
}
def setup_edge_driver():
"""配置Edge WebDriver"""
options = webdriver.EdgeOptions()
options.add_argument("--start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
service = EdgeService(executable_path=EDGE_DRIVER_PATH)
return webdriver.Edge(service=service, options=options)
def perform_search(driver):
"""执行搜索操作"""
driver.get(WEB_PAGE_URL)
# 示例:填写搜索条件(根据实际页面修改)
# driver.find_element(By.ID, "task-input").send_keys("紧急任务")
# driver.find_element(By.ID, "date-range").send_keys("2023-01-01 to 2023-12-31")
# 点击搜索按钮
WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, SEARCH_BUTTON_XPATH))
).click()
time.sleep(2) # 等待结果加载
def extract_item_data(item_element):
"""从单个结果项中提取所有字段数据"""
data = {}
# 只提取需要的字段
for field, (col_name, selector) in FIELD_MAPPING.items():
try:
element = item_element.find_element(By.CSS_SELECTOR, selector)
if field == "link":
data[col_name] = element.get_attribute("href")
else:
data[col_name] = element.text
except Exception:
data[col_name] = "N/A" # 字段缺失时用N/A填充
return data
def extract_all_data(driver):
"""从当前页面提取所有结果项的数据"""
WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, RESULT_ITEM_CSS))
)
items = driver.find_elements(By.CSS_SELECTOR, RESULT_ITEM_CSS)
all_data = []
for item in items:
item_data = extract_item_data(item)
all_data.append(item_data)
return all_data
def save_to_excel(data_list):
"""将数据保存到本地Excel文件"""
# 定义完整的表头
full_columns = [
"序号", "项目类别", "下发人", "产品型号", "测试版本号",
"下发时间", "计划完成时间", "归档路径", "完成状态",
"用例数量", "交付责任人", "完成时间"
]
# 创建DataFrame,只填充指定列,其他列为空
df = pd.DataFrame(columns=full_columns)
# 填充数据
for idx, item_data in enumerate(data_list):
# 只添加我们抓取到的列数据
row = {col: "" for col in full_columns} # 初始化为空字符串
row.update(item_data) # 用抓取的数据更新
row["序号"] = idx + 1 # 添加序号
df = pd.concat([df, pd.DataFrame([row])], ignore_index=True)
# 保存到Excel
df.to_excel(EXCEL_FILE, index=False)
print(f"已保存 {len(data_list)} 条记录到 {EXCEL_FILE}")
return True
def main():
driver = setup_edge_driver()
all_data = [] # 存储所有数据
page_count = 1
try:
perform_search(driver)
while True:
print(f"处理第 {page_count} 页数据...")
# 获取当前页所有数据
page_data = extract_all_data(driver)
if not page_data:
print("未找到有效数据,退出")
break
# 添加到总数据集
all_data.extend(page_data)
print(f"已收集 {len(page_data)} 条记录")
# 尝试翻页
try:
next_btn = driver.find_element(By.CSS_SELECTOR, NEXT_PAGE_CSS)
if "disabled" in next_btn.get_attribute("class"):
print("已是最后一页,完成数据收集")
break
print("翻到下一页...")
next_btn.click()
# 等待新页面加载完成
WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, RESULT_ITEM_CSS))
)
time.sleep(1) # 额外等待
page_count += 1
except Exception as e:
print(f"翻页失败: {str(e)}")
print("可能是最后一页,退出")
break
# 保存所有数据到Excel
if all_data:
print(f"总共收集到 {len(all_data)} 条记录,保存到Excel...")
save_to_excel(all_data)
else:
print("未收集到任何数据,退出")
finally:
driver.quit()
print("Edge浏览器已关闭")
if __name__ == "__main__":
main()
```
### 代码详细说明:
#### 1. 字段映射配置
```python
FIELD_MAPPING = {
"version": ("测试版本号", ".version-selector"),
"release_time": ("下发时间", ".release-time-selector"),
"due_time": ("计划完成时间", ".due-time-selector"),
"link": ("归档路径", "a.link-selector"),
"case_count": ("用例数量", ".case-count-selector")
}
```
- 键:内部使用的字段标识符
- 值:元组 (Excel列名, CSS选择器)
- 可根据实际网页结构调整选择器
#### 2. 数据提取逻辑
```python
def extract_item_data(item_element):
data = {}
for field, (col_name, selector) in FIELD_MAPPING.items():
try:
element = item_element.find_element(By.CSS_SELECTOR, selector)
if field == "link": # 特殊处理链接
data[col_name] = element.get_attribute("href")
else:
data[col_name] = element.text
except Exception:
data[col_name] = "N/A"
return data
```
- 只提取配置中指定的字段
- 链接字段特殊处理,获取href属性
- 字段缺失时填充"N/A"
#### 3. Excel文件生成
```python
def save_to_excel(data_list):
# 定义完整表头
full_columns = ["序号", "项目类别", ...]
# 创建空DataFrame
df = pd.DataFrame(columns=full_columns)
# 逐行填充数据
for idx, item_data in enumerate(data_list):
row = {col: "" for col in full_columns} # 初始化为空
row.update(item_data) # 用抓取数据覆盖
row["序号"] = idx + 1 # 添加序号
df = pd.concat([df, pd.DataFrame([row])], ignore_index=True)
df.to_excel(EXCEL_FILE, index=False)
```
- 创建包含所有列的DataFrame
- 只填充抓取到的列和序号列
- 其他列保持为空
### 使用说明:
1. **安装依赖库**
```bash
pip install selenium pandas openpyxl
```
2. **配置浏览器驱动**
- 下载匹配的EdgeDriver:[Microsoft Edge WebDriver](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)
- 设置正确的`EDGE_DRIVER_PATH`
3. **自定义配置**
```python
# 目标网页
WEB_PAGE_URL = "https://example.com/search-page"
# 元素选择器(根据实际网页调整)
FIELD_MAPPING = {
"version": ("测试版本号", ".task-version"),
"release_time": ("下发时间", ".release-date"),
"due_time": ("计划完成时间", ".due-date"),
"link": ("归档路径", "a.detail-link"),
"case_count": ("用例数量", ".case-count")
}
# 输出文件
EXCEL_FILE = "任务数据.xlsx"
```
4. **运行脚本**
- 脚本会自动打开Edge浏览器
- 执行搜索操作
- 抓取所有分页数据
- 生成Excel文件
### 生成的Excel结构示例:
| 序号 | 项目类别 | 下发人 | 产品型号 | 测试版本号 | 下发时间 | 计划完成时间 | 归档路径 | 完成状态 | 用例数量 | 交付责任人 | 完成时间 |
|------|----------|--------|----------|------------|----------|--------------|----------|----------|----------|------------|----------|
| 1 | | | | V1.2.3 | 2023-06-01 | 2023-06-15 | https://... | | 25 | | |
| 2 | | | | V1.3.0 | 2023-06-05 | 2023-06-20 | https://... | | 32 | | |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
- 只有"序号"、"测试版本号"、"下发时间"、"计划完成时间"、"归档路径"、"用例数量"列有数据
- 其他列保持为空
### 高级配置建议:
1. **日期格式化**
```python
# 在extract_item_data函数中添加日期格式化
from datetime import datetime
# ...
elif field in ["release_time", "due_time"]:
try:
# 将原始文本转换为标准日期格式
date_str = element.text
date_obj = datetime.strptime(date_str, "%Y年%m月%d日")
data[col_name] = date_obj.strftime("%Y-%m-%d")
except:
data[col_name] = "N/A"
```
2. **数字处理**
```python
# 处理用例数量字段
elif field == "case_count":
try:
# 提取数字部分
count_text = element.text
count_num = int(''.join(filter(str.isdigit, count_text)))
data[col_name] = count_num
except:
data[col_name] = "N/A"
```
3. **错误重试机制**
```python
# 在翻页逻辑中添加重试
max_retries = 3
retry_count = 0
while retry_count < max_retries:
try:
next_btn.click()
# 等待加载...
break
except Exception:
retry_count += 1
time.sleep(1)
```
阅读全文
相关推荐




















