项目实训——大数据租房推荐智能体——地图通勤评分(三)
·
上次博客已经大概完成了map_service.py的主体,但仍存在问题
1.USERKEY_PLAT_NOMATCH的原因
这个错误 USERKEY_PLAT_NOMATCH 的意思是“Key 与平台不匹配”,第一次在高德开放平台申请 Key 的时候,选择的是“Web 端”,但在 Python 代码里调用的是“Web 服务 API”,于是删掉原先申请的Key,重新新建一个Web服务类型的Key,发现已经可以成功找到关键词“地铁站”的相关信息。
2.KeyError: 'code'
对于此处报错的原因我不是很清楚,好像是由于IP 不匹配,高德就会拒绝服务,导致高德 API 返回了错误信息,我决定改用“距离测量 API”,便于估算时间。
现在已经基本实现了POI以及通勤信息获取功能。

3.优化数据存储
为了满足任务 2.4 的评分需求,我们需要建立清晰的“房源-配套-通勤”关系。
- 引入
house_id:所有的 POI 和通勤数据,都必须绑定一个house_id(房源 ID)。 - 存储通勤数据:将计算出的通勤时间写入
commute_data表。 - 优化 POI 存储:在
poi_data表中增加house_id字段,表明这是“该房源”周边的配套。class MapService: def __init__(self, db_name="house_data.db"): """ 初始化:连接数据库并建表 """ self.conn = sqlite3.connect(db_name) self.create_tables() def create_tables(self): """ 【重构重点】 1. POI 表增加 house_id:用于区分不同房源的周边数据 2. 确保通勤表存在 """ cursor = self.conn.cursor() # --- 1. 房源表 (新增:为了关联数据,我们需要一个简单的房源表) --- # 在实际爬虫项目中,这个表通常由爬虫主程序创建 # 这里我们为了完整性加上,如果已存在则忽略 cursor.execute(''' CREATE TABLE IF NOT EXISTS house_info ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, longitude TEXT, latitude TEXT ) ''') # --- 2. POI 配套表 (增加 house_id 字段) --- cursor.execute(''' CREATE TABLE IF NOT EXISTS poi_data ( id INTEGER PRIMARY KEY AUTOINCREMENT, house_id INTEGER, -- 关联的房源ID name TEXT NOT NULL, -- 配套名称(如:万达广场) type TEXT, -- 类型(如:购物、地铁) distance REAL, -- 距离(米) address TEXT, FOREIGN KEY(house_id) REFERENCES house_info(id) ) ''') # --- 3. 通勤表 --- cursor.execute(''' CREATE TABLE IF NOT EXISTS commute_data ( id INTEGER PRIMARY KEY AUTOINCREMENT, house_id INTEGER, -- 关联的房源ID destination_name TEXT, -- 目的地名称(如:高新万达) duration_min REAL, -- 耗时(分钟) distance_m REAL, -- 距离(米) FOREIGN KEY(house_id) REFERENCES house_info(id) ) ''') self.conn.commit()修改优化建表函数,新增房源表house_info,并且将主键idhouse_id加入POI表和通勤表中
4.测试优化过后的存储功能
编写测试代码
if __name__ == "__main__":
print("=== 开始测试地图服务 (含存储) ===")
ms = MapService()
# 模拟数据库里已经有了一个房源,ID 为 1
# 在实际爬虫中,这里会是 insert into house_info ... returning id
current_house_id = 1
my_location = "117.120729,36.683369" # 房源坐标
target_location = "117.032434,36.667890" # 公司坐标
# 1. 测试:搜索周边并存库
print(f"\n[1/2] 正在搜索并存储房源 {current_house_id} 的周边地铁...")
ms.search_poi_around(
house_id=current_house_id,
location=my_location,
keyword="地铁站"
)
print("周边数据已存入 poi_data 表 (带 house_id)")
# 2. 测试:计算通勤并存库
print(f"\n[2/2] 正在计算并存储通勤...")
duration, distance = ms.calculate_and_save_commute(
house_id=current_house_id,
origin_loc=my_location,
dest_name="高新万达",
dest_loc=target_location
)
if duration > 0:
print(f"通勤数据已存入 commute_data 表: {duration}分钟, {distance}米")
print("\n=== 测试结束 ===")
print("请打开 SQLite Viewer 查看 house_data.db 文件。")
print("你会看到 poi_data 和 commute_data 表中都有了 house_id=1 的数据。")
结果符合情况,在插件SQLite Viewer中可查看


5.小总结
map_service.py暂告段落,等到合并时再做完善工作,下次博客准备开始编写scoring_model.py
更多推荐



所有评论(0)