Ë
    6Ú°jÃ‰  ã                   óR  — d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m	Z	m
Z
mZ ddlmZ ddlZddlZ ej                   dej"                  j$                  j&                  j(                  ¬«       ej*                  j-                  ej*                  j/                  e«      «      Zej*                  j5                  ed«      Zej*                  j5                  ed«      Z e	j:                  e
j<                  «       ed	¬
«      z
  j?                  d«      Z ddiZ! ejD                  d«      Z# ejD                  dejH                  «      Z% ejD                  dejH                  «      Z& ejD                  d«      Z' ejD                  d«      Z(d=d„Z)d„ Z*ej*                  j5                  ed«      Zd>d„Z+d„ Z,d„ Z- ejD                  dejH                  ej\                  z  «      Z/ ejD                  dejH                  ej\                  z  «      Z0 ejD                  dejH                  «      Z1d„ Z2h d£Z3d„ Z4d„ Z5d „ Z6d!„ Z7d"„ Z8d?d#„Z9d?d$„Z:d=d%„Z;d&„ Z<d@d'„Z=d(Z>dZ?g d)¢g d*¢g d+¢g d,¢g d-¢g d.¢g d/¢g d0¢g d1¢g d2¢g d3¢g d4¢g d5¢g d6¢d7œZ@g d7¢ZAg d8¢ZBd9„ ZC ejˆ                  d:«      d;k(  ZEdAd<„ZFy)Bu  
crawler_lib.py â€” çˆ¬è™«å…±äº«åº“
==========================
æ‰€æœ‰ crawl_xxx.py ä»Žæ­¤å¯¼å…¥å…¬å…±å·¥å…·ã€‚

ç”¨æ³•ï¼š
    from crawler_lib import (
        fetch_page, parse_date, clean_html,
        import_to_eia, save_jsonl, get_eia_conn
    )

çº¦å®šï¼š
    - fetch_page è‡ªåŠ¨å¤„ç�†è¶…æ—¶å’Œç¼–ç �
    - import_to_eia æŒ‰ url åŽ»é‡�ï¼ˆINSERT OR IGNOREï¼‰
    - æ­£æ–‡ä¿�ç•™ HTML æ ¼å¼�ï¼ˆ<p>, <br>, <table>, <a> ç­‰ï¼‰ï¼Œä¸�æ¸…é™¤ç»“æž„åŒ–æ ‡ç­¾
    - æ¯�ä¸ªçˆ¬è™«è¾“å‡ºä¸¤æ�¡è·¯ï¼šç›´æŽ¥å…¥åº“ eia.db + JSONL æ–‡ä»¶å¤‡ä»½
é    N)ÚdatetimeÚtimezoneÚ	timedelta)ÚurljoinÚignore)Úcategoryzeia.dbÚoutputiG  )Údaysz%Y-%m-%dz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36uP   (\d{4})[å¹´\-/\.](\d{1,2})[æœˆ\-/\.](\d{1,2})|(?<!\d)(\d{4})(\d{2})(\d{2})(?!\d)zi<meta[^>]*name=["\']?(?:publish_date|pubdate|date|ArticleTitleDate)["\']?[^>]*content=["\']([^"\']+)["\']zX<meta[^>]*content=["\']([^"\']+)["\'][^>]*name=["\']?(?:publish_date|pubdate|date)["\']?z&<time[^>]*datetime=["\']([^"\']+)["\']u)   (\d{4})[â€”â€“](\d{1,2})[â€”â€“](\d{1,2})Ú c                 ó2  ‡— | rd| vrd| vr| S d„ }t        j                  d|| «      } ‰rt        j                  dˆfd„| «      } t        j                  dd| «      } t        j                  d	d| «      } t        j                  d
d| «      } | j                  «       S )up  markdown é“¾æŽ¥ â†’ HTML å†…åµŒæ®µ (é™„ä»¶/å›¾ç‰‡ç¦� markdown æ ¼å¼�, ç”¨æˆ·å��å¥½)

    - [text](url)   â†’ <p><a href="url">text</a></p>
    - ![alt](url)   â†’ <p><a href="url">æŸ¥çœ‹å›¾ç‰‡</a></p>  (å›¾ç‰‡ç¦� markdown ![](url))
    - - [text](url) â†’ <p><a href="url">text</a></p>       (é™„ä»¶åˆ—è¡¨é¡¹)
    - [](url) ç©ºæ ‡é¢˜ â†’ ç”¨ fallback_title å¡«å……
    z](httpz](httpsc                 ó|   — | j                  d«      }||j                  d«      dz   |j                  d«       }d|› d�S )Nr   ú(é   ú)ú<p><a href="u   ">æŸ¥çœ‹å›¾ç‰‡</a></p>)ÚgroupÚindexÚrindex)ÚmÚwholeÚurls      ú /root/gov_crawler/crawler_lib.pyÚrepl_imgz"md_links_to_html.<locals>.repl_imgD   sB   € Ø—‘˜“
ˆØ�E—K‘K Ó$ qÑ(¨¯©°cÓ):Ð;ˆØ˜c˜UÐ"8Ð9Ð9ó    z!\[[^\]]*?\]\(http[^)]*\)z\[\]\((http[^)]+)\)c                 ó4   •— d| j                  d«      › d‰› d�S )Nr   r   z">z</a></p>)r   )r   Úfallback_titles    €r   ú<lambda>z"md_links_to_html.<locals>.<lambda>K   s"   ø€ ¸,ÀqÇwÁwÈqÃzÀlÐRTÐUcÐTdÐdlÐ8m€ r   z-\s*\[([^\]]+)\]\((http[^)]+)\)z<p><a href="\2">\1</a></p>z,\[((?:[^\[\]]|\[[^\]]*\])*)\]\((http[^)]+)\)ú\n{3,}ú

)ÚreÚsubÚstrip)Útextr   r   s    ` r   Úmd_links_to_htmlr$   9   s•   ø€ ñ �H DÑ(¨Y¸dÑ-BØˆò:ô �6‰6Ð.°¸$Ó?€DáÜ�v‰vÐ,Ó.mÐosÓtˆä�6‰6Ð4Ð6SÐUYÓZ€Dä�6‰6ÐAÐC`ÐbfÓg€Dä�6‰6�)˜V TÓ*€DØ�:‰:‹<Ðr   c                 ó  — | syt        | «      j                  «       }t        j                  |«      }|rÉ|j	                  d«      rOt        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d«      «      }}}nNt        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d«      «      }}}	 t        |||«       |d›d	|d
›d	|d
›�S t        j                  |«      }|rit        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d«      «      }}}	 t        |||«       |d›d	|d
›d	|d
›�S t        j                  d|«      }|r&|j	                  d«      › d	|j	                  d«      › d�S t        j                  d|«      }|r|j	                  d«      › d�S y# t        $ r Y yw xY w# t        $ r Y yw xY w)uÎ  æŠŠå�„ç§�è„�æ ¼å¼�çš„å�‘å¸ƒæ—¥æœŸç»Ÿä¸€æˆ� YYYY-MM-DDï¼ˆæ— åŒ¹é…�/åžƒåœ¾ â†’ ''ï¼‰ã€‚

    è¦†ç›–æ ¼å¼�ï¼ˆå®žæµ‹è„�æ•°æ�®æ¸…å�•ï¼‰ï¼š
      - æ ‡å‡†:        2026-07-31, 2026-7-2, 2026-07-31 09:00:00
      - ä¸­æ–‡æ ¼å¼�:    2026å¹´07æœˆ13æ—¥, 2026å¹´07æœˆ13
      - é•¿æ¨ªçº¿:      2026â€”07â€”28 (em-dash), 2026â€“07â€“28 (en-dash)
      - æ–œæ� /ç‚¹:     2026/07/13, 2026.07.13
      - ç´§å‡‘:        20260713
      - å¹´æœˆ:        2026-03 â†’ 2026-03-01
    r   r   é   é   é   é   é   Ú04dú-Ú02dz(\d{4})-(\d{2})$z-01z	^(\d{4})$z-01-01)
