Ë
    V_Šj–%  ã                   óN  — 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mZmZ ddl	m
Z
 ddlmZ dZdZeez   dz   Zd	Zd
Z ej$                  dd«      ZdZdZddddœZdZ ej0                  «       Zej4                  j7                  e«       d„ Zd„ Zd„ Zd„ Zd„ Z e!dk(  r e «        yy)uƒ   Crawler for å¤ªä»“å¸‚äººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Š
CMS: Taicang CMS, UTF-8, 15æ�¡/é¡µ, 179é¡µ
Site: www.taicang.gov.cn/taicang/gsgg/
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinzhttp://www.taicang.gov.cnz/taicang/gsggz/xwzx_list.shtmlu"   å¤ªä»“å¸‚äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Šu   æ±Ÿè‹�è‹�å·žÚ	SEARCH_DBz/root/search.dbé   é   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languageé   c                 ó^   — t         j                  | t        ¬«      }d|_        |j                  S )N)Útimeoutzutf-8)ÚsessionÚgetÚTIMEOUTÚencodingÚtext)ÚurlÚresps     ú"/root/gov_crawler/crawl_taicang.pyÚfetchr      s%   € Ü�;‰;�s¤Gˆ;Ó,€DØ€D„MØ�9‰9Ðó    c                 ó*  — t        | d«      }g }|j                  dd¬«      }|s|S |j                  d«      }|s|S |j                  dd¬«      D ]Â  }|j                  d	d
¬«      }|sŒ|j                  d«      xs |j	                  d
¬«      }|d   j                  «       }|r|sŒV|j                  d«      }	|	r|	j	                  d
¬«      nd}
|j                  d«      st        t        |«      }|j                  |j                  «       ||
dd f«       ŒÄ |S )uB   Parse list â€” div.page_list > ul > li > a(title+href) + span.dateúhtml.parserÚdivÚ	page_list©Úclass_ÚulÚliF)Ú	recursiveÚaT©ÚhrefÚtitle©Ústripr#   ÚspanÚ ÚhttpNé
   )
r   ÚfindÚfind_allr   Úget_textr&   Ú
startswithr   ÚBASE_URLÚappend)ÚhtmlÚsoupÚitemsr   r   r   r!   r$   r#   r'   Údates              r   Ú
parse_listr5   $   s
  € ä˜˜}Ó-€DØ€EØ
�)‰)�E +ˆ)Ó
.€CÙØˆØ	�‰�$‹€BÙØˆØ�k‰k˜$¨%ˆkÓ0ò 7ˆØ�G‰G�C˜dˆGÓ#ˆÙØØ—‘�g“Ò8 !§*¡*°4 *Ó"8ˆØ�‰y�‰Ó ˆÙ™DØØ�w‰w�v‹ˆÙ,0ˆt�}‰} 4ˆ}Ô(°bˆØ�‰˜vÔ&Üœ8 TÓ*ˆDØ�‰�e—k‘k“m T¨4°°¨9Ð5Õ6ð7ð €Lr   c           
      ó>
  — t        | d«      }d}|j                  d«      }|r|j                  d¬«      }|s'|j                  dd¬«      }|r|j                  d¬«      }|sC|j                  d	«      }|r0|j                  d¬«      j                  d
