ݖUjXdZddlZddlZddlZddlZddlZddlmZddlmZddl m Z ee j Z e dz Ze dz Zed ed d d iZgZed d D]AZed kreddef#ededdefBiddddddddddddddddddddddd d d!d"d#d$d%d&d'd&d(d(id)d)d*d*d+d+d,d-d.d.d/d/d0d1d2d3d4d3d5d5d6d7d8d9d:d:d;d<d=d>d?d@dAdBZdSdDZdTdFZdGZdHZdUdJZdKZdLZdMZdNZdOZ dVdPZ!dQZ"e#dRkre$e"dSdS)Wu 北京展览信息爬虫 v3 - 多源直接抓取版 核心改进(对比 v1/v2): 1. 放弃 Tavily 搜索 + 正则提取(数据质量极差:单字标题、无场馆、无展期) 2. 改为直接 HTTP 抓取已知数据源页面 + HTML 结构化解析 3. 每条展览必须包含:名称、场馆、展期、门票、简介 4. 报告按原始模板结构输出(详细版) 数据源(全部直接 HTTP 抓取): 1. ⭐⭐⭐ 北京本地宝 7 月展览汇总(主数据源,HTML 结构化解析) - URL: http://bj.bendibao.com/news/202674/384308.shtm(第1页国博) - 追加抓取第2-12页(其他博物馆) 2. ⭐⭐ 携程展览汇总(补充票价简介) - URL: https://hk.trip.com/events/9245182-2026-beijing-exhibitions-collection 使用方法: python3 crawler_v3.py [--date YYYY-MM-DD] 输出: - data/beijing_exhibitions_YYYY-MM-DD.md - JSON 结果到 stdout N)datetime)Path)unescapedatalogsT)exist_okz User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z.http://bj.bendibao.com/news/202674/384308.shtmPz*http://bj.bendibao.com/news/202674/384308_z.shtmu中国国家博物馆u国家博物馆u故宫博物院u首都博物馆u北京大运河博物馆u大运河博物馆u中国美术馆u!中国人民革命军事博物馆u军事博物馆u北京自然博物馆u国家自然博物馆u中国科学技术馆u中国科技馆u中华世纪坛u北京展览馆u北京石刻艺术博物馆u石刻艺术博物馆u北京艺术博物馆u万寿寺博物馆u北京白塔寺管理处u 白塔寺u北京市白塔寺管理处u中国电影博物馆u北京汽车博物馆u中国园林博物馆u民航博物馆u北京市古代钱币展览馆u德胜门箭楼u北京天文馆u中国现代文学馆u北京鲁迅博物馆u鲁迅博物馆u北京文博交流馆u 智化寺u北京市智化寺管理处u香山革命纪念馆u北京古钟博物馆u 大钟寺u北京古代建筑博物馆u 先农坛u老舍纪念馆u北京考古遗址博物馆u考古遗址博物馆u$北京市大觉寺与团城管理处u 大觉寺u$北京市大葆台西汉墓博物馆u 大葆台u北京中华民族博物院u中华民族园INFOctjd}d|d|d|}t|d t t dtjdd z d d 5}||d zddddS#1swxYwYdS#YdSxYw)Nz%Y-%m-%d %H:%M:%S[z] [z] T)flushcrawler_z%Y%m%dz.logautf-8encoding )rnowstrftimeprintopenLOG_DIRwrite)msgleveltslinefs J/root/.openclaw/workspace/travel/beijing-exhibitions/scripts/crawler_v3.pylog_msgr"ds  !4 5 5B $r $ $e $ $s $ $D $d 'Nx|~~'>'>x'H'HNNNNPS^e f f f !jk GGD4K  ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !  s1AB9B, B9,B00B93B04B99B>c tj||t}d|_||jS#t $r!}td|d|dYd}~dSd}~wwxYw)N)timeoutheadersru 抓取失败 z: WARNING)requestsgetHEADERSrraise_for_statustext Exceptionr")urlr%res r! fetch_urlr1os Lgw ? ? ?  v ***q**I666ttttts=A A+ A&&A+ctjdd|}t|}tjdd|}tjdd|}|S)u去除 HTML 标签z<[^>]+> z \s+)resubrstrip)htmlr,s r! strip_tagsr9zsW 6*c4 ( (D D>>D 6)S$ ' 'D 6&#t $ $ * * , ,D Kctjdd|}tD]#\}}tjdd|}||vr|cS$dS)u!从文本中识别博物馆名称r4)r5r6 MUSEUM_MAPitems)r,cleanfullshort full_cleans r!normalize_museumrCsg F62t $ $E!'')) eVFB--   LLL  2r:r<c t|}|sgStjd|tj}gd}dt |dd}t |}|r|}fd}|D]}t |tdkr8tjd} | rk|| d} tj d d| } | r!t| d kr| |pd ddd ddd |d tj d|tj} | r{t | d} t | } | r6t| dkr#tjd| s|| }Wrodvr dd dd}tj dd|}|d<t|}|ddd<|ddd< dvr dd dd}tj dd|}|d <d!d krt |}|r|d!<d"vr d#d d$d}tj d%d|}t|d&kr |dd'd(<%drd(sztdkrggd)}tfd*|DsHtj d+d}t|d,kr |dd'd(<||r#t!d-|d.td/S)0u解析本地宝单个页面z]*>(.*?)