Ústrr"   ÚDATE_REÚsearchr   Úintr   Ú
ValueErrorÚEM_DASH_DATEr    )Úraw_dateÚsr   ÚyÚmoÚds         r   Únormalize_pub_dater9   U   sÇ  € ñ ØÜˆH‹×ÑÓ€AÜ�‰�qÓ€AÙØ�7‰7�1Œ:Ü˜1Ÿ7™7 1›:“¬¨A¯G©G°A«J«¼¸Q¿W¹WÀQ»Z»�1ˆr‰Aä˜1Ÿ7™7 1›:“¬¨A¯G©G°A«J«¼¸Q¿W¹WÀQ»Z»�1ˆrˆAð	Ü�Q˜˜AÔð �C�˜˜"˜S˜  1 S 'Ð*Ð*Ü×Ñ˜AÓ€AÙÜ�q—w‘w˜q“z“?¤C¨¯©°«
£O´S¸¿¹À»³_ˆqˆ2ˆð	Ü�Q˜˜AÔð �C�˜˜"˜S˜  1 S 'Ð*Ð*Ü
�	‰	Ð% qÓ)€AÙØ—'‘'˜!“*�˜Q˜qŸw™w q›z˜l¨#Ð.Ð.Ü
�	‰	�, Ó"€AÙØ—'‘'˜!“*�˜VÐ$Ð$Øøô# ò 	Ùð	ûô ò 	Ùð	ús$   Ã#G( Å#G7 Ç(	G4Ç3G4Ç7	HÈHc                 ó’   — 	 t        j                  | t        |d¬«      }|j                  dk(  r||_        |j
                  S y#  Y yxY w)u   GET è¯·æ±‚é¡µé�¢ï¼Œè¿”å›žæ–‡æœ¬F)ÚheadersÚtimeoutÚverifyéÈ   N)ÚrequestsÚgetÚHEADERSÚstatus_codeÚencodingr#   )r   r<   rC   Úrs       r   Ú
fetch_pagerE   …   sD   € ðÜ�L‰L˜¤g°wÀuÔMˆØ�=‰=˜CÒØ!ˆAŒJØ—6‘6ˆMØøðÙús   ‚>A ÁAc                 ó0  — | syt         j                  t        | «      j                  «       «      }|sy|j	                  d«      rOt        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d«      «      }}}nNt        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d«      «      }}}d|cxk  rd	k  rn yd|cxk  rd
k  rn yd|cxk  rdk  sy y|d›d|d›d|d›�S )u&   ä»Žä»»æ„�å­—ç¬¦ä¸²ä¸­æ��å�– YYYY-MM-DDr   r   r&   r'   r(   r)   r*   éÆ  é3  é   é   r+   r,   r-   )r/   r0   r.   r"   r   r1   )r#   r   r6   r7   r8   s        r   Ú
parse_daterK   •   sê   € áØÜ�‰”s˜4“y—‘Ó(Ó)€AÙØØ‡w�wˆq„zÜ�q—w‘w˜q“z“?¤C¨¯©°«
£O´S¸¿¹À»³_ˆqˆ2‰ä�q—w‘w˜q“z“?¤C¨¯©°«
£O´S¸¿¹À»³_ˆqˆ2ˆØ�AÔ˜ÔØð #$ r¤-¨R¤-Øð 56¸´L¸b²LØð 5AØØ�ˆW�A�b˜�X˜Q˜q ˜gÐ&Ð&r   c                 óü  — | syt         t        fD ]6  }|j                  | «      }|sŒt        |j	                  d«      «      }|sŒ4|c S  t
        j                  | «      }|r!t        |j	                  d«      dd «      }|r|S t        j                  | «      }|rå|j	                  d«      rOt        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d«      «      }}}nNt        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d	«      «      }}}d
|cxk  rdk  r,n yd|cxk  rdk  rn yd|cxk  rdk  rn y|d›d|d›d|d›�S y)uA   ä»Ž HTML ä¸­è‡ªåŠ¨æ��å�–å�‘å¸ƒæ—¶é—´ï¼ˆmeta/ time æ ‡ç­¾ä¼˜å…ˆï¼‰r   r   Né
   r&   r'   r(   r)   r*   rG   rH   rI   rJ   r+   r,   r-   )Ú	META_DATEÚ
