This commit is contained in:
HuangHai
2026-01-15 10:14:44 +08:00
parent ccac3e889c
commit 23dfa433b0
6 changed files with 96 additions and 58 deletions

View File

@@ -234,6 +234,7 @@ class TeLaiDianCrawler(BaseCrawler):
# 爬取详情
await self.crawl_detail_logic(d, station)
if os.path.exists(detail_check_path): os.remove(detail_check_path)
# 标记为已处理
await self.redis_kit.set_data(redis_key, "1", expire=REDIS_STATION_EXPIRE)
@@ -272,6 +273,7 @@ class TeLaiDianCrawler(BaseCrawler):
first_screen_path = take_screenshot(d, f"tld_detail_basic_{int(time.time())}.jpg")
station_name = station_info.get("name")
address = station_info.get("address")
distance = station_info.get("distance")
total_piles = None
free_piles = None
piles_detail = None
@@ -314,22 +316,22 @@ class TeLaiDianCrawler(BaseCrawler):
await asyncio.sleep(WAIT_DETAIL_PAGE_LOAD)
# --- [优化] 小步快跑滚动查找逻辑 ---
# 目标:通过多次小幅度滚动 + OCR 实时探测,精准捕获“全部时段”入口,避免滑过头
# 目标:通过多次小幅度滚动 + OCR 实时探测,精准捕获价格入口(“全部时段”或“全天价格统一”),避免滑过头
max_scroll_attempts = 6 # 最大滚动尝试次数
scroll_step_ratio = 0.3 # 每次滚动的步长(屏幕高度的 30%)
found_entry = None
logger.info(f"[详情页] 开始“小步快跑”滚动查找‘全部时段’入口 (最多 {max_scroll_attempts} 次)...")
logger.info(f"[详情页] 开始“小步快跑”滚动查找价格入口 (全部时段/全天价格统一) (最多 {max_scroll_attempts} 次)...")
for i in range(max_scroll_attempts):
# 1. 截图识别当前屏
curr_screen = take_screenshot(d, f"tld_scroll_ocr_{i}_{int(time.time())}.jpg")
# 2. 尝试 OCR 识别“全部时段”
# 2. 尝试 OCR 识别价格入口
entry_data = await self.read_image_kit.find_price_entrance_ocr(curr_screen)
if entry_data.get("found"):
logger.info(f"[详情页] 第 {i+1} 次尝试:成功探测到‘全部时段’入口!")
logger.info(f"[详情页] 第 {i+1} 次尝试:成功探测到价格入口!")
found_entry = {
"screen": curr_screen,
"point": entry_data["point"]
@@ -353,7 +355,7 @@ class TeLaiDianCrawler(BaseCrawler):
price_tab_screen = found_entry["screen"]
p = found_entry["point"]
# 2. 点击“全部时段”入口
# 2. 点击价格入口
entry_x = int(p[0] * w / 1000)
entry_y = int(p[1] * h / 1000)
@@ -376,7 +378,7 @@ class TeLaiDianCrawler(BaseCrawler):
else:
# 按照用户要求:找不到文字时输出日志、截图并停止程序
fail_screen = take_screenshot(d, f"tld_ocr_fail_{int(time.time())}.jpg")
logger.error(f"❌ [OCR失败] 经过 {max_scroll_attempts} 次滚动仍未在页面中找到‘全部时段’文字!")
logger.error(f"❌ [OCR失败] 经过 {max_scroll_attempts} 次滚动仍未在页面中找到价格入口文字 (全部时段/全天价格统一)!")
logger.error(f"❌ [OCR失败] 最终截图已保存至: {fail_screen}")
logger.error("❌ [OCR失败] 程序将停止运行,请检查页面内容或识别逻辑。")
sys.exit(1) # 停止程序
@@ -489,7 +491,8 @@ class TeLaiDianCrawler(BaseCrawler):
total_piles=total_piles,
free_piles=free_piles,
piles_detail=piles_detail,
parking_info=parking_info
parking_info=parking_info,
distance=distance
)
else:
logger.warning(f"❌ 未能提取到任何价格信息,请检查页面识别逻辑")