d«      j	                  «       }d}|j                  d«      }|r|j                  d¬«      dd }|s[|j                  d«      D ]G  }	|	j                  d«      xs dj                  «       }
d|
v sd|
v sŒ/|	j                  d«      xs ddd } n |s)t        j                  d| «      }	|	r|	j                  d«      }d}|j                  dd¬«      }|�r½|j                  d«      }|�r©g }|j                  D �]h  }t        |d«      r|j                  €Œ|j                  j                  «       }|dk(  r|j                  dd¬«      }|j                  d«      }|D ]A  }|j                  dd«      }|sŒ|j                  dd«      }t        ||«      }|d|›d|›d�z  }ŒC |sŒ©|j                  |«       Œ»|d k(  r¨g }|j                  d!«      D ]l  }|j                  d"d#g«      D �cg c]%  }|j                  dd¬«      j                  d$d%«      ‘Œ' }}|sŒG|j                  d&d'j!                  |«      z   d(z   «       Œn |s�ŒF|j                  d)j!                  |«      «       �Œh|d*v r*|j                  dd¬«      }|s�Œƒ|j                  |«       �Œ–|d+k(  r|j                  d«       �Œ®|dk(  rN|j                  dd«      }|s�ŒÉ|j                  dd«      }t        ||«      }|j                  d,|›d|›d�«       �Œ|d-k(  s�Œ|j                  d.d«      }|j                  d¬«      }|s�Œ0|s�Œ4|j#                  d/«      r�ŒG|j                  d0|›dt        ||«      ›d�«       �Œk d1j!                  d2„ |D «       «      }t        j$                  d3d1|«      }g }|j                  d-d¬4«      D ]“  }|d.   j	                  «       j                  «       }t        j                  d5|«      sŒ;t        ||d.   j	                  «       «      } |j                  d¬«      xs | j'                  d6«      d7   }!|j                  |!| d8œ«       Œ• t)        |j	                  «       «      d9k  r$|r"d:|›d;|›d<�}|D ]  }"|d=|"d>   ›d;|"d	   ›d?�z  }Œ ||||fS c c}w )@u+   Parse detail â€” div.hcontent > div.articler   r(   Ú	ucaptitleTr%   Úh1Úarticle_titler   r$   u   _ å¤ªä»“å¸‚äººæ°‘æ”¿åºœÚpublishtimeNr*   ÚmetaÚnameÚpubdateÚpublishdateÚcontentu&   æ—¶é—´[ï¼š:]\s*(\d{4}-\d{1,2}-\d{1,2})é   r   ÚhcontentÚucapcontentÚpú ÚimgÚsrcÚaltz
![z](ú)ÚtableÚtrÚtdÚthú|z\|z| z | z |ú
)r   ÚsectionÚ
blockquoteÚbrz![r!   r#   Ú
javascriptú[z

c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­w©N© )Ú.0rC   s     r   ú	<genexpr>zparse_detail.<locals>.<genexpr>�   s   è ø€ Ò!8¨²a¤!Ñ!8ùs   ‚Šz\n{3,}r"   z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$ú/éÿÿÿÿ)r$   r   r   z<p><a href="z">u   </a></p>

é™„ä»¶åˆ—è¡¨ï¼š
z  - <p><a href="r   z	</a></p>
)r   r+   r-   Úreplacer&   r,   r   ÚlowerÚreÚsearchÚgroupÚchildrenÚhasattrr<   r   r0   Újoinr.   ÚsubÚsplitÚlen)#r1   r   r2   r$   Ú
ucap_titler8   Ú	title_tagÚpub_dateÚpub_timeÚmr<   r?   ÚhcÚucapÚpartsÚchildÚtagr   ÚimgsrE   rF   rG   Úfull_srcÚrowsrJ   rK   ÚcellsÚa_hrefÚ	link_textÚattachmentsr!   ÚahrefÚfull_urlÚ
title_textÚatts#                                      r   Úparse_detailr{   >   së  € ä˜˜}Ó-€Dð €EØ—‘˜;Ó'€JÙØ×#Ñ#¨$Ð#Ó/ˆÙØ�Y‰Y�t OˆYÓ4ˆÙØ—K‘K d�KÓ+ˆEÙØ—I‘I˜gÓ&ˆ	ÙØ×&Ñ&¨TÐ&Ó2×:Ñ:Ð;TÐVXÓY×_Ñ_ÓaˆEð €HØ�y‰y˜Ó'€HÙØ×$Ñ$¨4Ð$Ó0°°"Ð5ˆÙØ—‘˜vÓ&ò 	ˆAØ—E‘E˜&“MÒ' R×.Ñ.Ó0ˆDØ˜DÑ  M°TÒ$9ØŸE™E )Ó,Ò2°°C°RÐ8�Ùð		ñ
 Ü�I‰IÐ?ÀÓFˆÙØ—w‘w˜q“zˆHð €GØ	�‰�5 ˆÓ	,€BÚ	Ø�w‰w�}Ó%ˆÚØˆEØŸ™ó 'U�Ü˜u fÔ-°·±Ð1CØØ—j‘j×&Ñ&Ó(�Ø˜#’:Ø Ÿ>™>¨#°T˜>Ó:�DØ Ÿ>™>¨%Ó0�DØ#ò D˜Ø!Ÿg™g e¨RÓ0˜ÚØ"%§'¡'¨%°Ó"4˜CÜ'.¨s°CÓ'8˜HÙ ²Sº(Ð$CÑC™DðDò ØŸ™ TÕ*Ø˜G’^Ø�DØ#Ÿn™n¨TÓ2ò I˜Ø\^×\gÑ\gÐimÐosÐhtÓ\uÖ vÐVX §¡¨S¸ Ó!=×!EÑ!EÀcÈ5Õ!QÐ v˜Ð vÚ Ø ŸK™K¨¨u¯z©z¸%Ó/@Ñ(@À4Ñ(GÕHðIó ØŸ™ T§Y¡Y¨t£_Ö5ØÐ<Ñ<Ø Ÿ>™>¨#°T˜>Ó:�DÛØŸ™ TÖ*Ø˜D’[Ø—L‘L Ö$Ø˜E’\ØŸ)™) E¨2Ó.�CÛØ#Ÿi™i¨¨rÓ2˜Ü#*¨3°Ó#4˜ØŸš²CºÐ%BÖCØ˜C”ZØ"ŸY™Y v¨rÓ2�FØ %§¡°T Ó :�IÛ£)°F×4EÑ4EÀlÖ4SØŸš²9¼gÀcÈ6Õ>RÐ%SÖTðO'UðR —k‘kÑ!8¨UÔ!8Ó8ˆGÜ—f‘f˜Y¨°Ó8ˆGð €KØ�]‰]˜3 Tˆ]Ó*ò GˆØ�&‘	—‘Ó!×'Ñ'Ó)ˆÜ�9‰9Ð:¸EÕBÜ˜s A f¡I§O¡OÓ$5Ó6ˆHØŸ™¨$˜Ó/ÒJ°8·>±>À#Ó3FÀrÑ3JˆJØ×Ñ¨¸HÑEÕFðGô ˆ7�=‰=‹?Ó˜bÒ ¢[ÚGJÊEÐRˆØò 	WˆCÙ¸SÀ»ZÈÈWËÐVÑV‰Gð	Wð �(˜G [Ð0Ð0ùòS !ws   É9*Tc                 ó  — t        j                  «       t        t        ¬«      z
  }g }| D ]6  \  }}}	 t        j                  |d«      }||k\  r|j                  |||f«       Œ8 |S # t        t        f$ r |j                  |||f«       Y Œ`w xY w)N)Údaysz%Y-%m-%d)r   Únowr   ÚINCREMENTAL_DAYSÚstrptimer0   Ú
ValueErrorÚ
IndexError)r3   ÚcutoffÚfilteredr$   r   Údate_strÚ	item_dates          r   Úincremental_filterr‡   ¥   s–   € Ü�\‰\‹^œiÔ-=Ô>Ñ>€FØ€HØ %ò 4Ñˆˆs�Hð	4Ü ×)Ñ)¨(°JÓ?ˆIØ˜FÒ"Ø—‘ ¨¨XÐ 6Ô7øð	4ð €Oøô œJÐ'ò 	4Ø�O‰O˜U C¨Ð2Ö3ð	4ús   ²/A%Á%#BÂ
Bc                  óÂ  — t        d„ dD «       «      } t        g}t        dt        dz   «      D ]$  }|j	                  t
        t        z   d|z  z   «       Œ& g }t        |«      D ]Y  \  }}	 t        |«      }t        |«      }t        d|dz   t        |«      fz  t        j                  ¬«       |j                  |«       Œ[ t        d	t        |«      z  t        j                  ¬«       | r2t!        |«      }t        d
t        |«      z  t        j                  ¬«       t#        «       }	g }
|D ]/  }|d   |	vsŒ|	j%                  |d   «       |
j	                  |«       Œ1 g }|
D ]…  \  }}}	 t        |«      }t'        ||«      \  }}}}|xs |}|xs |}|j	                  |||||rt)        j*                  |d¬«      ndt,        dœ«       t        d|d d z  t        j                  ¬«       Œ‡ d}d}d}|D �]  }|j/                  dd«      d d }t1        j2                  dd|d d «      j5                  «       xs |d   }|j/                  dd«      }t7        |t8        «      rnt)        j*                  |d¬«      }	 t;        j<                  t>        «      }|jA                  «       }|jC                  d|d   |d   |d   t,        tD        ||||d   f	«       |jF                  dkD  r|dz  }n|dz  }|jI                  «        |jK                  «        �Œ t        dt,        |||fz  t        j                  ¬«       |D ]"  }t        t)        j*                  |d¬«      «       Œ$ y # t        $ r/}t        d|dz   ||fz  t        j                  ¬«       Y d }~�Œ$d }~ww xY w# t        $ r,}t        d|›d|›�t        j                  ¬«       Y d }~�Œad }~ww xY w# t        $ r}|dz  }Y d }~�Œíd }~ww xY w)Nc              3   ó@   K  — | ]  }|t         j                  v –— Œ y ­wrU   )ÚsysÚargv)rW   Úargs     r   rX   zmain.<locals>.<genexpr>³   s   è ø€ Ò\¨S˜¤§¡œÑ\ùs   ‚)z--incrementalÚincrementalÚincé   r@   z/xwzx_list_%d.shtmlzPage %d: %d items)ÚfilezPage %d error (%s): %sz	Total: %dzIncremental: %dF)Úensure_asciir(   )r$   Úpage_urlÚpublish_dater?   rv   Ú	site_namez  OK: %sé2   z  ERR z: r   r?   iPÃ  z\s+rD   éÈ   r$   rv   zºINSERT OR IGNORE INTO gov_raw
                (page_url, title, publish_date, site_name, group_name, summary, content, attachments, source_url)
                VALUES (?,?,?,?,?,?,?,?,?)r’   r“   z-[%s] Done! Saved: %d, Skipped: %d, Errors: %d)&ÚanyÚLIST_URLÚrangeÚ	MAX_PAGESr0   r/   Ú	LIST_PATHÚ	enumerater   r5   Úprintre   rŠ   ÚstderrÚextendÚ	Exceptionr‡   ÚsetÚaddr{   ÚjsonÚdumpsÚ	SITE_NAMEr   r]   rc   r&   Ú
isinstanceÚstrÚsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚGROUPÚrowcountÚcommitÚclose)Úis_incrementalÚ	page_urlsÚiÚ	all_itemsÚidxr   r1   r3   ÚeÚseenÚunique_itemsÚitemÚresultsr$   Ú	list_dateÚ	det_titleÚdet_dater?   rv   Úfinal_titleÚ
final_dateÚsavedÚskippedÚerrorsÚrÚcontent_textÚsummaryÚconnÚcs                                r   ÚmainrÈ   ²   sÁ  € ÜÑ\Ð4[Ô\Ó\€Nô �
€IÜ�1”i !‘mÓ$ò KˆØ×Ñœ¤IÑ-Ð0EÈÑ0IÑIÕJðKð €IÜ˜iÓ(ò Q‰ˆˆSð	QÜ˜“:ˆDÜ˜tÓ$ˆEÜÐ%¨¨q©´#°e³*Ð(=Ñ=ÄCÇJÁJÕOØ×Ñ˜UÕ#ðQô 
ˆ+œ˜I›Ñ
&¬S¯Z©ZÕ8áÜ& yÓ1ˆ	ÜÐ¤# i£.Ñ0´s·z±zÕBô ‹5€DØ€LØò &ˆØ�‰7˜$ÒØ�H‰H�T˜!‘WÔØ×Ñ Õ%ð&ð
 €GØ!-ò >Ñˆˆs�Ið	>Ü˜“:ˆDÜ8DÀTÈ3Ó8OÑ5ˆI�x ¨+Ø#Ò, uˆKØ!Ò. YˆJØ�N‰NØ$ØØ *Ø"ÙNYœtŸz™z¨+ÀEÕJÐ_aÜ&ñô ô �*˜{¨3¨BÐ/Ñ/´c·j±jÖAð>ð$ €EØ€GØ€FØó ˆØ—u‘u˜Y¨Ó+¨F¨UÐ3ˆÜ—&‘&˜  l°4°CÐ&8Ó9×?Ñ?ÓAÒOÀQÀwÁZˆØ—e‘e˜M¨2Ó.ˆÜ�k¤3Ô'ØäŸ*™* [¸uÔEˆKð	Ü—?‘?¤7Ó+ˆDØ—‘“ˆAØ�I‰Ið .ð �:‘  '¡
¨A¨nÑ,=ÜœE 7¨LØ˜a 
™mð-ô.ð �z‰z˜AŠ~Ø˜‘
‘à˜1‘�Ø�K‰KŒMØ�J‰JŽLð-ô4 
Ð
9¼YÈÈwÐX^Ð<_Ñ
_Ôfi×fpÑfpÕqàò 1ˆÜŒd�j‰j˜¨Ô/Õ0ñ1øôG ò 	QÜÐ*¨c°A©g°s¸AÐ->Ñ>ÄSÇZÁZ×PÓPûð	QûôB ò 	>Ý¢C©Ð+´#·*±*×=Ó=ûð	>ûô: ò 	Ø�a‰KŽFûð	úsK   Á(AMÅ$A>NÉ/BOÍ	N
Í$NÎN
Î	OÎ!N=Î=OÏ	OÏOÏOÚ__main__)"Ú__doc__Úrequestsr]   r£   rŠ   Úosr¨   r   r   Úbs4r   Úurllib.parser   r/   r›   r˜   r¥   r­   Úgetenvrª   rš   r   ÚHEADERSr   ÚSessionr   ÚheadersÚupdater   r5   r{   r‡   rÈ   Ú__name__rV   r   r   ú<module>rÕ      sÍ   ðñ÷ ,× +× +ß (Ý Ý  à&€Ø€	Ø�iÑÐ"4Ñ4€Ø0€	Ø€Ø
ˆ"�)‰)�KÐ!2Ó
3€Ø€	ØÐ ð DØOØ0ñ€ð
 €Ø
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ òòò4d1òN
òS1ðl ˆzÒÙ…Fð r   