META_DATE2r0   rK   r   ÚTIME_TAGr/   r1   )ÚhtmlÚpatr   r8   r6   r7   Úd2s          r   Úextract_date_from_htmlrT   ¥   sJ  € áØÜœ:Ð&ò ˆØ�J‰J�tÓˆÚÜ˜1Ÿ7™7 1›:Ó&ˆAÚØ’ðô 	�‰˜Ó€AÙÜ�q—w‘w˜q“z # 2�Ó'ˆÙØˆHä�‰�tÓ€AÙØ�7‰7�1Œ:Ü˜AŸG™G A›J›¬¨Q¯W©W°Q«Z«¼#¸a¿g¹gÀa»j»/�2ˆr‰Aä˜AŸG™G A›J›¬¨Q¯W©W°Q«Z«¼#¸a¿g¹gÀa»j»/�2ˆrˆAØ�1Ô˜Ôàð "# b¤¨B¤àð 45¸´=¸b´=àð ˜�W˜A˜b ˜X Q r¨# hÐ/Ð/Ør   z4<(script|style|noscript|template)\b[^>]*>.*?</\1\s*>z/<(?:script|style|noscript|template)\b[^>]*>.*\ZzK(?:<!--\s*)?(?:<\$\[[^\]]*\]>|ZJEG_RSS\.[\w.]*)\s*(?:begin|end)?\s*(?:-->)?c                 óN  — | sy| }d}||k7  r|}t         j                  d|«      }||k7  rŒt        j                  d|«      }t        j                  dd|t        j                  ¬«      }t        j                  dd|t        j
                  ¬«      }t        j                  d|«      }|S )u§  å‰¥æŽ‰ <script>/<style>/<noscript>/<template> å�—ï¼ˆè¿žå†…å®¹ï¼‰ã€�HTML æ³¨é‡Šã€�<link>ã€�CMS æ¨¡æ�¿æ ‡è®°ã€‚

    âš ï¸� å�ªåˆ æ ‡ç­¾ä¸�å¤Ÿ â€”â€” æ ‡ç­¾**ä¹‹é—´**çš„ CSS æ–‡æœ¬ä¼šåŽŸæ ·ç•™ä¸‹ï¼ˆé‚£æ­£æ˜¯æ‘˜è¦�å�˜ CSS çš„åŽŸå› ï¼‰ã€‚
    âš ï¸� æˆªæ–­å…œåº•ï¼šè°ƒç”¨æ–¹å¸¸å…ˆæˆªæ–­å†�ä¼ è¿›æ�¥ï¼Œå�¯èƒ½æ­£å¥½åˆ‡åœ¨ </style> ä¹‹å‰� â†’ æœªé—­å�ˆçš„å¼€æ ‡ç­¾
       å¿…é¡»æ•´æ®µæˆªåˆ°æœ«å°¾ï¼Œå�¦åˆ™ CSS ä¸€æˆªä¸¤æ–­ã€‚
    r   Nú z
<!--.*?-->)Úflagsz<link\b[^>]*>)Ú_NOISE_BLOCK_REr!   Ú_NOISE_OPEN_REr    ÚSÚIÚ_CMS_MARKER_RE)rQ   r5   Úprevs      r   Ústrip_noise_blocksr^   Õ   s—   € ñ ØØ€AØ€DØ
�!Š)ØˆÜ×Ñ  QÓ'ˆð �!‹)ô 	×Ñ˜3 Ó"€AÜ
�‰ˆ}˜c 1¬B¯D©DÔ1€AÜ
�‰Ð  a¬r¯t©tÔ4€AÜ×Ñ˜3 Ó"€AØ€Hr   >)   ÚpÚddÚdlÚdtÚh1Úh2Úh3Úh4Úh5Úh6ÚhrÚliÚolÚtdÚthÚtrÚulÚdivÚnavÚpreÚformÚmainÚasideÚtableÚtbodyÚtfootÚtheadÚcenterÚdialogÚfigureÚfooterÚheaderÚhgroupÚaddressÚarticleÚcaptionÚdetailsÚsectionÚfieldsetÚ
blockquoteÚ
figcaptionc                 óÚ   ‡‡‡— | €yddl mŠ g Šˆˆˆfd„Š ‰| «       dj                  ‰«      }t        j                  dd|«      }t        j                  dd|«      }|j                  «       S )	ul   å�—çº§è¾¹ç•Œå‡ºæ�¢è¡Œã€�è¡Œå†…èŠ‚ç‚¹ç›´æŽ¥æ‹¼æŽ¥ã€�<br> å‡ºæ�¢è¡Œï¼ˆâ‰ˆ æµ�è§ˆå™¨çœ‹åˆ°çš„æ�¢è¡Œç»“æž„ï¼‰ã€‚r   r   )ÚNavigableStringc                 óF  •— | j                   D ]‘  }t        |‰«      r‰j                  t        |«      «       Œ*t	        |dd «      dk(  r‰j                  d«       ŒLt	        |dd «      t
        v r+‰j                  d«        ‰|«       ‰j                  d«       ŒŠ ‰|«       Œ“ y )NÚnameÚbrú
)ÚchildrenÚ
isinstanceÚappendr.   ÚgetattrÚ_BLOCK_TAGS)ÚnodeÚchr‰   ÚoutÚwalks     €€€r   r–   zbody_text.<locals>.walkÿ   s„   ø€ Ø—-‘-ò 
	ˆBÜ˜"˜oÔ.Ø—
‘
œ3˜r›7Õ#Ü˜˜V TÓ*¨dÒ2Ø—
‘
˜4Õ Ü˜˜V TÓ*¬kÑ9Ø—
‘
˜4Ô Ù�R”Ø—
‘
˜4Õ á�R•ñ
	r   z[ \t\r\f\v]*\n[ \t\r\f\v]*r�   r   r   )Úbs4r‰   Újoinr    r!   r"   )ÚelÚtr‰   r•   r–   s     @@@r   Ú	body_textr›   ø   s_   ú€ à	€zØÝ#Ø
