网站首页 > 基础教程 正文
在用python代码测试一个抓取12306班次信息时用豆包生成测试的代码,大体上可以运行解析到数据,后面想做一下升级让他解所有的座位信息。经过多轮的调整解析的数据还是错乱的,后来把豆包生成的代码让DeepSeek来修改下,DeepSeek一下找到症结所在,并给出了调整后的代码,其实调整的代码并不多,果然DeepSeek在思维推理在一些方面果然有一些优势。
DeepSeek排查到引起问题的原因:
不过豆包的大模型也不啦,把deepseek的代码给他后,他也反应过来了哈哈
下面来看看他们两代码有什么差异。
豆包生成的:
def _parse_ticket_data(self):
"""高精度解析余票数据,修正座位索引映射"""
try:
table = self._safe_find(By.ID, 'queryLeftTable')
if not table:
return []
trains = []
for row in self._safe_find(
By.CSS_SELECTOR,
"#queryLeftTable tbody tr[id^='ticket_']",
multiple=True
):
try:
# 提取车次信息
train_info = row.find_element(By.CSS_SELECTOR, '.train-no')
train_number = train_info.text.strip()
# 提取车站信息
stations = row.find_elements(By.CSS_SELECTOR, '.cdz strong')
departure_station = stations[0].text if len(stations) > 0 else "未知"
arrival_station = stations[1].text if len(stations) > 1 else "未知"
# 提取时间信息
times = row.find_elements(By.CSS_SELECTOR, '.cds strong')
departure_time = times[0].text if len(times) > 0 else "未知"
arrival_time = times[1].text if len(times) > 1 else "未知"
# 提取历时信息
duration = row.find_element(By.CSS_SELECTOR, '.ls strong').text.strip()
# 跳过前4个非座位TD,从第5个开始解析座位
seats = row.find_elements(By.CSS_SELECTOR, 'td[width="46"], td[width="80"]')[4:]
# 定义座位类型和映射关系
seat_types = [
'商务座', '优选一等', '一等座', '二等座', '高级软卧',
'软卧', '硬卧', '软座', '硬座', '无座', '其他'
]
seat_info = {st: '--' for st in seat_types}
# 动态映射座位索引(根据实际数据调整)
seat_mapping = {
0: '商务座', # 对应HTML中的特等座/商务座
1: '优选一等', # 对应HTML中的优选一等座
2: '一等座', # 对应HTML中的一等座
3: '二等座', # 对应HTML中的二等座
4: '高级软卧', # 对应HTML中的高级软卧
5: '软卧', # 对应HTML中的软卧
6: '硬卧', # 对应HTML中的硬卧
7: '软座', # 对应HTML中的软座
8: '硬座', # 对应HTML中的硬座
9: '无座', # 对应HTML中的无座
10: '其他', # 对应HTML中的其他座位类型
}
# 解析座位信息
for idx, seat_td in enumerate(seats):
if idx >= len(seat_mapping): # 防止越界
break
seat_type = seat_mapping[idx]
status = seat_td.text.strip() or '--'
seat_info[seat_type] = status
# 查找预订按钮
book_button = None
strategies = [
(By.CSS_SELECTOR, 'td.no-br a.btn72'),
(By.XPATH, './/td[contains(text(), "预订")]'),
(By.CSS_SELECTOR, 'td.no-br[onclick*="book"]'),
]
for by, value in strategies:
try:
book_button = row.find_element(by, value)
break
except NoSuchElementException:
continue
# 组装车次数据
train_data = {
'车次': train_number,
'出发站': departure_station,
'到达站': arrival_station,
'出发时间': departure_time,
'到达时间': arrival_time,
'历时': duration,
**seat_info,
'book_button': book_button,
}
logging.info(f"成功解析车次 {train_number}: 软卧={seat_info['软卧']}, 硬卧={seat_info['硬卧']}")
trains.append(train_data)
except Exception as e:
logging.error(f"解析车次数据失败: {str(e)}")
continue
return trains
except Exception as e:
logging.error(f"解析余票数据异常: {str(e)}")
return []
DeepSeek生成的:
def _parse_ticket_data(self):
"""高精度解析余票数据"""
try:
table = self._safe_find(By.ID, 't-list')
if not table:
return []
trains = []
for row in self._safe_find(
By.CSS_SELECTOR,
"#t-list tbody tr[id^='ticket_']",
multiple=True
):
try:
# 提取车次信息(保持不变)
train_info = row.find_element(By.CSS_SELECTOR, '.ticket-info')
train_number = train_info.find_element(By.CSS_SELECTOR, '.number').text
# 提取车站信息(保持不变)
stations = train_info.find_elements(By.CSS_SELECTOR, '.cdz strong')
departure_station = stations[0].text if len(stations) > 0 else "未知"
arrival_station = stations[1].text if len(stations) > 1 else "未知"
# 提取时间信息(保持不变)
times = train_info.find_elements(By.CSS_SELECTOR, '.cds strong')
departure_time = times[0].text if len(times) > 0 else "未知"
arrival_time = times[1].text if len(times) > 1 else "未知"
# 提取历时信息(保持不变)
duration = train_info.find_element(By.CSS_SELECTOR, '.ls strong').text.strip()
# ------------------- 修改的座位解析部分 -------------------
# 仅选择宽度为46的座位列(排除最后80宽度的备注列)
seats = row.find_elements(By.CSS_SELECTOR, 'td[width="46"]')
logging.info(f"解析车次 {train_number} 的座位信息,共{len(seats)}个座位类型")
# 定义座位类型顺序(与HTML结构严格对应)
seat_types = [
'商务座', '优选一等', '一等座', '二等座', '高级软卧',
'软卧', '硬卧', '软座', '硬座', '无座', '其他'
]
# 初始化座位信息字典
seat_info = {st: '--' for st in seat_types}
# 按顺序填充座位余票信息
for idx, seat_td in enumerate(seats):
if idx < len(seat_types):
seat_type = seat_types[idx]
status = seat_td.text.strip() or '--' # 处理空值
seat_info[seat_type] = status
else:
break # 防止索引超出预定义类型范围
# ------------------- 以下保持不变 -------------------
# 查找预订按钮(保持不变)
book_button = None
strategies = [
(By.CSS_SELECTOR, 'td.no-br a.btn72'),
(By.XPATH, './/td[contains(text(), "预订")]'),
(By.CSS_SELECTOR, 'td.no-br[onclick*="book"]'),
]
for by, value in strategies:
try:
book_button = row.find_element(by, value)
break
except NoSuchElementException:
continue
# 组装车次数据(保持不变)
train_data = {
'车次': train_number,
'出发站': departure_station,
'到达站': arrival_station,
'出发时间': departure_time,
'到达时间': arrival_time,
'历时': duration,
**seat_info,
'book_button': book_button,
}
logging.info(f"成功解析车次 {train_number}: 商务座={seat_info['商务座']}, 无座={seat_info['无座']}")
trains.append(train_data)
except Exception as e:
logging.error(f"解析车次数据失败: {str(e)}")
continue
return trains
except Exception as e:
logging.error(f"解析余票数据异常: {str(e)}")
return []
猜你喜欢
- 2025-06-10 “吃”走肌少症("吃"走肌少症怎么办)
- 2025-06-10 使用python3爬取网页,aria2下载最新电影,Jellyfin播放电影
- 2025-06-10 「数据分析」2种常见的反爬虫策略,信息验证和动态反爬虫
- 2025-06-10 庆祝中华人民共和国成立70周年联欢活动在京举行(八)
- 2025-06-10 Python学不会来打我(48)正则表达式爬取网易云音乐
- 2025-06-10 防脱洗发水是个伪命题?8979条数据告诉你答案
- 2025-06-10 『React』Fragment的用法及简写形式
- 2024-07-26 2021年最全的Python爬虫学习笔记(下)
- 2024-07-26 HTML DOM Table 对象(html中的对象)
- 2024-07-26 你可能不重视的一些好用技能(这些技能希望你永远用不到,但一定要知道!)
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- deletesql (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)