This commit is contained in:
HuangHai
2026-01-14 15:54:22 +08:00
parent b4785cb088
commit 9fddb4c6eb
6 changed files with 57 additions and 17 deletions

View File

@@ -199,24 +199,35 @@ class TeLaiDianCrawler(BaseCrawler):
station_name = station_info.get("name")
address = station_info.get("address")
logger.info(f"[详情页] 进入 crawl_detail_logic场站: {station_name} | 地址: {address}")
logger.info(f"[详情页] 已截取首屏截图,启动异步基础信息识别任务: {first_screen_path}")
logger.info(f"[详情页] 已截取首屏截图,准备识别基础信息: {first_screen_path}")
async def analyze_basic_info_background(image_path, fallback_name, fallback_address):
try:
basic_info = await self.read_image_kit.analyze_detail_basic_info(image_path)
name2 = basic_info.get("name") or fallback_name
addr2 = basic_info.get("address") or fallback_address
logger.info(f"[异步] 详情页基础信息识别完成: {name2} | {addr2}")
except Exception as ex:
logger.error(f"[异步] 分析详情页基础信息失败: {ex}")
finally:
if os.path.exists(image_path):
try:
os.remove(image_path)
except:
pass
try:
basic_info = await self.read_image_kit.analyze_detail_basic_info(first_screen_path)
if isinstance(basic_info, dict):
name2 = basic_info.get("name")
addr2 = basic_info.get("address")
if name2:
station_name = name2
if addr2:
address = addr2
logger.info(f"[详情页] 同步基础信息识别结果用于写库: {station_name} | {address}")
except Exception as ex:
logger.error(f"[详情页] 同步分析详情页基础信息失败: {ex}")
finally:
if os.path.exists(first_screen_path):
try:
os.remove(first_screen_path)
except:
pass
asyncio.create_task(analyze_basic_info_background(first_screen_path, station_name, address))
template_xczs = os.path.join(os.path.dirname(__file__), "Template", "xczs.jpg")
try:
if os.path.exists(template_xczs):
if d.image.click(template_xczs, timeout=3.0):
logger.info("[详情页] 检测到温馨提示弹窗,已点击“下次再说”关闭。")
await asyncio.sleep(1.5)
except Exception as e:
logger.error(f"[详情页] 通过模板点击关闭温馨提示弹窗失败: {e}")
w, h = d.window_size()
logger.info("[详情页] 先执行一次较大的向上滑动,将详情内容上移一屏左右")
@@ -427,7 +438,6 @@ class TeLaiDianCrawler(BaseCrawler):
except:
pass
# 6. 保存数据
if all_prices:
station_name_clean = clean_station_name(station_name)
try:
@@ -438,6 +448,13 @@ class TeLaiDianCrawler(BaseCrawler):
await self.service.save_station_data(station_name_clean, address, all_prices)
else:
logger.warning(f"❌ 未能提取到任何价格信息,请检查页面识别逻辑")
if address:
station_name_clean = clean_station_name(station_name)
logger.info(f"[详情页] 虽未获取价格,但已获取地址,尝试仅保存基础信息: {station_name_clean} | {address}")
try:
await self.service.save_station_profile_only(station_name_clean, address)
except Exception as e:
logger.error(f"[详情页] 仅保存基础信息失败: {e}")
if os.path.exists(price_screen_path):
os.remove(price_screen_path)

View File

@@ -41,6 +41,29 @@ class TeLaiDianService:
async def close_db(self):
await self.db.close()
async def save_station_profile_only(self, station_name, address):
if not station_name or not address:
return False
station_hash = self.get_hash(station_name)
now = datetime.now()
async with await self.db.get_session() as session:
profile_id = self.generate_id()
await self.station_profile_model.save(
session=session,
id=profile_id,
station_hash=station_hash,
operator=self.operator,
station_name=station_name,
address=address,
valid_start_time=now
)
await session.commit()
logger.info(f"仅保存场站基础信息: {station_name}")
return True
async def save_station_data(self, station_name, address, prices):
"""
保存场站及其价格数据到数据库

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB