Ë
    9JŠjm!  ã            
       ó¬  — 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mZ ddlm	Z	 ddl
m
Z
mZ dZdZdZd	Zd
ZdZddiZ ej&                  «       Zej*                  j-                  e«       dZd„ Zd„ Zd„ Zd„ Zd„ Zd)d„Zd„ Zd„ Ze dk(  rÎ e!ejD                  «      dkD  rejD                  d   ndZ#e#dk(  r e«        ye#dk(  r5 e!ejD                  «      dkD  r e$ejD                  d   «      ndZ% ee%«       ye#dk(  rB ee«      Z& ed e!e&«      › d�«       e&dd  D ]  Z' ed!e'd"   › d#e'd$   dd% › d#e'd&   › �«       Œ! y ed'ejD                  d   › d(�«       yy)*uô   æŸ�ä¹¡åŽ¿äººæ°‘æ”¿åºœ - å…¬å‘Šå…¬ç¤º çˆ¬è™«
URL: https://www.baixiangxian.gov.cn/channel/list/77.html
CMS: TopwayCMS
åˆ†é¡µ: list/77.html (ç¬¬1é¡µ) + list/77_{N}.html (2-10) + list_xxgk.jsp (11~145)
è¯¦æƒ…: /single/77/{id}.html -> div.detail-2
é    N)ÚBeautifulSoup)Úurljoin)ÚdatetimeÚ	timedeltazhttps://www.baixiangxian.gov.cnz4https://www.baixiangxian.gov.cn/channel/list/77.htmlu   å…¬å‘Šå…¬ç¤ºu   æŸ�ä¹¡åŽ¿äººæ°‘æ”¿åºœu   æ²³åŒ—éM   z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36ú<<P>>c                 ó„   — t         j                  j                  | dz   «       t         j                  j                  «        y )Nú
)ÚsysÚstderrÚwriteÚflush)Úmsgs    ú(/root/gov_crawler/crawl_baixiang_gsgg.pyÚlogr   #   s(   € Ü‡J�J×Ñ�S˜4‘ZÔ Ü‡J�J×ÑÕó    c                 óD  — 	 t         j                  | d¬«      }d|_        t        |j                  d«      }g }|j                  d«      D ]«  }|j                  d	«      }|sŒ|j                  d
d«      j                  «       }|j                  dd«      xs |j                  d¬«      }|sŒ`t        t        |«      }	|j                  d«      }
|
r|
j                  d¬«      nd}|j                  ||	|dœ«       Œ­ |S # t        $ r}t	        d| › d|› �«       g cY d}~S d}~ww xY w)z,Extract (title, url, date) from a list page.é   ©Útimeoutúutf-8u!     [ERROR] è¯·æ±‚åˆ—è¡¨é¡µå¤±è´¥: ú - Núhtml.parserzul.info-list-xxgk > liza[href^='/single/']ÚhrefÚ ÚtitleT©Ústripz	span.time)r   ÚurlÚdate)ÚsessionÚgetÚencodingÚ	Exceptionr   r   ÚtextÚselectÚ
select_oner   Úget_textr   ÚBASE_URLÚappend)Úpage_urlÚrespÚeÚsoupÚitemsÚliÚlinkr   r   r   Útime_elÚdate_strs               r   Úextract_listr4   (   s  € ðÜ�{‰{˜8¨Rˆ{Ó0ˆØˆŒô
 ˜Ÿ™ MÓ2€DØ€EØ�k‰kÐ2Ó3ò EˆØ�}‰}Ð2Ó3ˆÙØØ�x‰x˜ Ó#×)Ñ)Ó+ˆØ—‘˜ "Ó%ÒB¨¯©¸T¨Ó)BˆÙØÜ”h Ó%ˆØ—-‘- Ó,ˆÙ3:�7×#Ñ#¨$Ð#Ô/ÀˆØ�‰˜u¨S¸(ÑCÕDðEð €Løô% ò ÜÐ/°¨z¸¸Q¸CÐ@ÔAØ�	ûðús   ‚C9 Ã9	DÄDÄDÄDc                  óÐ   — t         g} t        dd«      D ]  }| j                  t        › d|› d�«       Œ t        dd«      D ]#  }| j                  t        › dt        › d|› �«       Œ% | S )z,Generate all list page URLs for pages 1-145.é   é   z/channel/list/77_z.htmlé’   z!/xxgk/list/list_xxgk.jsp?classId=z&&pn=)ÚLIST_URLÚranger*   r)   ÚCLASS_ID)ÚurlsÚns     r   Úget_list_urlsr>   B   st   € äˆ:€DÜ�1�b‹\ò <ˆØ�‰”x�jÐ 1°!°°EÐ:Õ;ð<ä�2�s‹^ò VˆØ�‰”x�jÐ AÄ(ÀÈ5ÐQRÐPSÐTÕUðVà€Kr   c                 ó¬  — 	 t         j                  | d¬«      }d|_        t        |j                  d«      }|j                  d	«      }|r|j                  d
¬«      nd}d}|j                  d«      }|r$|j                  d«      r|d   j                  «       }|sL|j                  d«      }|r9|j                  «       }	t        j                  d|	«      }
|
r|
j                  d«      }g }|j                  d«      }|s|j                  d«      }|rŠ|j                  dd
¬«      D ]t  }|d   j                  «       }|j                  d«      sŒ(|j                  d
¬«      }	|j                  d«      rt!        t"        |«      n|}|j%                  d|› d|	› d�«       Œv t'        ||| «      }||||fS # t        $ r!}t	        d| › d|› �«       dddg fcY d}~S d}~ww xY w)z@Extract content from detail page with paragraph and table fixes.r   r   r   u!     [ERROR] è¯·æ±‚è¯¦æƒ…é¡µå¤±è´¥: r   r   Nr   z
h1.t-type2Tr   zmeta[name=PubDate]Úcontentzp.infoiu"   å�‘å¸ƒæ—¶é—´ï¼š(\d{4}-\d{2}-\d{2})é   zdiv#content.detail-2zdiv.detail-2Úa)r   r   )z.pdfz.docz.docxz.xlsz.xlsxz.zipz.rarú/ú<p><a href="ú">ú</a></p>)r!   r"   r#   r$   r   r   r%   r'   r(   r   ÚreÚsearchÚgroupÚfind_allÚendswithÚ
startswithr   r)   r*   Úextract_content)Ú
detail_urlr,   r-   r.   Útitle_elr   r3   Ú	meta_dateÚinfo_elr%   ÚmÚattachmentsÚcontent_divrB   r   Úfull_urlr@   s                    r   Úextract_detailrV   L   sØ  € ðÜ�{‰{˜:¨rˆ{Ó2ˆØˆŒô
 ˜Ÿ™ MÓ2€Dð �‰˜|Ó,€HÙ-5ˆH×Ñ DÐÔ)¸2€Eð €HØ—‘Ð 4Ó5€IÙ�Y—]‘] 9Ô-Ø˜YÑ'×-Ñ-Ó/ˆÙØ—/‘/ )Ó,ˆÙØ×#Ñ#Ó%ˆDÜ—	‘	Ð?ÀÓFˆAÙØŸ7™7 1›:�ð €KØ—/‘/Ð"8Ó9€KÙØ—o‘o nÓ5ˆÙØ×%Ñ% c°Ð%Ó5ò 	NˆAØ�V‘9—?‘?Ó$ˆDØ�}‰}ÐWÕXØ—z‘z¨�zÓ-�Ø6:·o±oÀcÔ6Jœ7¤8¨TÔ2ÐPT�Ø×"Ñ" \°(°¸2¸d¸VÀ8Ð#LÕMð	Nô ˜k¨5°*Ó=€GØ�(˜G [Ð0Ð0øôK ò ÜÐ/°
¨|¸3¸q¸cÐBÔCØ�2�r˜2ˆ~Õûðús   ‚F) Æ)	GÆ2GÇGÇGc                 ó$  — | s|r	d|› d|› d�S yg }| j                  d«      D ],  }|j                  t        |«      «       |j                  «        Œ. | j                  g d¢«      D ]-  }|j	                  dt
        «       |j                  t
        «       Œ/ | j                  d«      D ]  }|j                  t
        «       Œ | j                  g d	¢«      D ]  }|j                  «        Œ | j                  dd
¬«      }t        j                  dd|«      }|j                  dd«      }t        j                  dd|«      }|j                  «       }|D ]
  }|d|› �z  }Œ |j                  «       rt        |j                  «       «      dk  r|r	d|› d|› d�}|S )zHExtract formatted content with proper paragraphs and table preservation.rD   rE   rF   r   Útable)ÚpÚh1Úh2Úh3Úh4Úh5Úh6r   Úbr)ÚspanÚbÚstrongÚfontÚemÚiÚuÚsT)Ú	separatorr   z<<P>>(\s*<<P>>)+r   z

z\n{3,}é   )rJ   r*   ÚstrÚ	decomposeÚinsertÚMARKERÚreplace_withÚunwrapr(   rG   ÚsubÚreplacer   Úlen)	rT   r   rN   Útables_htmlrX   Útagr`   r%   Útbl_htmls	            r   rM   rM   y   s–  € áÙØ! * ¨R°¨w°hÐ?Ð?Øð €KØ×%Ñ% gÓ.ò ˆØ×Ñœ3˜u›:Ô&Ø�‰Õðð
 ×#Ñ#Ò$MÓNò ˆØ�
‰
�1”fÔØ�
‰
”6Õðð ×"Ñ" 4Ó(ò  ˆØ
�‰œÕð ð ×#Ñ#Ò$XÓYò ˆØ�
‰
�ðð ×Ñ¨"°DÐÓ9€Dô �6‰6Ð% w°Ó5€DØ�<‰<˜ Ó(€DÜ�6‰6�)˜V TÓ*€DØ�:‰:‹<€Dð  ò "ˆØ�$�x�jÐ!Ñ!‰ð"ð �:‰:Œ<œ3˜tŸz™z›|Ó,¨rÒ1ÙØ! * ¨R°¨w°hÐ?ˆDà€Kr   é$   c           	      óL  — | r$t        j                  «       t        | dz  ¬«      z
  nd}t        «       }g }t	        «       }|D ]¬  }t        |«      }|sŒd}|D ]\  }|d   |vsŒ|r&|d   r!	 t        j                  |d   d«      }	|	|k  rŒ2	 |j                  |d   «       |j                  |«       |dz  }Œ^ t        d	|dd
 › d|› d�«       |dk(  sŒ�t        |«      dkD  sŒž|sŒ¡t        d«        n t        dt        |«      › d�«       t        |d«      D ]f  \  }
}t        |d   «      \  }}}}|d   s|r||d<   |r||d<   ||d<   |r||d<   t        ||
«       |
dz  dk(  sŒMt        d|
› dt        |«      › �«       Œh t        dt        |«      › d�«       y# t        $ r Y �Œw xY w)z)Full crawl: scrape all pages then detail.é   )ÚdaysNr   r   r    z%Y-%m-%drA   z	  [LIST] éP   z -> +õ    æ�¡u*     [STOP] é�‡åˆ°æ—©äºŽæˆªæ­¢æ—¥æœŸçš„é¡µé�¢u   
å…± u    æ�¡å¾…çˆ¬è¯¦æƒ…r   r@   rS   é
   z  [PROGRESS] rC   u   
[DONE] å…±çˆ¬å�– )r   Únowr   r>   Úsetr4   ÚstrptimeÚ
ValueErrorÚaddr*   r   rs   Ú	enumeraterV   Úoutput_item)Úmonths_backÚcutoffÚ	list_urlsÚ	all_itemsÚ	seen_urlsr+   r/   Ú	new_countÚitemÚ	item_dateÚidxr   r3   r@   rS   s                  r   Ú	crawl_allrŽ   ¦   sé  € áBMŒX�\‰\‹^œi¨[¸2Ñ-=Ô>Ò>ÐSW€Fä“€IØ€IÜ“€Iàò ˆÜ˜XÓ&ˆÙØØˆ	Øò 	ˆDØ�E‰{ )Ò+Ù˜d 6šlðÜ$,×$5Ñ$5°d¸6±lÀJÓ$O˜	Ø$ vÒ-Ø$ð .ð —‘˜d 5™kÔ*Ø× Ñ  Ô&Ø˜Q‘‘	ð	ô 	ˆi˜  "˜� e¨I¨;°dÐ;Ô<Ø˜‹>œc )›n¨qÓ0²VÜÐ<Ô>Ùð)ô, ˆ&”�Y“Ð Ð 0Ð1Ô2ä˜y¨!Ó,ò 8‰	ˆˆTÜ0>¸tÀE¹{Ó0KÑ-ˆˆx˜ +Ø�FŠ|¡Ø#ˆD�‰LÙØ!ˆD�‰MØ!ˆˆY‰ÙØ"-ˆD�ÑÜ�D˜#ÔØ�‰8�q‹=Ü�- ˜u A¤c¨)£nÐ%5Ð6Õ7ð8ô Ð
œc )›nÐ-¨TÐ2Õ3øô3 &ò Úðús   Á)FÆ	F#Æ"F#c                  ó4  — t        t        «      } t        dt        › dt        | «      › d�«       t	        | d«      D ]C  \  }}t        |d   «      \  }}}}|d   s|r||d<   |r||d<   ||d<   |r||d	<   t        ||«       ŒE t        d
t        | «      › d�«       y)z6Incremental crawl: only the first page (newest items).z[LIST] z -> r|   rA   r   r    r   r@   rS   u   
[DONE] å¢žé‡�çˆ¬å�– N)r4   r9   r   rs   rƒ   rV   r„   )r/   r�   r‹   r   r3   r@   rS   s          r   Úcrawl_incrementalr�   Ö   s®   € äœÓ"€EÜˆ'”(�˜4¤ E£
˜|¨4Ð0Ô1ä˜u aÓ(ò 	‰	ˆˆTÜ0>¸tÀE¹{Ó0KÑ-ˆˆx˜ +Ø�FŠ|¡Ø#ˆD�‰LÙØ!ˆD�‰MØ!ˆˆY‰ÙØ"-ˆD�ÑÜ�D˜#Õð	ô Ð
 ¤ U£ ¨DÐ1Õ2r   c                 ó^  — | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      t        › dt        › �t        t        dœ}| j                  d«      rt	        j
                  | d   d	¬
«      |d<   t        t	        j
                  |d	¬
«      «       y)z.Output JSONL to stdout for pipeline ingestion.r   r   r   r    r@   ú-)r   r+   Úpublish_dater@   Ú	site_nameÚcolumnÚprovincerS   F)Úensure_asciiN)r"   ÚSITEÚCOLUMNÚPROVINCEÚjsonÚdumpsÚprint)r‹   r�   Úrecords      r   r„   r„   é   s’   € ð —‘˜' 2Ó&Ø—H‘H˜U BÓ'ØŸ™ ¨Ó,Ø—8‘8˜I rÓ*Ü�v˜Qœv˜hÐ'ÜÜñ€Fð ‡x�x�ÔÜ $§
¡
¨4°Ñ+>ÈUÔ Sˆˆ}ÑÜ	Œ$�*‰*�V¨%Ô
0Õ1r   Ú__main__rA   ÚincrementalÚfullr6   Úlistu   å…± r|   é   z  r    z | r   é(   r   zUsage: z [incremental|full [months]])rw   )(Ú__doc__r   ÚosrG   r›   ÚrequestsÚbs4r   Úurllib.parser   r   r   r)   r9   r™   r˜   rš   r;   ÚHEADERSÚSessionr!   ÚheadersÚupdatern   r   r4   r>   rV   rM   rŽ   r�   r„   Ú__name__rs   ÚargvÚmodeÚintÚmonthsr/   Úit© r   r   ú<module>rµ      sš  ðñó Û 	Û 	Û Û Ý Ý  ß (à,€ØA€Ø	€Ø€Ø€Ø€ð ÐPð€ð ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ à	€òò
ò4ò*1òZ*óZ-4ò`3ò&2ð  ˆzÒÙ˜cŸh™h›-¨!Ò+ˆ3�8‰8�AŠ;°€DØˆ}ÒÙÕØ	�ŠÙ%(¨¯©£]°QÒ%6‘�S—X‘X˜a‘[Ô!¸BˆÙ�&ÕØ	�ŠÙ˜XÓ&ˆÙˆd‘3�u“:�,˜dÐ#Ô$Ø˜˜�)ò 	FˆBÙ�"�R˜‘Z�L  B w¡K°°Ð$4Ð#5°S¸¸E¹¸ÐDÕEñ	Fñ 	ˆg�c—h‘h˜q‘k�]Ð">Ð?Õ@ð r   