€Cöñ 	ˆ„HØ
�‰�‹€AÜ
�‰Ð,¨d°AÓ6€AÜ
�‰ˆy˜& !Ó$€AØ�7‰7‹9Ðr   c                 ó$  — | syt        | «      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }|j                  «       S )	uH   æ¸…æ´— HTMLï¼Œä¿�ç•™ç»“æž„åŒ–æ ‡ç­¾ï¼ŒåŽ»æŽ‰ style/class ç­‰æ— ç”¨å±žæ€§r   z style="[^"]*"z class="[^"]*"z<span[^>]*>|</span>z&nbsp;rV   r   r   )r^   r    r!   r"   )rQ   Úraws     r   Ú
clean_htmlrž     s{   € áØÜ
˜TÓ
"€CÜ
�&‰&Ð" B¨Ó
,€CÜ
�&‰&Ð" B¨Ó
,€CÜ
�&‰&Ð'¨¨SÓ
1€CÜ
�&‰&�˜C Ó
%€CÜ
�&‰&�˜F CÓ
(€CØ�9‰9‹;Ðr   c                 óˆ   — | r|syddl m}  || ¬«      }|j                  |«      }|sy|j                  «       }t	        |«      S )u.   ç”¨ CSS é€‰æ‹©å™¨æ��å�–æ­£æ–‡å®¹å™¨ä¸­çš„ HTMLr   r   )ÚSelector)r#   )Úparselr    Úcssr@   rž   )rQ   Úcss_selectorr    Úselr™   r�   s         r   Úextract_content_by_selectorr¥   #  s@   € á‘|ØÝÙ
˜Ô
€CØ	�‰�Ó	€BÙØØ
�&‰&‹(€CÜ�c‹?Ðr   c                 ó�   — | r|syt        j                  || t         j                  «      }|rt        |j	                  d«      «      S y)u&   ç”¨æ­£åˆ™æ��å�–æ­£æ–‡å®¹å™¨ä¸­çš„ HTMLr   r   )r    r0   ÚDOTALLrž   r   )rQ   Úpatternr   s      r   Úextract_content_by_regexr©   0  s9   € á‘wØÜ
�	‰	�'˜4¤§¡Ó+€AÙÜ˜!Ÿ'™' !›*Ó%Ð%Ør   c                  ó  — t        j                  t         j                  j                  t        «      xs dd¬«       t        j                  t        «      } | j                  d«       | j                  d«       | j                  d«       | S )u$   èŽ·å�– eia.db è¿žæŽ¥ï¼ˆWAL æ¨¡å¼�ï¼‰ú.T©Úexist_okúPRAGMA journal_mode=WALúPRAGMA busy_timeout=300000úPRAGMA synchronous=NORMAL)ÚosÚmakedirsÚpathÚdirnameÚEIA_DBÚsqlite3ÚconnectÚexecute)Úconns    r   Úget_eia_connrº   >  s\   € ä‡K�K”—‘—‘¤Ó'Ò.¨3¸Õ>Ü�?‰?œ6Ó"€DØ‡L�LÐ*Ô+Ø‡L�LÐ-Ô.Ø‡L�LÐ,Ô-Ø€Kr   c                 ó˜  — d}|€t        «       }d}	 | j                  dd«      }|sS| j                  d«      rBt        j                  dd| d   «      }t        j                  d	d|«      j	                  «       dd
 }|j                  d| j                  d«      xs ddd | j                  d«      xs ddd | j                  dd«      | j                  dd«      | j                  d«      xs ddd |dd | j                  d«      xs ddd f«       |j                  dkD  }|rb| j                  d«      rQt        j                  | d   j                  «       «      j                  «       dd }|j                  d|| d   dd f«       |j                  «        |r|j                  «        |S # t        $ r}|r|j                  «        Y d}~yd}~ww xY w)u¢   
    å¯¼å…¥å�•æ�¡åˆ° eia.dbã€‚
    item å­—æ®µ: site_name, title, url, content, pub_date, summary, tags
    è¿”å›ž: True=æ–°å¢ž, False=è·³è¿‡ï¼ˆé‡�å¤� urlï¼‰
    FNTÚsummaryr   Úcontentz<[^>]+>rV   z\s+é,  z§
            INSERT OR IGNORE INTO projects
                (site_name, title, url, content, pub_date, summary, tags)
            VALUES (?, ?, ?, ?, ?, ?, ?)
        Ú	site_namer>   Útitleéô  r   Úpub_daterM   Útagséd   r   rI   a%  
                INSERT INTO sites (site_key, name, total_items, last_sync)
                VALUES (?, ?, 1, CURRENT_TIMESTAMP)
                ON CONFLICT(site_key) DO UPDATE SET
                    total_items = total_items + 1,
                    last_sync = CURRENT_TIMESTAMP
            )rº   r@   r    r!   r"   r¸   Útotal_changesÚhashlibÚmd5ÚencodeÚ	hexdigestÚcommitÚcloseÚ	Exception)Úitemr¹   Úown_connr¼   ÚinsertedÚsite_keyÚes          r   Úimport_to_eiarÒ   H  sÀ  € ð €HØ€|Ü‹~ˆØˆð'Ø—(‘(˜9 bÓ)ˆÙ˜4Ÿ8™8 IÔ.Ü—f‘f˜Z¨¨d°9©oÓ>ˆGÜ—f‘f˜V S¨'Ó2×8Ñ8Ó:¸4¸CÐ@ˆGà�‰ð ð
 �X‰X�kÓ"Ò( b¨$¨3Ð/Ø�X‰X�gÓÒ$ " d sÐ+Ø�H‰H�U˜BÓØ�H‰H�Y Ó#Ø�X‰X�jÓ!Ò' R¨¨"Ð-Ø�D�SˆMØ�X‰X�fÓÒ#  T cÐ*ð
ô		ð ×%Ñ%¨Ñ)ˆá˜Ÿ™ Ô-Ü—{‘{ 4¨Ñ#4×#;Ñ#;Ó#=Ó>×HÑHÓJÈ3ÈBÐOˆHØ�L‰Lð ð ˜D Ñ-¨d¨sÐ3Ð4ô6ð 	�‰ŒÙØ�J‰JŒLØˆøäò ÙØ�J‰JŒLÜûðús   ’FF$ Æ$	G	Æ-GÇG	c                 óp  — t        j                  t        d¬«       |€Kt        j                  «       j                  d«      }t         j                  j                  t        d|› d�«      }t        |dd¬	«      5 }|j                  t        j                  | d
¬«      dz   «       ddd«       |S # 1 sw Y   |S xY w)u   å�•æ�¡è¿½åŠ åˆ° JSONL æ–‡ä»¶Tr¬   Nú%Y%m%d_%H%M%SÚcrawl_ú.jsonlÚaúutf-8©rC   F)Úensure_asciir�   )r±   r²   Ú
OUTPUT_DIRr   ÚnowÚstrftimer³   r˜   ÚopenÚwriteÚjsonÚdumps)rÍ   ÚfilepathrÜ   Úfs       r   Ú
save_jsonlrä   �  s�   € ä‡K�K”
 TÕ*ØÐÜ�l‰l‹n×%Ñ% oÓ6ˆÜ—7‘7—<‘<¤
¨f°S°E¸Ð,@ÓAˆÜ	ˆh˜ gÔ	.ð =°!Ø	�‰”—
‘
˜4¨eÔ4°tÑ;Ô<÷=à€O÷=à€Oús   Á7*B+Â+B5c                 óŒ  — t        j                  d«      rt        d| › �«       yt         j                  j	                  | «      st        d| › �«       yg }t        | d¬«      5 }|D �][  }|j                  «       }|sŒ	 t        j                  |«      }|j                  d«      xsN |j                  d«      xs; |j                  d	«      xs( |j                  d
«      xs |j                  d«      xs d}|sŒ‘|j                  |j                  d«      xs |j                  d«      xs d|||j                  d«      xs ddd |j                  d«      xs( |j                  d«      xs |j                  d«      xs d|j                  d«      xs ddd |j                  d«      xs d|j                  d«      xs ddœ«       �Œ^ 	 ddd«       |st        d| › �«       yt        ||xs |d   j                  d«      xs d¬«       t        dt        |«      › d| › �«       t        |«      S # t        $ r Y �ŒÑw xY w# 1 sw Y   ŒvxY w)u¬   è¯»å�– JSONL(å­—æ®µå…¼å®¹ url/page_url, date/pub_date/publish_date) å¹¶ç›´å†™ search.dbã€‚
    è®¾ç½® JSONL_PATH çŽ¯å¢ƒå�˜é‡�æ—¶è·³è¿‡(æµ‹è¯•æ¨¡å¼�)ã€‚è¿”å›žå…¥åº“æ�¡æ•°ã€‚Ú
JSONL_PATHu*     [TEST] JSONL_PATH å·²è®¾, è·³è¿‡å…¥åº“: r   u     [SKIP] JSONL ä¸�å­˜åœ¨: rØ   rÙ   Úpage_urlr   Ú
source_urlÚhrefÚlinkr   r¿   ÚsourcerÀ   NrÁ   Úpublish_daterÂ   Údater¼   r½   Úattachments)r¿   rè   r   rÀ   rÂ   r¼   r½   rî   u     [SKIP] JSONL ä¸ºç©º: Újsonl)Úbatch_labelu     [DB] å·²å…¥åº“ u
    æ�¡ from )r±   ÚgetenvÚprintr³   ÚexistsrÞ   r"   rà   ÚloadsrÌ   r@   r�   Úpush_to_searchdbÚlen)Ú
jsonl_pathrð   Úitemsrã   ÚlinerD   r   s          r   Úpush_jsonl_filerú   Œ  s  € ô 
‡y�y�ÔÜÐ:¸:¸,ÐGÔHØÜ�7‰7�>‰>˜*Ô%ÜÐ*¨:¨,Ð7Ô8ØØ€EÜ	ˆj 7Ô	+ð ¨qØó 	ˆDØ—:‘:“<ˆDÙØðÜ—J‘J˜tÓ$�ð —%‘%˜
Ó#Òr q§u¡u¨U£|Òr°q·u±u¸\Ó7JÒrÈaÏeÉeÐTZËmÒrÐ_`×_dÑ_dÐekÓ_lÒrÐprˆCÙØØ�L‰LØŸU™U ;Ó/ÒH°1·5±5¸³?ÒHÀbØ!ØØŸ%™% ›.Ò.¨B°°Ð5ØŸE™E .Ó1Ò]°Q·U±U¸:Ó5FÒ]È!Ï%É%ÐPVË-Ò]Ð[]ØŸE™E )Ó,Ò2°°D°SÐ9ØŸ5™5 Ó+Ò1¨rØ Ÿu™u ]Ó3Ò9°rñ	ö 	ñ	÷ñ, ÜÐ'¨
 |Ð4Ô5ØÜ�U¨Ò([°u¸Q±x·|±|ÀKÓ7PÒ([ÐT[Õ\Ü	Ðœc %›j˜\¨°J°<Ð
@ÔAÜˆu‹:Ðøô) ò Úðú÷ð ús1   Á"H:Á=H*ÂD2H:È*	H7È3H:È6H7È7H:È:Ic                 ó   — ddl m}  || «      S )u5   ä»Ž JSONL æ–‡ä»¶æ‰¹é‡�å¯¼å…¥ eia.dbï¼ˆå�¯å�•ç‹¬ç”¨ï¼‰r   )Úimport_jsonl)rÒ   rü   )râ   Ú_batch_imports     r   rü   rü   ³  s   € å;Ù˜Ó"Ð"r   c                 óú  — ddl m}m} d\  }}t        «       }t	        j
                  t        d¬«       t        j                  j                  t        dt        j                  «       j                  d«      › d�«      }	 ||¬	«      5 }
| D �ci c]  }|
j                  ||«      |“Œ }}t         ||«      d
«      D ]w  \  }}||   }	 |j                  «       }|rt        ||	«       t!        ||«       |d
z  }n|d
z  }|dz  dk(  s|t#        | «      k(  sŒXt%        d|› dt#        | «      › d|› d|› �«       Œy 	 ddd«       |j'                  «        t%        d|› d|› �«       ||fS c c}w #  |d
z  }Y ŒuxY w# 1 sw Y   Œ?xY w)uV   
    é€šç”¨æ‰¹é‡�å¹¶å�‘çˆ¬å�–ã€‚
    crawl_func(url) è¿”å›ž item dict æˆ– Noneã€‚
    r   )ÚThreadPoolExecutorÚas_completed©r   r   Tr¬   Úbatch_rÔ   rÖ   )Úmax_workersr   rM   z  [ú/u   ] âœ…u    â�ŒNu     âœ… å®Œæˆ�: æˆ�åŠŸu   , å¤±è´¥)Úconcurrent.futuresrÿ   r   rº   r±   r²   rÛ   r³   r˜   r   rÜ   rÝ   ÚsubmitÚ	enumerateÚresulträ   rÒ   rö   rò   rË   )ÚurlsÚ
crawl_funcÚworkersÚlabelrÿ   r   ÚokÚfailr¹   r÷   Úexr   ÚfuturesÚiÚfutrÍ   s                   r   Úbatch_crawlr  ½  s{  € ÷
 DØ�H€BˆÜ‹>€DÜ‡K�K”
 TÕ*Ü—‘—‘œj¨F´8·<±<³>×3JÑ3JÈ?Ó3[Ð2\Ð\bÐ*cÓd€Já	¨Ô	0ð @°BØ>BÖC°s�2—9‘9˜Z¨Ó-¨sÑ2ÐCˆÐCÜ¡¨WÓ 5°qÓ9ò 	@‰FˆAˆsØ˜#‘,ˆCð	Ø—z‘z“|�ÙÜ˜t ZÔ0Ü! $¨Ô-Ø˜!‘G‘Bà˜A‘I�Dð �2‰v˜Š{˜a¤3 t£9›nÜ˜˜A˜3˜a¤ D£	˜{¨%°¨t°4¸°vÐ>Õ?ñ	@÷@ð" 	‡J�J„LÜ	Ð    H¨T¨FÐ
3Ô4Øˆtˆ8€Oùò% DøðØ˜‘	’ú÷@ð @ús<   ÂE1Â
E Â$E1Ã5E%Ã9E1Ä"E1Å E1Å%E.Å,E1Å1E:zroot@1.94.217.116)4u   è�¯å“�u   åˆ¶è�¯õ   åŒ»è�¯u   è�¯ä¸šu   è�¯æ¢°ÚAPIsÚAPIÚGMPÚcGMPu   ç–«è‹—u   ç”Ÿç‰©åˆ¶å“�u	   å¹²ç»†èƒžu   æŠ—ä½“u   åŸºå› u   è¯Šæ–­è¯•å‰‚u   åŒ»ç–—å™¨æ¢°r  u   èƒ¶åŽŸè›‹ç™½u	   å�•å…‹éš†u   è¡€æµ†u	   èƒ°å²›ç´ u	   é€ å½±å‰‚u	   ç¼�å�ˆçº¿u   å¯¼ç®¡u	   å†…çª¥é•œu	   èµ·æ��å™¨u   é€�æž�u   ç¥žç»�å¤–ç§‘u   ç‰‡å‰‚u   ä¸¸å‰‚u   èƒ¶å›Šu   è½¯è†�u	   æ³¨å°„å‰‚u	   æ³¨å°„å™¨u	   å�£æœ�æ¶²u   è¾…æ–™ÚCDMOu   å¤šè‚½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	   LNGç»ˆç«¯ÚLNGu   å¤©ç„¶æ°”ç»ˆç«¯u   å¤©ç„¶æ°”å‚¨å­˜ç»ˆç«¯u   æ²¹åº“u   ç½�åŒºu   åŽŸæ²¹å‚¨ç½�u   æˆ�å“�æ²¹ç½�u   å‚¨è¿�u   æˆ�å“�æ²¹ä»“å‚¨ç �å¤´u	   ç”µç…¤æ¸¯u	   ç…¤ç‚­æ¸¯u   æ²¹å“�ç �å¤´u   åŽŸæ²¹ç �å¤´u   æˆ�å“�æ²¹ç �å¤´u	   LNGç �å¤´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   åŠ æ°¢è£‚åŒ–ÚFCC)u   ç”Ÿç‰©æŸ´æ²¹u   ç”Ÿç‰©ä¹™é†‡u   å�¯æŒ�ç»­èˆªç©ºç‡ƒæ–™u   æ²¼æ°”u   ç‡ƒæ–™ç”µæ± u   ä¹™é†‡ç‡ƒæ–™u   ç”²é†‡ç‡ƒæ–™ÚSAFu   ç”Ÿç‰©è´¨é¢—ç²’u   ç”Ÿç‰©è´¨ç‡ƒæ–™u   ç”Ÿç‰©è´¨æˆ�åž‹u   ç”Ÿç‰©è´¨èƒ½u   ç”Ÿç‰©è´¨æ°”åŒ–)u   å�‘ç”µu   ç”µç«™u   å…‰ä¼�u   é£Žç”µu	   å¤ªé˜³èƒ½u   å‚¨èƒ½ÚBESSÚCAESÚCSPu	   å�˜ç”µç«™u	   å�˜ç”µæ‰€u	   è¾“å�˜ç”µu   è¾“ç”µu   ç”µç½‘u   æ ¸ç”µu	   æ°´ç”µç«™u   æŠ½æ°´è“„èƒ½u   åŽ‹ç¼©ç©ºæ°”å‚¨èƒ½u   ç…¤ç”µu   ä¾›çƒ­u   ç”Ÿç‰©è´¨å�‘ç”µu   ç”Ÿç‰©è´¨é”…ç‚‰u   ç”Ÿç‰©è´¨çƒ­ç”µ)Hu   é‡‘å±žä¸ŽçŸ¿ç‰©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   ç ‚æµ†u   å•†ç ¼u   æ²¥é�’æ··å‡�åœŸu   æ°´æ³¥åˆ¶å“�u	   æ�…æ‹Œç«™u   é¢„æ‹Œç ‚æµ†)u   çº¸æµ†u   é€ çº¸u   çº¸æ�¿u   æœ¨æ��u   æœ¨ä¸šu	   äººé€ æ�¿u   ç“¦æ¥žu	   åˆ¨èŠ±æ�¿u	   èƒ¶å�ˆæ�¿u   çº¸åŽ‚u	   å�°åˆ·å“�u   å�°åˆ·åŒ…è£…u	   çº¸åŒ…è£…)1u   é£Ÿå“�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	   é¥²æ–™åŽ‚)ku   åºŸçŸ¿ç‰©æ²¹u   åŒ–å·¥u	   åŒ–å­¦å“�u   æ ‘è„‚u	   è�šå�ˆç‰©u	   è�šä¹™çƒ¯u	   è�šä¸™çƒ¯ÚPVCÚPETÚPTAÚABSÚEVAÚHDPEÚLDPEu   PEç®¡ÚPPRu   å¡‘æ–™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   ç‚”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	   å…‰åˆ»èƒ¶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   å…‰å­¦)ÚpharmaÚ
productionÚtransmissionÚ	terminalsÚportÚhpiÚaltfuelÚpowerÚmetalsÚpulpÚfoodÚcpiÚ	logisticsÚmanufacturing)u   åŒ»ä¿�u   è�¯åº—u   åŒ»è�¯æœºæž„u   å®šç‚¹é›¶å”®u   é›¶å”®è�¯åº—u   åŒ»ä¿�æœ�åŠ¡å��è®®u   åŒ»ä¿�å®šç‚¹u   é›†é‡‡è�¯å“�é”€å”®u   è�¯å“�ç»�è�¥u   è�¯å“�ä»·æ ¼u   é—¨è¯Šæ…¢æ€§ç—…u   åŒ»ç–—ä¿�éšœu   åŒ»ä¿�ç›®å½•u   è�¯å¸ˆu   æ‰§ä¸šè�¯å¸ˆc           	      óŠ  ‡— | sy| j                  «       Št        D ]  }|j                  «       ‰v sŒ y d‰v sd‰v r"‰j                  dd«      j                  dd«      Šg }t        j	                  «       D ]7  \  }}|D ]-  }|j                  t        |«      ||j                  «       f«       Œ/ Œ9 |j                  d„ ¬«       d‰v ret        j	                  «       D ���cg c]/  \  }}|D ]%  }|j                  d«      sŒt        |«      dk\  sŒ$|‘Œ' Œ1 }}}}t        ˆfd	„|D «       «      sy
|D ]  \  }}}|‰v sŒ|c S  yc c}}}w )zTClassify a title into industry id (English). Longest keyword wins, case-insensitive.Úotheru   é“œæ¢�u   é“œä»�õ   Â·c                 ó   — | d    S )Nr   © )Úxs    r   r   z#classify_industry.<locals>.<lambda>  s   € ˜a ™d˜U€ r   )Úkeyr(  r'   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©Nr;  )Ú.0Úkwrš   s     €r   ú	<genexpr>z$classify_industry.<locals>.<genexpr>  s   øè ø€ Ò4˜r�2˜”7Ñ4ùs   ƒr6  )
ÚlowerÚADMIN_EXCLUDEÚreplaceÚINDUSTRY_KEYWORDSrø   r�   rö   ÚsortÚendswithÚany)	rÀ   rA  ÚpairsÚind_idÚkwsÚindÚexisting_goodsÚ_lenrš   s	           @r   Úclassify_industryrP     sO  ø€ áØØ�‰‹€Aäò ˆØ�8‰8‹:˜Š?Ùðð �1�}˜ A™Ø�I‰I�h Ó%×-Ñ-¨h¸Ó=ˆØ€EÜ(×.Ñ.Ó0ò 8‰ˆ�Øò 	8ˆBØ�L‰Lœ#˜b›' 6¨2¯8©8«:Ð6Õ7ñ	8ð8ð 
‡J�J‘?€JÔ#à�1�}Ü->×-DÑ-DÓ-F×Ð¡  cÐQTÒÈ2ÐXZ×XcÑXcÐdlÕXmÔruÐvxÓryÐ}~Ór~š"Ð˜"ÐˆÒÜÓ4 ^Ô4Ô4Ø"Ø!ò Ñˆˆf�bØ�Š7ØŠMðð ùô @s   ÃD>Ã<D>ÄD>ÚSEARCHDB_REFRESHÚ1c                 óX  — | st        d«       yddl}ddl}ddl}ddl}ddlm} d} |j                  d|«      } |j                  |«      }	|	j                  d«       |	j                  d«       |	j                  d	«       |	j                  d
«       dD ]  }
	 |	j                  d|
