Ë
    ¸¬ujg:  ã                   óò  — 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 dZdZdZdZdZd	Zej(                  j+                  d
d«      Zej(                  j+                  dd«      ZdZdZdZ ej6                  dej8                  ej:                  z  «      ZddddœZdZ  e!ejD                  «      D ]k  \  Z#Z$e$jK                  d«      r	  e&e$jO                  dd«      d   «      Z Œ4e$dk(  sŒ:e#dz    e)ejD                  «      k  sŒS	  e&ejD                  e#dz      «      Z Œm e dk\  re ndZ*d„ Z+d„ Z,d„ Z-d„ Z.d„ Z/d„ Z0d „ Z1d!„ Z2e3d"k(  r e2«        yy# e$ r dZY �Œ5w xY w# e($ r Y Œ²w xY w# e($ r Y Œ½w xY w)#u7  
crawl_huaxi_tzgg.py - èŠ±æºªåŒºäººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Š
https://www.huaxi.gov.cn/xwzx/tzgg/
æ”¿åºœç«™é€šç”¨æ¨¡æ�¿: åˆ—è¡¨ {year}{month}/t{date}_{id}.html, åˆ†é¡µ index_{N}.html
åˆ—è¡¨: div.right-list-box ul > li
  <li><a target="_blank" href="https://www.huaxi.gov.cn/xwzx/tzgg/202608/t20260804_90693012.html" title="å®Œæ•´æ ‡é¢˜">æ ‡é¢˜</a>
      <span>2026-08-04  15:52</span></li>
åˆ†é¡µ: createPageHTML(56, 0, "index", "html", 839) â†’ index_{N}.html, å…±56é¡µ 839æ�¡
è¯¦æƒ…: meta ArticleTitle + meta PubDate (YYYY-MM-DD HH:MM)
  æ ‡é¢˜: div.Article_bt / meta ArticleTitle
  æ—¥æœŸ: meta PubDate å�– YYYY-MM-DD
  æ­£æ–‡: div.Article_zw (å†…å�« div#Zoom > div.zw-con > div.trs_editor_view TRS_UEDITOR)
  é™„ä»¶: <a appendix="true" href="./xxx.pdf" oldsrc="/protect/...">é™„ä»¶å��</a> (oldsrc æ‰�æ˜¯çœŸå®žç»�å¯¹è·¯å¾„)
é    N)ÚBeautifulSoupzhttps://www.huaxi.gov.cnz#https://www.huaxi.gov.cn/xwzx/tzgg/z4https://www.huaxi.gov.cn/xwzx/tzgg/index_{page}.htmlu"   èŠ±æºªåŒºäººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šu   è´µå·žzcrawl_huaxi_tzgg.pyÚDB_PATHz/mnt/data/search.dbÚ
JSONL_PATHÚ úutf-8zmeta:ArticleTitlezdiv.Article_zwz}<li>\s*<a[^>]*href="([^"]+/xwzx/tzgg/\d{6}/t\d+_\d+\.html)"[^>]*title="([^"]*)"[^>]*>(.*?)</a>\s*<span>\s*(\d{4}-\d{2}-\d{2})zkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9)z
User-AgentÚAcceptzAccept-Languageé   z--pages=ú=z--pagesc                 ó2  — | syt        j                  | «      } | j                  dd«      j                  dd«      j                  dd«      j                  dd«      } t        j                  dd| «      } t        j                  dd| «      } | j                  «       S )	Nr   u   â€‹u   â€Œu   â€�u   ï»¿u3   ^\s*(?:&middot;|Â·|\u00b7)?\s*(?:&nbsp;|\u00a0)?\s*ú\s+ú )Úhtml_libÚunescapeÚreplaceÚreÚsubÚstrip)Úts    ú%/root/gov_crawler/crawl_huaxi_tzgg.pyÚclean_titler   F   s‚   € ÙØÜ×Ñ˜!Ó€AØ	�	‰	�(˜BÓ×'Ñ'¨°"Ó5×=Ñ=¸hÈÓK×SÑSÐT\Ð^`Óa€AÜ
�‰ÐEÀrÈ1ÓM€AÜ
�‰ˆv�s˜AÓ€AØ�7‰7‹9Ðó    c                 óœ   — |dk(  rt         nt        j                  |¬«      }| j                  |t        dd¬«      }d|_        |j                  S )Nr	   )Úpageé   F©ÚheadersÚtimeoutÚverifyr   )ÚLIST_URL_P1ÚLIST_URL_PNÚformatÚgetÚHEADERSÚencodingÚtext)Úsessionr   ÚurlÚrs       r   Ú
fetch_listr)   P   sC   € Ø š�+¬×(:Ñ(:ÀÐ(:Ó(E€CØ�‰�C¤°"¸UˆÓC€AØ€A„JØ�6‰6€Mr   c                 óH  — g }t         j                  | «      D ]‡  }|j                  d«      }t        |j                  d«      «      }|j                  d«      }|rt	        |«      dk  rŒPt
        j                  j                  t        |«      }|j                  |||f«       Œ‰ |S )Nr	   é   é   )
ÚLIST_ITEM_REÚfinditerÚgroupr   ÚlenÚurllibÚparseÚurljoinr   Úappend)Ú	html_textÚitemsÚmÚhrefÚtitleÚdateÚabs_urls          r   Ú
parse_listr<   W   s�   € Ø€EÜ×"Ñ" 9Ó-ò -ˆØ�w‰w�q‹zˆÜ˜AŸG™G A›JÓ'ˆØ�w‰w�q‹zˆÙœ˜E›
 QšØÜ—,‘,×&Ñ&¤{°DÓ9ˆØ�‰�g˜u dÐ+Õ,ð-ð €Lr   c           	      óü  — d}d}d}t         �r†t        | d«      }t        j                  d«      rqt        j                  dd«      d   }|j	                  ddt        j                  |t
        j                  «      i¬«      }|r|j                  d	«      rt        |d	   «      }|s/|j                  d
«      }|rt        |j                  dd¬«      «      }|j	                  ddt        j                  dt
        j                  «      i¬«      }	|	rK|	j                  d	«      r:t        j                  d|	d	   j                  «       «      }
|
r|
j                  d«      }t        r9|j                  t        «      }|r"dj!                  d„ |j"                  D «       «      }|sct        j$                  d| «      }
|
rK|
j                  d«      › dt'        |
j                  d«      «      d›dt'        |
j                  d«      «      d›�}|||fS )Nr   úhtml.parserzmeta:ú:r	   ÚmetaÚname)ÚattrsÚcontentzdiv.Article_btr   T©r   zPubDate|publishdatez(\d{4}-\d{2}-\d{2})c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w)N)Ústr)Ú.0Úcs     r   ú	<genexpr>zparse_detail.<locals>.<genexpr>{   s   è ø€ Ò&C°!¤s¨1§vÑ&Cùs   ‚u'   (\d{4})[-å¹´/](\d{1,2})[-æœˆ/](\d{1,2})ú-r+   Ú02dé   )r   ÚDTITLE_MODEÚ
startswithÚsplitÚfindr   ÚcompileÚIr"   r   Ú
select_oneÚget_textÚmatchr   r/   ÚDCONTENT_SELÚjoinÚcontentsÚsearchÚint)r5   Úpage_urlr9   r:   Úcontent_htmlÚsouprA   ÚmtÚbtÚmdÚdmÚels               r   Úparse_detailrc   d   s§  € Ø€EØ€DØ€LÞÜ˜Y¨Ó6ˆÜ×!Ñ! 'Ô*Ü×$Ñ$ S¨!Ó,¨QÑ/ˆDØ—‘˜6¨&´"·*±*¸TÄ2Ç4Á4Ó2HÐ)I�ÓJˆBÙ�b—f‘f˜YÔ'Ü# B y¡MÓ2�ÙØ—‘Ð!1Ó2ˆBÙÜ# B§K¡K°¸4 KÓ$@ÓA�Ø�Y‰Y�v f¬b¯j©jÐ9OÔQS×QUÑQUÓ.VÐ%WˆYÓXˆÙ�"—&‘&˜Ô#Ü—‘Ð0°"°Y±-×2EÑ2EÓ2GÓHˆBÙØ—x‘x “{�ÝØ—‘¤Ó.ˆBÙØ!Ÿw™wÑ&C°r·{±{Ô&CÓC�ÙÜ�Y‰YÐAÀ9ÓMˆÙØ—h‘h˜q“k�] !¤C¨¯©°«Ó$4°SÐ#9¸¼3¸r¿x¹xÈ»{Ó;KÈCÐ:PÐQˆDØ�$˜Ð$Ð$r   c                 ó†  ‡‡‡‡ — | sddg fS t        j                  dd| t         j                  ¬«      } t        j                  dd| t         j                  ¬«      } t        j                  dd| t         j                  t         j                  z  ¬«      } t        j                  dd| t         j                  t         j                  z  ¬«      } g Ši Št        j                  dd| «      } t        j                  d	d| «      } t        �r‰	 t	        | d
«      }|j                  dd¬«      D �]?  }|j                  d«      sG|j                  d«      s6t        j                  d|j                  dd«      t         j                  «      sŒ\|d   }|j                  d«      xs |}|j                  d¬«      xsW |j                  d«      xsD |j                  d«      xs1 t        j                  j                  |j                  d«      d   «      }t        j                  j                  ‰|«      }‰j!                  ||f«       dt#        ‰«      › d�}d|› d|› d�‰|<   |j%                  |«       �ŒB |j                  d«      D �]  }	|	j                  d«      }
|
sŒ|	j                  d¬«      rŒ+g }|
D ]˜  }|j                  d«      xs |j                  d«      xs d}|sŒ.t        j                  j                  ‰|«      }|j!                  d|› dt        j                  j                  |j                  d«      d   «      xs d› d�«       Œš |sŒÍd t#        ‰«      › d�}d!d"j'                  |«      z   d#z   ‰|<   |	j%                  |«       �Œ	 t)        |«      } ˆˆˆfd$„}t        j                  d%|| t         j                  t         j                  z  ¬«      } t        rQ	 t	        | d
«      }|j                  d«      D ]%  }d&D ]  }|j,                  j/                  |d «       Œ  Œ' t)        |«      } g Š ˆ fd'„}t        j                  d(| t         j                  «      rd)nd}t        j                  d*|| t         j                  t         j                  z  ¬«      } t        j                  d#d+| t         j                  ¬«      } t        j                  d,d-| t         j                  ¬«      } t        j                  d.d| t         j                  ¬«      } g }| j                  d/«      D �]W  }|j1                  «       }|sŒt        j                  d0d|«      }t        j                  d1d|«      }|j3                  d2d«      j3                  d3d4«      }t        j                  d5d4|«      }t        j                  d6d|«      }t5        j6                  |«      }|j3                  d7d4«      j3                  d8d4«      }t        j                  d9d|«      }|sŒæ‰j9                  «       D ]  \  }}|j3                  ||«      }Œ t;        ‰ «      D ]  \  }}|j3                  d:|› d�|«      }Œ |j!                  |j1                  «       «       �ŒZ d/j'                  |«      }‰j9                  «       D ]  \  }}|j3                  ||«      }Œ t;        ‰ «      D ]  \  }}|j3                  d:|› d�|«      }Œ t        j                  d;d|«      }t        j                  d<d|«      }t        j                  d=d|«      }t        j                  d>d|«      }t5        j6                  |«      }t        j                  d?d-|«      }t        j                  d@d/|«      }t        j                  d5d4|«      }t=        «       }g }|j                  d/«      D ]X  }	t        j                  dAdt        j                  d6d|	«      «      }|sŒ2||v rŒ7|j?                  |«       |j!                  |	«       ŒZ d/j'                  |«      j1                  «       }||‰fS # t*        $ r Y �Œ£w xY w# t*        $ r Y �Œw xY w)BNr   r   z
<!--.*?-->)Úflagsz<meta[^>]*>z<script[^>]*>.*?</script>z<style[^>]*>.*?</style>u   ã€�å­—å�·ï¼š[^ã€‘]*ã€‘u'   å�‘å¸ƒ(?:æ—¶é—´|æ—¥æœŸ)[:ï¼š][^<]{0,30}r>   ÚaT)r8   Úappendixzdata-appendixz\.(pdf|docx?|xlsx?|zip|rar|wps)r8   ÚoldsrcrD   Ú_titler9   ú?Ú
__ATTACH__Ú__ú	<a href="ú" target="_blank">ú</a>ÚpÚimgÚsrcu   å›¾ç‰‡Ú__IMG__z<p>z<br/>z</p>c                 ó8  •— | j                  d«      }|j                  d«      ry| j                  d«      }t        j                  dd|«      }t	        j
                  |«      j                  «       }t        j                  dd|«      j                  «       }|s5t        j                  j                  |j                  d«      d   «      xs d	}t        j                  j                  ‰|«      }‰j                  ||f«       d
t        ‰«      › d�}d|› d|› d�‰|<   |S )Nr	   zjavascript:r   r+   ú<[^>]+>u   ^é™„ä»¶[:ï¼š]\s*rj   r   u   é™„ä»¶Ú__LINK__rl   rm   rn   ro   )r/   rN   r   r   r   r   r   ÚosÚpathÚbasenamerO   r1   r2   r3   r4   r0   )	r7   r8   ÚinnerÚtxtr;   ÚkeyÚattachmentsÚlink_protectr[   s	         €€€r   Ú
_link_replz html_to_text.<locals>._link_repl±   s÷   ø€ Ø�w‰w�q‹zˆØ�?‰?˜=Ô)ØØ—‘˜“
ˆÜ�f‰f�Z  UÓ+ˆÜ×Ñ Ó$×*Ñ*Ó,ˆÜ�f‰fÐ(¨"¨cÓ2×8Ñ8Ó:ˆÙÜ—'‘'×"Ñ" 4§:¡:¨c£?°1Ñ#5Ó6ÒB¸(ˆCÜ—,‘,×&Ñ& x°Ó6ˆØ×Ñ˜G S˜>Ô*Øœ˜\Ó*Ð+¨2Ð.ˆØ'¨ yÐ0BÀ3À%ÀtÐLˆ�SÑØˆ
r   z&<a\s[^>]*href="([^"]+)"[^>]*>(.*?)</a>)ÚstyleÚclassÚlangÚdirÚalignÚvalignÚwidthÚheightÚborderÚcellpaddingÚcellspacingc                 óh   •— ‰j                  | j                  d«      «       dt        ‰«      dz
  › d�S )Nr   Ú__TBL__r	   rl   )r4   r/   r0   )r7   Útable_protects    €r   Ú	_tbl_replzhtml_to_text.<locals>._tbl_replÍ   s3   ø€ Ø×Ñ˜QŸW™W Q›ZÔ(Øœ˜]Ó+¨AÑ-Ð.¨bÐ1Ð1r   z<table[^>]*>r	   z<table[^>]*>.*?</table>z</p>

z	<br\s*/?>ú
z(</?(?:span|font|o:p|st1?:[a-z]+)\b[^>]*>z

z(?<=>)\s*[\r\n\t]+\s*z\s*[\r\n\t]+\s*(?=<)úú	r   z	[ \t]{2,}ru   õ   Â z&nbsp;z[\s\u200b\u200c\u200d\ufeff]+rŒ   z__LINK__\d+__z__TBL__\d+__z__IMG__\d+__z__ATTACH__\d+__z[ \t]+\nz\n{3,}r   ) r   r   ÚSrR   r   Úfind_allr"   rY   rT   rw   rx   ry   rO   r1   r2   r3   r4   r0   Úreplace_withrW   rF   Ú	ExceptionrB   Úpopr   r   r   r   r6   Ú	enumerateÚsetÚadd)!rC   r[   Ú_souprf   r8   Ú	real_hrefr{   r;   r|   rp   ÚimgsÚsrcsrq   rr   r   ÚtagÚattrrŽ   Ú	has_tableÚpartsÚblockÚbÚplainÚkÚvÚiÚtblÚoutÚseenÚfinalr}   r~   r�   s!    `                            @@@r   Úhtml_to_textr­   ƒ   sd  û€ ÙØ�1�bˆyÐÜ�f‰f�] B¨´r·t±tÔ<€GÜ�f‰f�^ R¨¼¿¹Ô=€GÜ�f‰fÐ1°2°wÄbÇdÁdÌRÏTÉTÁkÔR€GÜ�f‰fÐ/°°WÄBÇDÁDÌ2Ï4É4ÁKÔP€Gà€KØ€Lä�f‰fÐ.°°GÓ<€GÜ�f‰fÐ?ÀÀWÓM€Gæð	Ü! '¨=Ó9ˆEØ—^‘^ C¨d�^Ó3ó (�Ø—5‘5˜Ô$¨¯©¨oÔ(>Ä"Ç)Á)ÐLnÐpq×puÑpuÐv|ð  Aó  qBô  DF÷  DHñ  DHõ  CIØ˜V™9�Dà !§¡ h£Ò 7°4�IØŸ*™*¨4˜*Ó0ò  C°A·E±E¸(³Oò  CÀqÇuÁuÈWÃ~ò  CÔY[×Y`ÑY`×YiÑYiÐjs×jyÑjyÐz}Ój~ð  @Añ  kBó  ZC�CÜ$Ÿl™l×2Ñ2°8¸YÓG�GØ×&Ñ&¨° ~Ô6Ø&¤s¨<Ó'8Ð&9¸Ð<�Cà*3°G°9Ð<NÈsÈeÐSWÐ(X�L Ñ%Ø—N‘N 3Ö'ð(ð —^‘^ CÓ(ó ,�Ø—z‘z %Ó(�Ú §
¡
° 
Õ 6Ø�DØ#ò F˜Ø!Ÿg™g e›nÒG°·±¸Ó0AÒGÀR˜ÚÜ&,§l¡l×&:Ñ&:¸8ÀSÓ&I˜GØ ŸK™K¨)°G°9Ð<NÌrÏwÉw×O_ÑO_Ð`c×`iÑ`iÐjmÓ`nÐopÑ`qÓOrÒO~Ðv~ÐNð  @Dð  )Eõ  Fð	Fò
 Ø '¬¨LÓ(9Ð':¸"Ð=˜Ø,1°G·L±LÀÓ4FÑ,FÈÑ,O˜ SÑ)ØŸ™ sÖ+ð,ô ˜%“jˆGöô �f‰fÐ>À
ÈGÔ[]×[_Ñ[_Ôbd×bfÑbfÑ[fÔg€Gåð	Ü! '¨=Ó9ˆEØ—~‘~ dÓ+ò .�ð Lò .�DØ—I‘I—M‘M $¨Õ-ñ.ð.ô ˜%“jˆGð €Mô2ô —Y‘Y˜°¼¿¹Ô>‘ÀA€IÜ�f‰fÐ/°¸GÌ2Ï4É4ÔRT×RVÑRVÉ;ÔW€Gä�f‰f�W˜j¨'¼¿¹Ô>€GÜ�f‰f�\ 4¨¼¿¹Ô=€GÜ�f‰fÐ@À"ÀgÔUW×UYÑUYÔZ€Gà€EØ—‘˜vÓ&ó  ˆØ�K‰K‹MˆÙØä�F‰FÐ+¨R°Ó3ˆÜ�F‰FÐ*¨B°Ó2ˆØ�I‰I�d˜BÓ×'Ñ'¨¨cÓ2ˆÜ�F‰F�<  aÓ(ˆÜ—‘�z 2 qÓ)ˆÜ×!Ñ! %Ó(ˆØ—‘˜f cÓ*×2Ñ2°8¸SÓAˆÜ—‘Ð7¸¸UÓCˆÙØØ ×&Ñ&Ó(ò 	 ‰DˆAˆqØ—	‘	˜!˜Q“‰Að	 ä Ó.ò 	0‰FˆAˆsØ—	‘	˜G A 3 b˜/¨3Ó/‰Að	0à�‰�Q—W‘W“YÖð' ð* �+‰+�eÓ
€CØ×"Ñ"Ó$ò  ‰ˆˆ1Ø�k‰k˜!˜QÓ‰ð ä˜MÓ*ò 0‰ˆˆ3Ø�k‰k˜G A 3 b˜/¨3Ó/‰ð0ô �&‰&Ð! 2 sÓ
+€CÜ
�&‰&� " cÓ
*€CÜ
�&‰&� " cÓ
*€CÜ
�&‰&Ð# R¨Ó
-€Cä
×
Ñ
˜CÓ
 €CÜ
�&‰&�˜d CÓ
(€CÜ
�&‰&�˜F CÓ
(€CÜ
�&‰&�˜s CÓ
(€Cä‹5€DØ€EØ�Y‰Y�vÓò ˆÜ�f‰f�V˜R¤§¡¨
°B¸Ó!:Ó;ˆÙØØ�$‰;ØØ�‰�ŒØ�‰�Q�ðð �+‰+�eÓ
×
"Ñ
"Ó
$€Cà�	˜;Ð&Ð&øôy ò 	Úð	ûô6 ò 	Úð	úsG   ÄA:`# Å?D`# Ê`# Ê"1`# ËA/`# ÍA`# ÏA`3 à#	`0à/`0à3	a à?a c                 óž  — | j                  d|t        f«      }|j                  «       ry	 d}	 ddlm}  ||«      }| j                  d|||||t        t        t        ||f
«      }|j                  dkD  ryt        j                  dd|«      }	t        j                  |	«      }	t        j                  d	d
|	«      j                  «       d d }	| j                  d|j                  |t        |	f«       yy# t
        $ r Y Œ¼w xY w# t        j                   $ r=}
dt#        |
«      v r*t%        j&                  d«       t)        | |||||«      cY d }
~
S ‚ d }
~
ww xY w)Nz7SELECT id FROM gov_raw WHERE page_url=? AND site_name=?FÚotherr   )Úclassify_industryz¨INSERT OR IGNORE INTO gov_raw (page_url, source_url, title, content, publish_date, site_name, group_name, script_name, has_table, industry) VALUES (?,?,?,?,?,?,?,?,?,?)ru   r   r   r   éÈ   zTINSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) VALUES (?,?,?,?)TÚlockedrL   )ÚexecuteÚ	SITE_NAMEÚfetchoneÚcrawler_libr°   r–   Ú
GROUP_NAMEÚSCRIPT_NAMEÚrowcountr   r   r   r   r   Ú	lastrowidÚsqlite3ÚOperationalErrorrF   ÚtimeÚsleepÚstore_record)Úconnr'   r9   rC   r:   r¡   ÚcurÚindustryr°   ÚsummaryÚes              r   r¿   r¿     sF  € Ø
�,‰,ÐPÐSVÔXaÐRbÓ
c€CØ
‡|�|„~ØðØˆð	Ý5Ù(¨Ó/ˆHð �l‰lð+ð �#�u˜g t¬Y¼
ÄKÐQZÐ\dÐeó	
ˆð �<‰<˜!ÒÜ—f‘f˜Z¨¨WÓ5ˆGÜ×'Ñ'¨Ó0ˆGÜ—f‘f˜V S¨'Ó2×8Ñ8Ó:¸4¸CÐ@ˆGØ�L‰LØfØ—‘ ¤y°'Ð:ôð Øøô# ò 	Ùð	ûô$ ×#Ñ#ò Ø”s˜1“vÑÜ�J‰J�qŒMÜ  c¨5°'¸4ÀÓKÕKØûð	úsF   «C< ®C- ¼B/C< Ã-	C9Ã6C< Ã8C9Ã9C< Ã<EÄ1EÅ EÅEÅEc                 ó¨   — | j                  |t        dd¬«      }|j                  dk(  rd|_        |j                  S t        d|j                  › �«      ‚)Nr   Fr   r±   r   zHTTP )r"   r#   Ústatus_coder$   r%   ÚRuntimeError)r&   r'   r(   s      r   Úfetch_detailrÈ   /  sJ   € Ø�‰�C¤°"¸UˆÓC€AØ‡}�}˜ÒØˆŒ
Ø�v‰vˆÜ
˜˜qŸ}™}˜oÐ.Ó
/Ð/r   c                  ó&  — dd l } | j                  «       }|j                  j                  t        «       d }t
        s=t        j                  t        d¬«      }|j                  d«       |j                  d«       d}d}t        «       }g }t        dt        dz   «      D �]Ã  }	 t        ||«      }t!        |«      }
t        d|› dt#        |
«      › d�d	¬
«       |
st        dd	¬
«        �n||
D �]^  \  }}}||v rŒ|j%                  |«       	 t'        ||«      }t)        ||«      \  }}}|s|}|s|}t+        ||«      \  }}}t#        t-        j.                  dd|«      j1                  «       «      }t-        j2                  d|t,        j4                  «       xr | }|dk  s|rt        d|d d › �d	¬
«       |dz  }ŒÌt
        rD|j7                  |||||t8        t:        t<        dœ«       t        d|d d › d|› d�d	¬
«       |dz  }�Œt?        ||||||«      }|r|dz  }t        d|d d › d|› d�d	¬
«       n|dz  }tA        jB                  d«       �Œa tA        jB                  d«       �ŒÆ t
        rmtE        t
        dd¬«      5 }|D ]+  }|jG                  tI        jJ                  |d ¬!«      d"z   «       Œ- 	 d d d «       t        d#t
        › dt#        |«      › d$�d	¬
«       |� |jM                  «        |jO                  «        t        d%|› �d	¬
«       t        d&|› �d	¬
«       t        d't8        › d(�d	¬
«       y # t        $ r}	t        d|› d|	› �d	¬
«       Y d }	~	 Œíd }	~	ww xY w# t        $ r#}	t        d|› d|	› �d	¬
«       |dz  }Y d }	~	�Œ–d }	~	ww xY w# 1 sw Y   ŒÛxY w))Nr   é<   )r   zPRAGMA busy_timeout=60000zPRAGMA journal_mode=WALr	   zPage z fetch error: T)Úflushz: found z itemszEmpty page, stop paginationz  detail error z: ru   r   z<p[ >]é
   z  skip empty/placeholder: é(   )r[   r9   rC   Úpublish_dater¡   Ú	site_nameÚ
group_nameÚscript_namez
  JSONL + z (ú)z  + g      Ð?g      à?Úwr   )r$   F)Úensure_asciir�   zJSONL written: z rows)u   æ–°å¢ž: u   è·³è¿‡: z=== z	 done ===)(ÚrequestsÚSessionr   Úupdater#   r   r»   Úconnectr   r³   r™   ÚrangeÚ_PAGESr)   r–   Úprintr<   r0   rš   rÈ   rc   r­   r   r   r   rY   rR   r4   r´   r·   r¸   r¿   r½   r¾   ÚopenÚwriteÚjsonÚdumpsÚcommitÚclose)rÕ   ÚsrÀ   Ú	new_countÚ
skip_countÚ	seen_urlsÚ
jsonl_rowsr   r5   rÄ   r6   r;   r9   r:   ÚdhtmlÚdtitleÚddater\   rC   r¡   ÚattsÚ	plain_lenÚno_paraÚokÚfÚrows                             r   Úmainrð   7  s™  € ÛØ×ÑÓ€AØ‡I�I×Ñ”WÔØ€DÝÜ�‰œw°Ô3ˆØ�‰Ð0Ô1Ø�‰Ð.Ô/à€IØ€JÜ“€IØ€Jä�aœ !™Ó$ó 2ˆð	Ü" 1 dÓ+ˆIô ˜9Ó%ˆÜ��d�V˜8¤C¨£J <¨vÐ6¸dÕCÙÜÐ/°tÕ<ÚØ$)ó &	Ñ ˆG�U˜DØ˜)Ñ#ØØ�M‰M˜'Ô"ðÜ$ Q¨Ó0�ô
 +7°u¸gÓ*FÑ'ˆF�E˜<ÙØ�ÙØ�Ü'3°LÀ'Ó'JÑ$ˆG�Y ÜœBŸF™F :¨r°7Ó;×AÑAÓCÓDˆIÜŸ)™) I¨|¼R¿T¹TÓBÐBÒTÈ9À}ˆGØ˜2Š~¡ÜÐ2°6¸#¸2°;°-Ð@ÈÕMØ˜a‘�
ØÝØ×!Ñ!Ø '°&ÀWØ$)¸	Ü!*¼*Ü#.ñ	#ô ô ˜
 6¨#¨2 ; -¨r°%°¸Ð:À$ÕGØ˜Q‘�	ÙÜ˜d G¨V°W¸eÀYÓOˆBÙØ˜Q‘�	Ü˜˜V C R˜[˜M¨¨E¨7°!Ð4¸DÖAà˜a‘�
Ü�J‰J�tÖðM&	ôN 	�
‰
�3Žðe2õh Ü”*˜c¨GÔ4ð 	D¸Ø!ò D�Ø—‘œŸ
™
 3°UÔ;¸dÑBÕCñD÷	Dô 	�¤
˜|¨2¬c°*«oÐ->¸fÐEÈTÕRàÐØ�‰ŒØ�
‰
ŒÜ	ˆH�Y�KÐ
 ¨Õ-Ü	ˆH�Z�LÐ
!¨Õ.Ü	ˆD”�˜9Ð
%¨TÖ2øôy ò 	Ü�E˜$˜˜~¨a¨SÐ1¸Õ>Ýûð	ûô ò Ü˜¨ y°°1°#Ð6¸dÕCØ˜a‘�
Ýûðú÷H	Dð 	Dús<   Â!L.ÄMÉ;1NÌ.	MÌ7MÍMÍ	NÍ!M?Í?NÎNÚ__main__)4Ú__doc__Úsysrw   r   r½   Úhtmlr   Úurllib.parser1   r»   rÞ   Úbs4r   ÚImportErrorÚBASE_URLr   r    r´   r·   r¸   Úenvironr"   r   r   ÚENCrM   rV   rQ   r“   rR   r-   r#   Ú
_MAX_PAGESr˜   Úargvr¨   rf   rN   rZ   rO   Ú
ValueErrorr0   rÚ   r   r)   r<   rc   r­   r¿   rÈ   rð   Ú__name__© r   r   ú<module>r      sÍ  ðñó Û 	Û 	Û Û Û Û Û ðÝ!ð
 &€Ø3€ØD€Ø0€	Ø€
Ø#€Ø
�*‰*�.‰.˜Ð$9Ó
:€Ø�Z‰Z�^‰^˜L¨"Ó-€
Ø€Ø!€Ø€Øˆr�z‰zð EØ‡D�Dˆ2�4‰4�Kó€ð @ØOØ'ñ€ð €
Ù�c—h‘hÓò 
�D€A€qØ‡|�|�JÔð	Ù˜QŸW™W S¨!›_¨QÑ/Ó0‰Jð 
ˆi‹˜A ™E¡C¨¯©£MÓ1ð	Ù˜SŸX™X a¨!¡e™_Ó-‰Jð
ð " Q’‰¨A€òòò
ò%ò>G'òTòD0òN3ðb ˆzÒÙ…Fð øðY ò ØƒMðûð> ò 	Ùð	ûð
 ò 	Ùð	ús5   ¤E ÃE#ÄE.ÅE ÅE Å#E+Å*E+Å.E6Å5E6