Ë
    9JŠj€  ã            
       ó�  — d 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diZ ej"                  «       Zej&                  j)                  e«       d„ Zd„ Zd„ Zd%d„Zd„ Zd„ Zedk(  rÎ eej:                  «      dkD  rej:                  d   ndZedk(  r e«        yedk(  r5 eej:                  «      dkD  r eej:                  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j:                  d   › d$�«       yy)&u  å¤§æŸ´æ—¦è¡Œæ”¿å§”å‘˜ä¼š - å…¬ç¤ºå…¬å‘Š çˆ¬è™«
URL: http://www.dachaidan.gov.cn/xwdt/gsgg.htm
CMS: Visual SiteBuilder 9 (VSB)
åˆ†é¡µ: gsgg.htm (ç¬¬1é¡µ) + gsgg/20.htm ~ gsgg/1.htm (ç¬¬2~21é¡µ, å…±518æ�¡)
è¯¦æƒ…: /info/1065/{id}.htm â†’ div#vsb_content div.v_news_content
é    N)ÚBeautifulSoup)Úurljoin)ÚdatetimeÚ	timedeltazhttp://www.dachaidan.gov.cnz)http://www.dachaidan.gov.cn/xwdt/gsgg.htmu   å…¬ç¤ºå…¬å‘Šu   å¤§æŸ´æ—¦è¡Œæ”¿å§”å‘˜ä¼šu   é�’æµ·z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36c                 ó„   — t         j                  j                  | dz   «       t         j                  j                  «        y )Nú
)ÚsysÚstderrÚwriteÚflush)Úmsgs    ú)/root/gov_crawler/crawl_dachaidan_gsgg.pyÚlogr      s(   € Ü‡J�J×Ñ�S˜4‘ZÔ Ü‡J�J×ÑÕó    c                 ó°  — 	 t         j                  | d¬«      }d|_        t        |j                  d«      }g }|j                  d«      D ]á  }|j                  d	«      }|r|j                  d
«      sŒ(|j                  d
d«      }d|vrŒ?|j                  dd«      j                  «       xs |j                  d¬«      }|sŒvt        t        |«      }	|j                  d«      }
|
r|
j                  d¬«      nd}|j                  dd«      j                  «       }|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.parserÚtrza.c3158ÚhrefÚ z../info/ÚtitleT©Ústripzspan.timestyle3158ú/ú-)r   ÚurlÚdate)ÚsessionÚgetÚencodingÚ	Exceptionr   r   ÚtextÚselectÚ
select_oner   Úget_textr   ÚBASE_URLÚreplaceÚappend)Úpage_urlÚrespÚeÚsoupÚitemsr   Úlinkr   r   r    Ú	date_spanÚdate_strs               r   Úextract_listr5   $   sN  € ðÜ�{‰{˜8¨Rˆ{Ó0ˆØˆŒô
 ˜Ÿ™ MÓ2€DØ€EØ�k‰k˜$Óò EˆØ�}‰}˜YÓ'ˆÙ˜4Ÿ8™8 FÔ+ØØ�x‰x˜ Ó#ˆØ˜TÑ!ØØ—‘˜ "Ó%×+Ñ+Ó-ÒJ°·±ÀT°Ó1JˆÙØÜ”h Ó%ˆØ—M‘MÐ"6Ó7ˆ	Ù5>�9×%Ñ%¨DÐ%Ô1ÀBˆà×#Ñ# C¨Ó-×3Ñ3Ó5ˆØ�‰˜u¨S¸(ÑCÕDðEð  €Løô- ò ÜÐ/°¨z¸¸Q¸CÐ@ÔAØ�	ûðús   ‚D/ Ä/	EÄ8EÅ
EÅEc                 ót  — 	 t         j                  | d¬«      }d|_        t        |j                  d«      }|j                  d	«      }|r|j                  d
¬«      nd}|j                  d«      }|r|j                  d
¬«      nd}|j                  d«      }|s|j                  d«      }|s|j                  d«      }d}	|rÜg }
|j                  d«      D ],  }|
j                  t        |«      «       |j                  «        Œ. |j                  d«      D ]  }|j                  d«       Œ |j                  g d¢«      D ]  }|j                  «        Œ |j                  dd
¬«      }	|	j                  dd«      }	t        j                   dd|	«      }	|
D ]
  }|	d|z   z  }	Œ |r5|j                  dt        j"                  dt        j$                  «      ¬«      ng }g }|r|j                  dd
¬«      ng D ]Y  }|j                  dd«      }t        j&                  d|t        j$                  «      sŒ;|j                  t)        t*        |«      «       Œ[ |	j-                  «       rt/        |	j-                  «       «      dk  r|s|r
d| › d|› d �}	n|r	d| › d|› d �}	|||	fS # t        $ r}t	        d| › d|› �«       Y d}~yd}~ww xY w)!z!Extract content from detail page.r   r   r   u!     [ERROR] è¯·æ±‚è¯¦æƒ…é¡µå¤±è´¥: r   N)r   r   r   r   ztd.titlestyle3191Tr   r   zspan.timestyle3191z#vsb_content div.v_news_contentz#vsb_contentzdiv.c3191_contentÚtableÚpu   Â¶PÂ¶)ÚspanÚbÚstrongÚfontÚemÚiÚuÚs)Ú	separatorr   z

z\n{3,}Úaz\.pdf)r   r   z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$é   z<p><a href="z">z</a></p>)r"   r#   r$   r%   r   r   r&   r(   r)   Úfind_allr,   ÚstrÚ	decomposeÚunwrapr+   ÚreÚsubÚcompileÚIÚsearchr   r*   r   Úlen)Ú
detail_urlr.   r/   r0   Útitle_elr   Údate_elr4   Úcontent_divÚcontentÚtable_htmlsr7   Úp_tagÚtagÚthÚ	pdf_linksÚattachmentsÚa_elr   s                      r   Úextract_detailrZ   B   s´  € ðÜ�{‰{˜:¨rˆ{Ó2ˆØˆŒô
 ˜Ÿ™ MÓ2€Dð �‰Ð2Ó3€HÙ-5ˆH×Ñ DÐÔ)¸2€Eð �o‰oÐ2Ó3€GÙ/6ˆw×Ñ dÐÔ+¸B€Hð —/‘/Ð"CÓD€KÙØ—o‘o nÓ5ˆÙØ—o‘oÐ&9Ó:ˆà€GÙàˆØ ×)Ñ)¨'Ó2ò 	ˆEØ×Ñœs 5›zÔ*Ø�O‰OÕð	ð
 !×)Ñ)¨#Ó.ò 	*ˆEØ�L‰L˜Õ)ð	*ð ×'Ñ'Ò(\Ó]ò 	ˆCØ�J‰J�Lð	ð ×&Ñ&°¸4Ð&Ó@ˆØ—/‘/ /°6Ó:ˆÜ—&‘&˜ F¨GÓ4ˆð ò 	#ˆBØ�v ‘{Ñ"‰Gð	#ñ OZ�×$Ñ$ S¬r¯z©z¸(ÄBÇDÁDÓ/IÐ$ÔJÐ_a€IØ€KÙ8C�×$Ñ$ S¨tÐ$Ô4Èò 8ˆØ�x‰x˜ Ó#ˆÜ�9‰9Ð:¸DÄ"Ç$Á$ÕGØ×Ñœw¤x°Ó6Õ7ð8ð
 �=‰=Œ?œc '§-¡-£/Ó2°RÒ7Ù™Ø$ Z L°°5°'¸ÐB‰GÙØ$ Z L°°5°'¸ÐBˆGà�(˜GÐ#Ð#øôy ò ÜÐ/°
¨|¸3¸q¸cÐBÔCÜûðús   ‚J Ê	J7ÊJ2Ê2J7é$   c           	      ó˜  — | r$t        j                  «       t        | dz  ¬«      z
  nd}t        g}t	        ddd«      D ]  }|j                  d|› d�«       Œ g }t        «       }|D ]˜  }t        |«      }|st        d	|› �d
¬«       Œ!d}|D ]_  }	|	d   |vsŒ|r)|	d   r$	 t        j                  |	d   dd d«      }
|
|k  rŒ5	 |j                  |	d   «       |j                  |	«       |dz  }Œa t        d|› d|› d�«       Œš t        dt        |«      › d�«       t        |d«      D ]|  \  }}	t        |	d   «      \  }}}|	d   s%|r#|j!                  dd«      j#                  «       |	d<   |r||	d<   ||	d<   t%        |	|«       |dz  dk(  sŒct        d|› dt        |«      › �«       Œ~ t        dt        |«      › d�«       y# t        $ r Y �Œw xY w)z,Full crawl: scrape all 21 pages then detail.é   )ÚdaysNrC   r   éÿÿÿÿz&http://www.dachaidan.gov.cn/xwdt/gsgg/z.htmu     [SKIP] ç©ºé¡µ: T)r   r    r!   é
   z%Y-%m-%dé   z	  [LIST] u    â†’ +õ    æ�¡u   
å…± u    æ�¡å¾…çˆ¬è¯¦æƒ…r   r   r   rR   z  [PROGRESS] u   
[DONE] å…±çˆ¬å�– )r   Únowr   ÚLIST_URLÚranger,   Úsetr5   ÚprintÚstrptimeÚ
ValueErrorÚaddr   rM   Ú	enumeraterZ   r+   r   Úoutput_item)Úmonths_backÚcutoffÚ	list_urlsr>   Ú	all_itemsÚ	seen_urlsr-   r1   Ú	new_countÚitemÚ	item_dateÚidxr   r4   rR   s                  r   Ú	crawl_allrv   †   s  € áBMŒX�\‰\‹^œi¨[¸2Ñ-=Ô>Ò>ÐSW€Fô
 �
€IÜ�2�q˜"Óò KˆØ×ÑÐAÀ!ÀÀDÐIÕJðKð €IÜ“€IØò 9ˆÜ˜XÓ&ˆÙÜÐ% h ZÐ0¸Õ=ØØˆ	Øò 	ˆDØ�E‰{ )Ò+Ù˜d 6šlðÜ$,×$5Ñ$5°d¸6±lÀ3ÀBÐ6GÈÓ$T˜	Ø$ vÒ-Ø$ð .ð —‘˜d 5™kÔ*Ø× Ñ  Ô&Ø˜Q‘‘	ð	ô 	ˆi˜�z ¨	 {°$Ð7Õ8ð%9ô( ˆ&”�Y“Ð Ð 0Ð1Ô2ä˜y¨!Ó,ò 8‰	ˆˆTÜ#1°$°u±+Ó#>Ñ ˆˆx˜à�FŠ|¡Ø#×+Ñ+¨C°Ó5×;Ñ;Ó=ˆD�‰LÙØ!ˆD�‰MØ!ˆˆY‰ô 	�D˜#ÔØ�‰8�q‹=Ü�- ˜u A¤c¨)£nÐ%5Ð6Õ7ð8ô Ð
œc )›nÐ-¨TÐ2Õ3øô/ &ò Úðús   Â!F<Æ<	G	ÇG	c                  ó`  — t        t        «      } t        dt        › dt        | «      › d�«       t	        | d«      D ]Y  \  }}t        |d   «      \  }}}|d   s%|r#|j                  dd«      j                  «       |d<   |r||d	<   ||d
<   t        ||«       Œ[ t        dt        | «      › d�«       y)z9Incremental crawl: only the first page (newest 25 items).z[LIST] u    â†’ rb   ra   r    r!   r   r   r   rR   u   
[DONE] å¢žé‡�çˆ¬å�– N)	r5   rd   r   rM   rk   rZ   r+   r   rl   )r1   ru   rs   r   r4   rR   s         r   Úcrawl_incrementalrx   º   sµ   € äœÓ"€EÜˆ'”(�˜5¤ U£ ¨DÐ1Ô2ä˜u aÓ(ò ‰	ˆˆTÜ#1°$°u±+Ó#>Ñ ˆˆx˜Ø�FŠ|¡Ø#×+Ñ+¨C°Ó5×;Ñ;Ó=ˆD�‰LÙØ!ˆD�‰MØ!ˆˆY‰Ü�D˜#Õðô Ð
 ¤ U£ ¨DÐ1Õ2r   c                 ó  — ddl }| j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      t        › dt        › �t        t        d	œ}t        |j                  |d
¬«      «       y)zROutput in pipeline-compatible JSONL format (import_jsonl.py compatible) to stdout.r   Nr   r   r    r!   rR   r   )r   r-   Úpublish_daterR   Ú	site_nameÚcolumnÚprovinceF)Úensure_ascii)Újsonr#   ÚSITEÚCOLUMNÚPROVINCErg   Údumps)rs   ru   r   Úrecords       r   rl   rl   Ë   so   € ãà—‘˜' 2Ó&Ø—H‘H˜U BÓ'ØŸ™ ¨Ó,Ø—8‘8˜I rÓ*Ü�v˜Qœv˜hÐ'ÜÜñ€Fô 
ˆ$�*‰*�V¨%ˆ*Ó
0Õ1r   Ú__main__ra   ÚincrementalÚfullé   Úlistu   å…± rb   é   z  r!   z | r   é(   r    zUsage: z [incremental|full [months]])r[   )#Ú__doc__r	   ÚosrH   ÚrequestsÚbs4r   Úurllib.parser   r   r   r*   rd   r�   r€   r‚   ÚHEADERSÚSessionr"   ÚheadersÚupdater   r5   rZ   rv   rx   rl   Ú__name__rM   ÚargvÚmodeÚintÚmonthsr1   Úit© r   r   ú<module>rœ      sƒ  ðñó Û 	Û 	Û Ý Ý  ß (à(€Ø6€Ø	€Ø!€Ø€ð ÐPð€ð ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ òò
ò<A$óH14òh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   