› d�«       Œ ddl	}|j                  j                  |j                  d   xs d«      }|j                  d«      sXt        |j                  j!                  d«      dd«      xs d}|j                  j                  |«      }|j                  d«      sd}|	j                  d«       |	j                  d«       |	j                  d«       |	j                  d«       |	j#                  «        d\  }}d}| D �]‹  }	 |j!                  dd«      }t%        |«      }|j!                  dd«      xs d}t'        t)        ||j!                  d«      xs d«      «      }|j!                  d«      xs d}t)        ||j!                  d«      xs d«      }|r||dd k(  s||k(  r|dd }|j!                  dd«      |j!                  dd«      |j!                  dd«      |j!                  d«      xs ddd ||dd |d |j!                  d!d«      |j!                  d"d«      ||j!                  d#d«      |j!                  d$d«      d%|j!                  d«      xs dv rd&ndt+        |j!                  d«      xs d«      d'œ}|d   |d   |d(   |d   dd |d)   |d   dd |d   |d*   |d!   |d"   |d#   |d+   |d,   |d$   |d-   f}d}t,        r�|d(   r#|	j                  d.|dd/ |d0d z   |d/   fz   «      }nF|	j                  d1|d   |d2   |d3   |d4   |d5   |d6   |d7   |d8   |d9   |d:   |d;   |d<   |d&   f«      }|j.                  r|j.                  dkD  r|d&z  }�ŒT|	j                  d=|«      }|j.                  r|j.                  dkD  r|d&z  }n|d&z  }�ŒŽ |	j#                  «        	 | D ]H  }|	j                  d?|j!                  dd«      f«      j3                  «       }|sŒ7|	j                  d@|«       ŒJ |	j#                  «        t        dA|› dB|› �t,        rdC|› �ndz   dDz   «       t5        dF„ | D «       «      }|rit        dG|› dHt7        | «      › dI�«       | D ]I  }|j!                  dd«      j9                  «       rŒ$|j!                  d«      xs dddJ }t        dK|› �«       ŒK |	j;                  «        y#  Y �ŒÃxY w# t0        $ r}|d&z  }t        d>|› �«       Y d}~�Œ×d}~ww xY w# t0        $ r}t        dA|› dB|› dE|› �«       Y d}~Œâd}~ww xY w)Lz3Write directly to search.db (local version, no SSH)z  [SKIP] no dataNr   )r   z/root/search.dbÚ	SEARCH_DBr®   r¯   r°   aâ  CREATE TABLE IF NOT EXISTS gov_raw (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        site_name TEXT, source_url TEXT UNIQUE, page_url TEXT,
        title TEXT, publish_date TEXT, summary TEXT,
        content TEXT, status TEXT, category TEXT, tags TEXT,
        industry TEXT DEFAULT '', script_name TEXT DEFAULT '',
        attachments TEXT DEFAULT '', group_name TEXT DEFAULT '',
        has_table INTEGER DEFAULT 0, date_rank TEXT DEFAULT '', visits INTEGER DEFAULT 0
    ))Úscript_namerî   Ú
group_nameÚ	has_tableÚ	date_rankÚvisitszALTER TABLE gov_raw ADD COLUMN z TEXT DEFAULT ''r   z.pyÚ__main__Ú__file__zsCREATE VIRTUAL TABLE IF NOT EXISTS gov_search USING fts5(
        title, site_name, summary, tokenize=trigram
    )zÓCREATE TRIGGER IF NOT EXISTS trg_gov_raw_fts_ins AFTER INSERT ON gov_raw BEGIN
      INSERT INTO gov_search(rowid, title, site_name, summary)
      VALUES (new.id, new.title, new.site_name, new.summary);
    ENDz‰CREATE TRIGGER IF NOT EXISTS trg_gov_raw_fts_del AFTER DELETE ON gov_raw BEGIN
      DELETE FROM gov_search WHERE rowid = old.id;
    ENDa  CREATE TRIGGER IF NOT EXISTS trg_gov_raw_fts_upd AFTER UPDATE ON gov_raw BEGIN
      DELETE FROM gov_search WHERE rowid = old.id;
      INSERT INTO gov_search(rowid, title, site_name, summary)
      VALUES (new.id, new.title, new.site_name, new.summary);
    ENDr  rÂ   r½   rÀ   r¼   r¾   r¿   rè   r   rÁ   Úactiver   rÃ   rî   rV  z<tabler   )r¿   rè   rç   rÀ   rì   r¼   r½   Ústatusr   rÃ   rU  rî   rV  rW  Úindustryrç   rì   r]  r^  rU  rW  a/  UPDATE gov_raw SET
                        site_name=?, source_url=?, title=?, publish_date=?, summary=?, content=?,
                        status=?, category=?, tags=?, attachments=?, industry=?,
                        script_name=?, group_name=?, has_table=?
                        WHERE page_url=?r&   r'   a7  UPDATE gov_raw SET
                        site_name=?, publish_date=?, summary=?, content=?,
                        status=?, category=?, tags=?, attachments=?, industry=?,
                        script_name=?, group_name=?, has_table=?
                        WHERE source_url=? AND COALESCE(page_url,'')=''r(   r)   r*   é   é   é	   rM   é   rI   é   é   a,  INSERT OR IGNORE INTO gov_raw
                (site_name, source_url, page_url, title, publish_date,
                 summary, content, status, category, tags, attachments, industry, script_name,
                 group_name, has_table)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)z    [WARN] insert error: zDSELECT id, title, site_name, summary FROM gov_raw WHERE source_url=?zSINSERT OR IGNORE INTO gov_search(rowid, title, site_name, summary) VALUES (?,?,?,?)z  [DB] new:z skip:z refreshed:z FTS syncedz FTS ERROR: c              3   ób   K  — | ]'  }|j                  d d«      j                  «       rŒ$d–— Œ) y­w)r½   r   r   N)r@   r"   )r@  rÍ   s     r   rB  z#push_to_searchdb.<locals>.<genexpr>±  s&   è ø€ ÒQ˜D°·±¸)ÀRÓ1H×1NÑ1NÕ1P”aÑQùs   ‚%/¨/u     âš ï¸�  æ­£æ–‡ä¸ºç©º: r  u    æ�¡é<   u         ç©º: )rò   r¶   r    r±   rà   r   rñ   r·   r¸   Úsysr³   ÚbasenameÚargvrH  r‘   Úmodulesr@   rÊ   r9   r^   r$   rP  Ú_REFRESH_MODEÚrowcountrÌ   ÚfetchoneÚsumrö   r"   rË   )rø   rð   r¶   r    r±   rà   r   Ú