r<NicrjdrUtddkrz.save_current..s'00aqEz000000r:)r)lenanyappend)skiprF current_ex exhibitionss @r! save_currentz)crawl_bendibao_page..save_currents  /*..11 /c*W:M6N6NRS6S6SIIIDw'E0000400000 /"":... r:z^(\d{1,2})[\s ]+(.+)u;\s*(展览时间|展览地址|展览介绍|【导语】).*$ 待确认免费 本地宝) rFvenue start_dateend_dateprice descriptionlocationsourcer.z]*>(.*?)r z ^\d{1,2}[\s ]rKu展览时间:u 展览时间:u.\s*(展览地址|展览介绍|温馨提示).*$date_rawstartrfendrgrLu展览地址:u 展览地址:u!\s*(展览介绍|温馨提示).*$rjrerMu展览介绍:u 展览介绍:u5\s*(温馨提示|微信搜索|关注后|对话框).*$iri)rNrOu 关注后u 对话框rPrdu 预约开票u闭馆u 开放时间u暑假u暑期u 学校校历u根据北京市教委u 端午佳节u提升服务水平u北京市文物局c3 K|]}|vV dSrRrS)rUrVr,s r!rWz&crawl_bendibao_page..s';;19;;;;;;r:u+\s*(温馨提示|微信搜索|关注后).*$r#u 本地宝[u]: 个展览)r1r5findallDOTALLr9rCr7rXmatchgroupr6searchreplace parse_dater)rYr")r.labelrawp_tagscurrent_museum page_text page_museumr^p num_matchrF bold_match bold_textdetecteddate_strparsedaddrmdesc skip_in_textr\r]r,s @@@r!crawl_bendibao_pagers C..C  Z,c29 = =FKNJ3uu:&&I"9--K%$      B?B?!}}""$$ t99q== H4d;;   LNNNOOA&&,,..EFY[]_deeE Uq"+:{"$ "%#% "*    Y=q")LL  ":#3#3A#6#677==??I' 22H C NNR//AQS\8]8]/ !)  ?%%<<(92>>FFXZ[[aacc6"SUWYabbhhjj)1 :&#H--+1::gr+B+B <()/E2)>)> :&&4''||$5r::BB?TVWW]]__vBBMMSSUU)- :&g&+55(..A0./ 7+4''||$5r::BB?TVWW]]__vVXZ\`aaggiit99r>>04TcT J}- ++ ?JNN=4Q4Q ?VYZ^V_V_bdVdVd t t t ;;;;l;;;;;?6"PRTVZ[[aaccD4yy2~~48#J =1LNNN HFuFF#k*:*:FFFGGG r:ctdg}tD]>\}}t||}||t jd?tdt |d|ddD]+}td|ddd d |d ,t |dkr td t |d |S)u-抓取本地宝展览汇总(主数据源)u+【数据源1】北京本地宝展览汇总r u 本地宝合计:rrNz -> rF# | reu ... 等共 u 个)r"BENDIBAO_PAGESrextendtimesleeprX)all_exr.rzexsexs r!crawl_bendibaors 9::: F$ U!#u-- c 1  :3v;; : : :;;;RaRj>><"W+crc*<..s'44!1:444444r:r<携程)rFrerfrgrhrirkr.u 携程提取:rr) r"r1r9setr5finditerrvr7rstriprXrYaddrZ) r.r{r,r]seenpatternspatternrr[rFs @r! crawl_tripcomrs 0111 RC C $ $ $C  c??DK 55D ?rH Wd++  AGGAJJ$$&&--e44ED  SZZ1__Ur9I9IXXX4444t44444 HHUOOO&&!&!#&($&!#')"*" ( (    * <K 0 0 < < <=== r:c|}ddfddfddfddfg}|D]C\}}tj||}|r'||\}}||d cSD|d d S) NuW(\d{4})年(\d{1,2})月(\d{1,2})日?[—\-~至到]\s*(\d{4})年(\d{1,2})月(\d{1,2})日?c |dd|ddd|dd|dd|ddd|ddfS)Nr-r r`r_rarzfillgs r!zparse_date..Gsqt==adjjmm==adjjmm==!A$?h?h1TU?h?hYZ[\Y]YcYcdeYfYf?h?hir:u&(\d{4})年(\d{1,2})月(\d{1,2})日?起c|dd|ddd|dddfS)Nrrr r`r<rrs r!rzparse_date..IsAqt==adjjmm==adjjmm==rBr:uC(\d{1,2})月(\d{1,2})日?[—\-~至到]\s*(\d{1,2})月(\d{1,2})日?cJtjjd|ddd|ddtjjd|ddd|ddfS)Nrrr`r r_rryearrrs r!rzparse_date..Ksx|~~*LLQqTZZ]]LLQqTZZ]]LL|~~*LLQqTZZ]]LLQqTZZ]]LLNr:u=(\d{1,2})月(\d{1,2})日?(?:起对公众开放|起开放|起)ctjjd|ddd|dddfS)Nrrr`r r<rrs r!rzparse_date..NsFx|~~*LLQqTZZ]]LLQqTZZ]]LLbQr:)rnror<)r7r5rwgroups)rrVrregexfmtrrnros r!ryryCsA c i i k 2 B B D O N N O J Q Q S H00 s IeQ    0QXXZZJE3"3// / / / 0r " ""r:ci}|D]}|ddd}||vr||}dD]7}||s ||r ||||<8|ddkr$|ddkr |d|d<t|||<t|S)NrFr#)rerfrgrhrirjrkr)r)dictlistvalues)r]rrkeyoldfields r! deduplicater\s D ! !k#2# $;;s)C` + +wwu~~+"&&--+!#ECJwwx  H,,1A1AX1M1M "8 H RDII   r:c\|dddz|ddzdz|ddzgd}gd}tfd|D}tfd |D}|d ks |d kr|d krd S|d ks|d krd SdS)NrFr<r3rire)0u历史u人文u古代u考古u文物u 古建筑u书法u藏传u佛教u古蜀u青铜u文明u庞贝u 三星堆u敦煌u 文艺复兴u 乌菲齐u 卡拉瓦乔u 达·芬奇u 达芬奇u丝绸u玉器u陶瓷u书画u雕刻u石窟u壁画u文献u简牍u金石u碑刻u宗教u 丝绸之路u写意u 八大山人u 齐白石u 黄宾虹u玛雅u 安第斯u 美洲豹u 叙利亚u 古埃及u 科威特u捐献u百年u 李静训u月背u航天)u艺术u摄影u油画u版画u水彩u雕塑u国际u交流u文化u非遗u工艺u 卡塔尔u巴西u 柬埔寨u吴哥u国博u故宫u首博u 美术馆c3$K|] }|vdV dSr NrSrUkwr,s r!rWz&classify_exhibition..'55""**A****55r:c3$K|] }|vdV dSrrSrs r!rWz&classify_exhibition..rr:r`r )topu 强烈推荐)midu 值得一看)lowu 供参考)r)sum)rtop_kwmid_kw score_top score_midr,s @r!classify_exhibitionrls 66'2   $rvvmR'@'@ @3 FPWY[I\I\ \D   FF555555555I555555555IA~~)q..Y!^^$$ a9>>$$!!r:c&|p%tjd}gggd}|D]5}t|\}}||i|d|i6t |}t |d}t |d} d} d} d} d } g}|d ||d |d |d |d|d|d|d| d|dt |dd|d|d|dtjd|d |d|d |dr|d|d t |ddD]\}}|d|d|d|d | ||d!| ||d"| || |}|r|d#||d |dr |d$|d t |ddD]\}}||z}|d|d|d|d | ||d!| ||d"| || |}|r|d#||d |dr|d%|d |d&|d't |ddD]S\}}|| z|z}|d(|d)|dd)| |d)| |d)| |d* T|d |d|d |d+|d |d,|d-|d.|d/|d0|d1|d |d2|d3|d4|d5|d |d6|d7|d8|d9|d |d|d |d:|dtjdd;d<|}td=|d>z }t|d?d@A5}| |dddn #1swxYwYtdB|dC|dD||fS)EN%Y-%m-%d)rrrrzrrc|dd|dd}}|dd}|r |r|d|S|r|dS|r|SdS)Nrfr<rgrmu — u起u展期待确认r))rrVr0r{s r!fmt_datez!generate_report..fmt_datesvvlB'' B)?)?1ffZ$$   >>a>> !  999   J  r:cz|dd}|sdSt|dkr |dddzn|S)Nrir<u…)r)rX)rds r!fmt_descz!generate_report..fmt_descsF FF=" % % 4"%a&&3,,q#wA5r:cF|dd}|r|dkrdS|S)Nrhr<rcu免费(需预约)r)rrs r! fmt_pricez"generate_report..fmt_prices0 FF7B   +AMM**r:c|dd}|dd}|r|r ||kr|d|S|pdS)Nrer<rju · rbr)rvlocs r! fmt_venuez"generate_report..fmt_venuesZ FF7B  ffZ$$  # #??S?? "Kr:u# 北京展览推荐 - r<u## 📅 今日概览u- **在展数量**:u 个(精选)u- **强烈推荐**:u0 个(历史人文/古代艺术/世界文明)u- **值得一看**:u# 个(文化交流/艺术大展)u- **供参考**:ru! 个(亲子/科普/科技类)u3- **数据来源**:北京本地宝、携程展览u- **数据更新时间**:r3z%H:%Mz---uU## 🌟 第一梯队:强烈推荐(历史人文 · 古代艺术 · 世界文明)r z### z. rFu- **场馆**:u- **展期**:u- **门票**:u- **简介**:uE## 🌟 第二梯队:值得一看(文化交流 · 艺术大展)u=## 📌 第三梯队:亲子/科普/科技类(供参考)u4| 序号 | 展览名称 | 场馆 | 展期 | 门票 |z'|------|---------|------|------|------|z| rz |u## 📌 参观实用信息u### 🎫 预约方式u>- **故宫**:提前7天20:00开始预订(www.dpm.org.cn)u>- **国家博物馆**:提前7天预约(www.chnmuseum.cn)u6- **中国美术馆**:提前预约(www.namoc.cn)uH- **首都博物馆**:关注「首都博物馆」微信公众号预约u9- **免费展览**:部分也需预约,请提前确认u### 🚇 交通建议u<- **优先地铁**:北京停车困难,建议地铁出行uH- **798 艺术区**:地铁 14 号线望京南站,换乘公交/打车u3- **故宫周边**:地铁 1 号线天安门东站u#### 👨‍👩‍👧 亲子观展u=- **建议时长**:每展 1.5-2 小时,避免孩子疲劳uB- **携带物品**:水杯、小零食(馆外食用)、湿巾u0- **休息安排**:选择有休息区的场馆u!*由 Travel Agent 自动生成 | u | 每日 9:00 更新*rbeijing_exhibitions_z.mdwrru报告已生成:u(u 个展览)) rrrrrZrX enumeratejoinDATA_DIRrrr")r] report_datetoday classifiedrrrztotaltop_nmid_nrrrrLiridxcontent report_pathr s r!generate_reportrs  >8<>>22:>>EBr22J99*2.. u5  !7B!7!7!78888   E  5! " "E  5! " "E ! ! !666      AHH .u . .///HHRLLLHH #$$$HH >3J3J73S3S U UVVVHHRLLLHHUOOOHHRLLL%  hiii  z%0!44  EAr HH.A..G.. / / / HH6yy}}66 7 7 7 HH5xx||55 6 6 6 HH6yy}}66 7 7 78B<E>>>>K k3 1 1 1Q  E E E E E EFFF K s ]..]25]2c tjd}d}tjdd}t |D]5\}}|dkr"|dzt |kr ||dz}-|dkrd}6tdtd|td|sut}tj d t}||z}t|}td t |d t |d ng}gg}}t |d kr!tdt |ddt||\} } t |dkrdnt |d krdndt |t |t |t| t |t |dd} tdt!j| dd tdt |dt |d krdndS)NrFr z--datez --output-onlyTz<============================================================u/北京展览爬取 v3(多源直接抓取)- r`u 合计:u 条,去重后:u 条ru⚠️ 数据量偏少(u 条)r' successwarningerror)bendibaotripcom)statusr total_items saved_itemsrsourcesz __JSON_RESULT__ ) ensure_asciiindentu 完成!共 rrr)rrrsysargvrrXr"rrrrrrstrrjsondumps) target_date output_onlyargsrargex1ex2runiquerrresults r!mainrs\,..))*55KK 8ABBrs0  4>>  f  V  t D   q"``AAvvOQXUVQXQXYZZZZTATTTV]Z[V]V]^____#.#(#(#( #  4 # ( #():#4#4#.#(#(#"#:#1# # ";!#"4###$4%#&4'#(()#*%&7+#,(-#.4/#0.1#2[3#4";5#647#8[9#:";;#<(=#>"#:?#@+KA#B+KC#D"#4E## T    ggggT.)))`###2    """F@ @ @ @ N/(/(/(d zDLLLLLr: