Lje1 dZddlZddlZddlZddlZddlZddlZddlZddlmZm Z ddl m Z e e j Zedz Zedz Zedz Zed ed ejd d Zd Zd dddddddddddddddddddddddddddddgZd+d!Zd,d#Zd-d$Zd%Zd&Zd'Zd(Zd)Ze d*kre!edSdS).u 北京展览信息爬虫 - Tavily 版(优先北京市文物局) 数据源优先级: 1. ⭐⭐⭐⭐⭐ 北京市文物局官网(第一数据源) 2. ⭐⭐⭐⭐ 国家博物馆、故宫博物院、首都博物馆、中国美术馆 3. ⭐⭐⭐ 豆瓣同城、本地宝等聚合信息 新增功能: 1. 与前一天数据对比(检测是否更新) 2. 有效数据验证(标题/场馆完整性) 3. 数据量验证(< 5 条告警) N)datetime timedelta)Pathdatalogszexhibitions.dbT)exist_okTAVILY_API_KEYzhttps://api.tavily.com/searchu*叩问永恒——庞贝的探索与发掘国家博物馆z 02-04~10-11u¥120)titlevenuedatepriceu3双星耀世——三星堆—金沙古蜀文明展u即日起~08-18u免费uB遇见考烈王——安徽淮南武王墩一号墓考古成果展z2025/12/26~2026/4/14uE几何·和谐·生活——安德烈亚·帕拉第奥建筑艺术展z 02-04~05-24u 含门票u-万法归一:萨迦寺历史文化艺术展故宫博物院z 02-10~05-10u-饰文焕彩——河北古代艺术珍品展中国美术馆z 02-13~05-12INFOcptjd}d|d|d|}t|tdtjddz }t |dd 5}||d zd d d d S#1swxYwYd S) u 记录日志%Y-%m-%d %H:%M:%S[z] [z] exhibition_z%Y%m%dz.logautf-8encoding N)rnowstrftimeprintLOG_DIRopenwrite)messagelevel timestamp log_entrylog_filefs N/root/.openclaw/workspace/travel/beijing-exhibitions/scripts/crawler_tavily.py log_messager)4s ''(;<'>x'H'HNNNNH hg . . ."!  D !!!""""""""""""""""""sB++B/2B/ctstddgS ddtd}|d|d}tjt||d }|jd kr*|}|d gStd |jdgS#t$r,}td t|dgcYd}~Sd}~wwxYw)u使用 Tavily 搜索u❌ Tavily API Key 未配置ERRORzapplication/jsonzBearer )z Content-Type Authorizationbasic)query search_depth max_results)headersjsontimeoutresultsu✗ Tavily 搜索失败:HTTP u✗ Tavily 搜索异常:N) r r)requestspostTAVILY_API_URL status_coder4get Exceptionstr)r/r1r3rresponseresultes r( tavily_searchrB>s 2G<<<  #5HbR`HbHbcc TT=tUWXXX  3 & &]]__F::i,, , P(:NPPRY Z Z ZI 9Q997CCC s$A$BB C$!C C Ccvgd}tfd|DrdStjd}|rO|dt dkrt dkrStjd}|r'|dStjd }|rH|dgd }tfd |DsSd |vrd Sd|vrdSd|vrdSdS)u从文本中提取展览名称)u 京文物〔u京文物许可〔u通知u各博物馆:u我局u请示u批复u条例u 组织开展 发布 2026 展览计划u 本地宝 >u 资讯快递u 近日抵u 教育厅u 系统呈现u 辉煌图景c3 K|]}|vV dSN).0skiptexts r( z+extract_exhibition_title..Zs' 2 2D44< 2 2 2 2 2 2NuD([A-Za-z0-9\u4e00-\u9fa5]{4,20}——[A-Za-z0-9\u4e00-\u9fa5]{2,20})#u《([^》]{4,30})》u#([A-Za-z0-9\u4e00-\u9fa5]{6,18}展))u 展览预告u 正在展出u新展rDrEc3 K|]}|vV dSrGrH)rIrJr s r(rLz+extract_exhibition_title..ns'99T45=999999rMz chnmuseum.cnu国家博物馆展览z dpm.org.cnu故宫博物院展览z namoc.orgu中国美术馆展览)anyresearchgroupstriplen)rKurl skip_keywordsmatch skip_titlesr s` @r(extract_exhibition_titler\Ts~OOOM 2 2 2 2M 2 2 222t I]_c d dE  A$$&& u::??s5zzR//L I-t 4 4E &{{1~~##%%% I.s***qAcrcF******rMru新增u 个,移除u个)rprq removed_countr")rWset)todayri today_set yesterday_setnewremoveds r( compare_datar|s Y s5zzFWXXX**E*****I NNM m #Ci'Gs88q=6S\\Q%6XXWCCHHCC#g,,CCC   rMc"tjt}|}|d|d||tddS)u初始化数据库a CREATE TABLE IF NOT EXISTS exhibitions ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, venue TEXT, start_date TEXT, end_date TEXT, price TEXT, source TEXT, url TEXT, is_priority INTEGER DEFAULT 0, created_at TEXT DEFAULT CURRENT_TIMESTAMP, UNIQUE(title, venue) ) a CREATE TABLE IF NOT EXISTS crawl_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, source TEXT, crawl_time TEXT, items_count INTEGER, status TEXT, comparison_result TEXT ) u数据库初始化完成N)sqlite3connectDB_PATHcursorexecutecommitcloser))connrs r( init_databasers ?7 # #D [[]]F NN    NN      KKMMMJJLLL*+++++rMc  tjd}td|dz }gd fd|Ddd}|drd nd |d d }d |dt |dt |d|dtjdd|d }t |dD]D\}}||d|dd|ddd|dddz }E|d|dtjdd z }t|d!d"#5} | |dddn #1swxYwYt |t |t|d$S)%u 生成报告r_r`ra)u历史u人文u古代u考古u文物u 博物馆u故宫u书法u藏传u佛教u古蜀u青铜u文明u庞贝u 三星堆u艺术cLg|]tfdD S)c3,K|]}|dvVdSr NrH)rIkwexs r(rLz-generate_report...s,/U/Ubbk0A/U/U/U/U/U/UrM)rR)rIrkeywordss @r( z#generate_report..s<VVVrC/U/U/U/UH/U/U/U,U,UVVVVrMN rpu⚠️ 数据与昨日相同u✅ r"r u# 北京展览推荐 - u, ## 📅 今日概览 - **在展数量**:u 个 - **符合兴趣**:u 个 - **数据更新时间**: z%H:%Mu - **数据对比**:u# --- ## 🌟 重点推荐展览 rNz. **r z** - r 待查询u(ru 展期详情u) u --- ## 📊 数据来源 - **优先**:北京市文物局、国家博物馆、故宫博物院、首都博物馆、中国美术馆 - **补充**:豆瓣同城、本地宝等 --- *由 Travel Agent 自动生成 | z* wrr)totalfilteredpath) rrrrcr<rW enumerater r!r>) rl comparisonrw report_pathrnoterkirr'rs @r(generate_reportrs LNN # #J / /E>E>>>>KvvvHVVVV[VVVWZXZWZ[H-7^^I-F-F r ) )LrS]SaSabkmoSpSpLrLrD %  +&&  (mm   "   %-LNN$;$;G$D$D      G8Q''vv2auuR[uurvvg{/K/KuuPRPVPVW]_mPnPnuuuu #(  +3,..*A*A'*J*J    G k3 1 1 1Q %%3x==#kJZJZ [ [[s*F  FFc * tdtdtdtg}tdtdd}|D]@}t|ddr|d d d Atd t |d tddD]}t|d}|D]i}t|ddrBtfd|Ds'd|vrdnd|vrdnd}||d d jtj dtdtj d}td|dd}|D][}t|ddr4tfd|Ds|ddd \t |dkrytdt |d d!tD]Ptfd"|Ds3|d#d$d%d&d'd(Qt}g}|D]@d#d)d*}||vr*|||Atd+t |d t!} t#d,|D| } td-| d.| d/rtd0d!t%|| } t |dkr| d/sd1nd2} t |dkr!td3t |d4d!t'jt*} | }|d5d6tj d7t || t1j| f| | | t || | d8d9}t9t1j|d:;tdtdndS)?u 主函数z<============================================================u0北京展览爬取(优先北京市文物局)u* 【1】北京市文物局 ⭐⭐⭐⭐⭐u?北京市文物局 博物馆展览 2026 site:wwj.beijing.gov.cnr)r1rkr u北京市文物局汇总u官方)r r sourceu获取 u 个u$ 【2】各大博物馆 ⭐⭐⭐⭐)u(国家博物馆 展览 site:chnmuseum.cnu故宫 展览 site:dpm.org.cnu%中国美术馆 展览 site:namoc.orgc30K|]}|dkVdSrrHrIrr s r(rLzmain..s, P P"G!5 P P P P P PrM chnmuseumr dpmrrrNu 【3】聚合信息 ⭐⭐⭐u%Y 年 %-m 月u 北京展览 u 博物馆c30K|]}|dkVdSrrHrs r(rLzmain..s,LLbR[E1LLLLLLrMru聚合u⚠️ 爬取数据过少 (u 条),使用已知展览兜底WARNINGc3<K|]}|ddkVdSrrH)rIrArs r(rLzmain..#s0JJQqzR[0JJJJJJrMr r rru 已知数据)r r rrrNr2u 去重后:cg|] }|d S)r rH)rIrs r(rzmain..9s<<>>]kmnnnG nn(y")=)=>>  n  " "U=Wck#l#l m m m4#o..4445557888H1555 ] ]A,QUU9b-A-ABBE ]S P P P P P P PPP ]-8E-A-A))\aej\j\jGXGXqB&&RZ'['[\\\ 1 1222LNN++,<==MEMEEESUVVVG __(y")=)=>>  _LLLLOLLLLL _  " "U[T\#]#] ^ ^ ^ ?ah#o2F2Fhhhjsttt#  BJJJJ/JJJJJ &&[[vJ[, (( 55D Fk#2# d?? HHSMMM MM"   0s6{{000111$%%I<>)3L3L*YYR[F 6{{QGS[[GGGSSS ?7 # #D [[]]F NNChlnn556IJJCPVKKY_aeaklvawawxzzzKKMMMJJLLLVJZ`agZh i iF $*V% 0 0 0111MCKKMMj6KMMNNN)##11*rM__main__)r)r*)r )"__doc__r4rrandomr~osr8rSrrpathlibr__file__parentBASE_DIRrcrrmkdirenvironr<r r:rr)rBr\rnr|rrr__name__exitrHrMr(rse     (((((((( 4>>  f  V  % %  t  0"550;EV`mxAACN_izFNOOR]nyOZbccU`q|IT_``=HYcp|GHH=HYcp|DEE """",%%%%P.&",",",J*\*\*\Z]+]+]+@ zDLLLLLrM