default_dbÚdb_pathÚdbÚ_colrg  Úcaller_scriptÚ_mfr  ÚskipÚ	refreshedrÍ   r4   Ú	norm_dateÚ_raw_contentÚ_html_contentÚ_raw_summaryÚ_html_summaryÚentryÚ_valsÚ_currÑ   rD   Úempty_countrÀ   s                                  r   rõ   rõ     s<  € áÜÐ Ô!Øç × Ý!à"€JØˆb�i‰i˜ ZÓ0€GØ	ˆ�‰˜Ó	!€BØ‡J�JÐ(Ô)Ø‡J�JÐ+Ô,Ø‡J�JÐ*Ô+à‡J�Jð 	ô 
ð aò ˆð	Ø�J‰JÐ8¸¸Ð>NÐOÕPðó
 Ø—G‘G×$Ñ$ S§X¡X¨a¡[Ò%6°BÓ7€MØ×!Ñ! %Ô(ô �c—k‘k—o‘o jÓ1°:¸rÓBÒHÀbˆØŸ™×(Ñ(¨Ó-ˆØ×%Ñ% eÔ,ØˆMØ‡J�Jð 	ô 
ð ‡J�Jð ô ð ‡J�Jð ô ð ‡J�Jð ô ð
 ‡I�I„Kà�H€BˆØ€IØó H3ˆðG	3Ø—x‘x 
¨BÓ/ˆHÜ*¨8Ó4ˆIàŸ8™8 I¨rÓ2Ò8°bˆLô /Ô/?ÀÈdÏhÉhÐW^ÓN_ÒNeÐceÓ/fÓgˆMØŸ8™8 IÓ.Ò4°"ˆLÜ,¨\¸4¿8¹8ÀGÓ;LÒ;RÐPRÓSˆMÙ  M°\À$À3Ð5GÒ$GÈ=Ð\hÒKhØ -¨d¨sÐ 3�ð "ŸX™X k°2Ó6Ø"Ÿh™h |°RÓ8Ø ŸH™H U¨BÓ/ØŸ(™( 7Ó+Ò1¨r°4°CÐ8Ø )Ø(¨¨#Ð.Ø(Ø"Ø ŸH™H Z°Ó4ØŸ™ ¨Ó,Ø,Ø#Ÿx™x¨°rÓ:Ø"Ÿh™h |°RÓ8Ø"*¨t¯x©x¸	Ó/BÒ/HÀbÑ"I™QÈqÜ-¨d¯h©h°wÓ.?Ò.EÀ2ÓFñˆEð& �kÑ" E¨,Ñ$7¸¸zÑ9JØ�g‘˜t Ð$ e¨NÑ&;Ø�iÑ   #Ð&¨¨iÑ(8Ø�h‘  zÑ!2°E¸&±MØ�mÑ$ e¨JÑ&7Ø�mÑ$ e¨LÑ&9¸5ÀÑ;MðˆEð ˆDÝà˜Ò$ØŸ:™:ð ',ð .3°2°A¨Y¸¸q¸r¸Ñ-BÀeÈAÁhÀ[Ñ-Pó	R‘Dð Ÿ:™:ð 'Kð
 ˜q™ 5¨¡8¨U°1©X°u¸Q±xÀÀqÁÈ5ÐQRÉ8ÐUZÐ[\ÑU]Ø˜r™ E¨"¡I¨u°R©y¸%À¹)ÀUÈ2ÁYÐPUÐVWÑPXðZó[�Dð —=’= T§]¡]°QÒ%6Ø ‘N�IÙà—:‘:ð Dð FKó	LˆDð
 �}Š} §¡°Ò!2Ø�a‘‘à˜‘	�ùðKH3ðT ‡I�I„Kð	=Øò 	uˆDØ—
‘
ÐaØ ŸH™H \°2Ó6Ð8ó:ß:B¹(»*ð âØ—
‘
ÐpÐrsÕtð		uð
 	�	‰	ŒÜ�˜B˜4˜v d VÐ,Í]°+¸i¸[Ñ0IÐ`bÑcÐfsÑsÔtô
 ÑQ EÔQÓQ€KÙÜÐ(¨¨°Q´s¸5³z°lÀ$ÐGÔHØò 	-ˆDØ—8‘8˜I rÓ*×0Ñ0Õ2ØŸ™ 'Ó*Ò0¨b°#°2Ð6�Ü˜ E 7Ð+Õ,ð	-ð
 ‡H�H…JøðA	ÚûôH ò 	3Ø�A‰IˆDÜÐ-¨a¨SÐ1×2Ò2ûð	3ûô ò =Ü�˜B˜4˜v d V¨<¸°sÐ;×<Ñ<ûð=úsJ   ÂUÆ(IUÏ78UÑ8V Ñ<AV ÕUÕ	U?Õ!U:Õ:U?Ö	V)ÖV$Ö$V))r   )é   rØ   r?  )r)   u   æ‰¹é‡�)Úcrawl)GÚ__doc__rà   r±   r    r¶   rÆ   ÚtimeÚ
subprocessÚtempfiler   r   r   Úurllib.parser   r?   ÚwarningsÚfilterwarningsÚpackagesÚurllib3Ú
exceptionsÚInsecureRequestWarningr³   r´   Úabspathr[  ÚBASE_DIRr˜   rµ   rÛ   rÜ   ÚutcrÝ   ÚTHREE_YEARS_AGOrA   Úcompiler/   r[   rN   rO   rP   r3   r$   r9   rE   rK   rT   rZ   rX   rY   r\   r^   r’   r›   rž   r¥   r©   rº   rÒ   rä   rú   rü   r  ÚSERVERÚPASSWORDrF  ÚINDUSTRY_ORDERrD  rP  rñ   rk  rõ   r;  r   r   ú<module>r•     sº  ðñ÷$ B× A× A× Aß 2Ñ 2Ý  ã Û Ø €× Ñ ˜¨8×+<Ñ+<×+DÑ+D×+OÑ+O×+fÑ+fÕ gà�7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø	�‰�‰�h Ó	)€Ø�W‰W�\‰\˜( HÓ-€
à�8—<‘< §¡Ó-±	¸uÔ0EÑE×OÑOÐPZÓ[€ð ð  Dð€ð
 ˆ"�*‰*ð+ó€ð ˆB�J‰JØpØ‡D�Dó€	ð ˆR�Z‰ZØ_Ø‡D�Dó€
ð ˆ2�:‰:Ð?Ó@€ð ˆr�z‰zÐFÓG€óò8'ðR �W‰W�\‰\˜( HÓ-€
ó	ò 'ò ðN �"—*‘*ÐTÐVX×VZÑVZÐ]_×]aÑ]aÑVaÓb€Ø�—‘ÐNÐPR×PTÑPTÐWY×W[ÑW[ÑP[Ó\€ð �—‘ØRÐTV×TXÑTXóZ€òò8*€òò4
ò"
òòó2óró%òN#óðJ 
€Ø€ò t	ò PÚ|ò lò }Úmò fò iò Kò dò aò DÚxò uñÐ ò" i€ò€òð6 �—	‘	Ð,Ó-°Ñ4€ô\r   