
這是測試活動發佈!這是測試活動發佈!這是測試活動發佈!
這是測試活動發佈!這是測試活動發佈!這是測試活動發佈!這是測試活動發佈!這是測試活動發佈!這是測試活

活动信息
报名方式
活动内容
def update_last_updated_date():
"""更新所有记录的 last_updated_date 为当前日期"""
with get_db_connection() as conn:
cur = conn.cursor()
cur.execute("UPDATE goodschool_activity_cn SET last_updated_date = CURDATE()")
logger.info(f"✅ 更新了 {cur.rowcount} 条记录的 last_updated_date")
def main():
logger.info("🚀 GoodSchool 活动爬虫启动(新增event-content字段提取)")
init_database()
# 添加字段(如果表已存在)
add_last_updated_date_column()
existing_urls = get_existing_urls()
logger.info(f"📦 数据库中已有 {len(existing_urls)} 条记录")
with get_driver() as driver:
all_links = extract_all_detail_links(driver)
new_links = [url for url in all_links if url not in existing_urls]
logger.info(f"🆕 新增待爬取链接: {len(new_links)} 条")
if not new_links:
logger.info("没有新数据,程序退出")
# 即使没有新数据,也更新 last_updated_date
update_last_updated_date()
return
results = []
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
future_to_url = {executor.submit(process_detail_page, url, existing_urls): url for url in new_links}
completed = 0
for future in as_completed(future_to_url):
url = future_to_url[future]
completed += 1
try:
data = future.result()
if data:
results.append(data)
except Exception as e:
logger.error(f"❌ 处理失败 {url}: {e}")
if completed % 10 == 0:
logger.info(f"📈 进度: {completed}/{len(new_links)}")
for i in range(0, len(results), BATCH_SIZE):
batch = results[i:i + BATCH_SIZE]
batch_save_activities(batch)
# 爬取完成后,更新所有记录的 last_updated_date
update_last_updated_date()
logger.info(f"🎉 爬取完成,成功新增 {len(results)} 条活动数据")
推荐活动

校园活动都得


校园活动筲箕灣官立小學:觀星奇遇記


校园活动康樂英文中學(1971-1980)校友重聚日


报名日香港順德聯誼總會梁潔華小學正接受小一至小五插班申請


校园活动筲箕灣官立小學 ──反斗「騎」兵迎全運
