Ë
    V_Šj±(  ã                   óV  — 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d„Zd„ Zd„ Z d„ Z!e"dk(  r e!«        yy)u¨   
Crawler for å²³é˜³å¸‚äº‘æºªåŒº-é€šçŸ¥å…¬å‘Š
CMS: creatorCMS-like, GB2312, ul.news-list-wrapperåˆ—è¡¨ + div.content-wrapperæ­£æ–‡
Site: www.yunxiqu.gov.cn/38965/39020/
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinzhttp://www.yunxiqu.gov.cnz/38965/39020z
/index.htmu   å²³é˜³å¸‚äº‘æºªåŒº-é€šçŸ¥å…¬å‘Š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)ÚtimeoutÚgb2312)ÚsessionÚgetÚTIMEOUTÚencodingÚtext)ÚurlÚresps     ú'/root/gov_crawler/crawl_yunxiqu_tzgg.pyÚfetchr      s%   € Ü�;‰;�s¤Gˆ;Ó,€DØ€D„MØ�9‰9Ðó    c                 ó’  — t        | d«      }g }|j                  dd¬«      }|s|S |j                  ddd¬«      D �]	  }|j                  d	d
¬«      }|sŒ|j                  dd¬«      }|sŒ0|j                  d
«      xs |j	                  d¬«      }|d   j                  «       }|r|sŒm|j                  d	d¬«      }	|	r|	j	                  d¬«      nd}
|j                  d«      rn=|j                  d«      r
t        |z   }n"t        t        z   dz   |j                  d«      z   }|j                  |j                  «       ||
dd f«       �Œ |S )uQ   Parse list â€” ul.news-list-wrapper > li.entry-wrapper > div.title > a + div.dateúhtml.parserÚulznews-list-wrapper©Úclass_Úlizentry-wrapperF)r   Ú	recursiveÚdivÚtitleÚaT©Úhref©Ústripr$   ÚdateÚ Úhttpú/z./Né
   )r   ÚfindÚfind_allr   Úget_textr&   Ú
startswithÚBASE_URLÚ	LIST_PATHÚlstripÚappend)ÚhtmlÚsoupÚitemsr   r   Ú	title_divr"   r!   r$   Údate_divr'   s              r   Ú
parse_listr9   %   sA  € ä˜˜}Ó-€DØ€EØ	�‰�4Ð 3ˆÓ	4€BÙØˆØ�k‰k˜$ À%ˆkÓHó 7ˆØ—G‘G˜E¨'�GÓ2ˆ	ÙØØ�N‰N˜3 TˆNÓ*ˆÙØØ—‘�g“Ò8 !§*¡*°4 *Ó"8ˆØ�‰y�‰Ó ˆÙ™DØØ—7‘7˜5¨�7Ó0ˆÙ08ˆx× Ñ  tÐ Ô,¸bˆà�?‰?˜6Ô"ØØ�_‰_˜SÔ!Ü˜d‘?‰DäœiÑ'¨#Ñ-°·±¸DÓ0AÑAˆDØ�‰�e—k‘k“m T¨4°°¨9Ð5Ö6ð)7ð* €Lr   c           	      óº  — |€
t        «       }g }| j                  D �]·  }t        |t        «      r$|j	                  «       }|r|j                  |«       Œ8|j                  sŒEt        |«      |v rŒS|j                  t        |«      «       |j                  j                  «       }|dk(  �rÑg }|j                  D �]—  }t        |t        «      r%|j	                  «       }|sŒ'|j                  |«       Œ9|j                  dk(  rŠ|j                  t        |«      «       |j                  dd«      j	                  «       }	|j                  d¬«      }
|	r'|
r%t        ||	«      }|j                  d|
› d|› d	�«       Œ½|
sŒÀ|j                  |
«       ŒÒ|j                  d
k(  rp|j                  t        |«      «       |j                  dd«      }|s�Œ|j                  dd«      }t        ||«      }|j                  |r	d|› d|› d	�nd|› d	�«       �ŒQ|j                  dk(  r�Œbt        |d«      s�Œp|j                  dd¬«      }|s�Œ‡|j                  |«       �Œš dj                  |«      }|s�ŒK|j                  |«       �Œ^|dk(  r˜g }|j!                  d«      D ]\  }|j!                  ddg«      D �cg c]  }|j                  dd¬«      ‘Œ }}|sŒ7|j                  ddj                  |«      z   dz   «       Œ^ |s�ŒÙ|j                  dj                  |«      «       �Œû|d
k(  rV|j                  dd«      }|s�Œ|j                  dd«      }t        ||«      }|j                  |r	d|› d|› d	�nd|› d	�«       �ŒV|dv r|j#                  t%        |||«      «       �Œx|dk(  r|j                  d«       �Œ�|j                  dd¬«      }|s�Œ§|j                  |«       �Œº |S c c}w )a  Recursively render children of a content node into text parts.

    Each <p> becomes one part (paragraph). <table> becomes a Markdown table block.
    Wrapper <div>/<blockquote>/<section> are recursed into.
    Standalone <img> becomes a markdown image. <br> produces an empty part.
    Úpr"   r$   r(   Tr%   ú[ú](ú)ÚimgÚsrcÚaltz![z![](Úbrr.   ú ÚtableÚtrÚtdÚthz| z | z |ú
)r    Ú
blockquoteÚsectionrF   rG   )ÚsetÚchildrenÚ
isinstanceÚstrr&   r3   ÚnameÚidÚaddÚlowerÚcontentsr   r.   r   ÚhasattrÚjoinr-   ÚextendÚ_render_node_children)Únoder   Ú	processedÚpartsÚchildÚtxtÚtagÚp_partsÚelemÚahrefÚatxtÚ	full_hrefr@   rA   Úfull_srcÚjoinedÚrowsrE   rF   Úcellss                       r   rW   rW   D   sq  € ð ÐÜ“Eˆ	Ø€Eà—‘ó J"ˆÜ�eœSÔ!Ø—+‘+“-ˆCÙØ—‘˜SÔ!Øà�zŠzØÜˆe‹9˜	Ñ!ØØ�‰”b˜“iÔ à�j‰j×ÑÓ ˆà�#‹:ØˆGØŸ™ó ,�Ü˜d¤CÔ(ØŸ*™*›,�CÚØŸ™ sÕ+Ø—Y‘Y #Ò%Ø—M‘M¤" T£(Ô+Ø ŸH™H V¨RÓ0×6Ñ6Ó8�EØŸ=™=¨t˜=Ó4�DÙ¡Ü$+¨C°Ó$7˜	ØŸ™¨¨4¨&°°9°+¸QÐ'?Õ@ÚØŸ™ tÕ,Ø—Y‘Y %Ò'Ø—M‘M¤" T£(Ô+ØŸ(™( 5¨"Ó-�CÛØ"Ÿh™h u¨bÓ1˜Ü#*¨3°Ó#4˜ØŸ™Á#¨¨C¨5°°8°*¸AÑ'>ÈTÐRZÐQ[Ð[\ÐK]Ö^Ø—Y‘Y $Ò&ÙÜ˜T :Ö.ØŸ-™-¨°4˜-Ó8�CÛØŸ™ sÖ+ð5,ð6 —X‘X˜gÓ&ˆFÛØ—‘˜VÖ$à�GŠ^ØˆDØ—n‘n TÓ*ò A�Ø@BÇÁÈTÐSWÈLÓ@YÖZ¸"˜Ÿ™ S°˜Õ5ÐZ�ÐZÚØ—K‘K  u§z¡z°%Ó'8Ñ 8¸4Ñ ?Õ@ðAó Ø—‘˜TŸY™Y t›_Ö-à�EŠ\Ø—)‘)˜E 2Ó&ˆCÛØ—i‘i  rÓ*�Ü" 3¨Ó,�Ø—‘¹˜r #  b¨¨
°!Ñ4À4ÈÀzÐQRÐASÖTàÐ@Ñ@à�L‰LÔ.¨u°c¸9ÓEÖFà�DŠ[Ø�L‰L˜Öð —.‘. ¨D�.Ó1ˆCÛØ—‘˜SÖ!ðUJ"ðX €Lùò3 [s   Ê)Oc                 óX  — t        | d«      }d}|j                  ddt        j                  dt        j                  «      i¬«      }|r$|j                  d«      r|d   j                  «       }|sZ|j                  dt        j                  d	t        j                  «      ¬
«      }|r#|j                  d«      s|j                  d¬«      }d}|j                  «       }t        j                  d|«      }|r|j                  d«      }d}	|j                  dd¬
«      }
|
rt        |
|«      }dj                  |«      }	|
xs |}g }|j                  dd¬«      D ]‘  }|d   j                  «       j                  «       }t        j                  d|«      sŒ;t        ||d   j                  «       «      }|j                  |j                  d¬«      xs |j!                  d«      d   |dœ«       Œ“ t#        |	j                  «       «      dk  r$|r"d|› d|› d�}	|D ]  }|	d|d	   › d|d   › d�z  }	Œ |||	|fS ) u:   Parse detail â€” meta title + div.content-wrapper content.r   r(   ÚmetarO   zTitle|ArticleTitle)ÚattrsÚcontentr    r!   r   r"   Tr%   z(\d{4}-\d{2}-\d{2})é   zcontent-wrapperz

r#   r$   z&\.(pdf|doc|docx|xls|xlsx|zip|rar|txt)$r*   éÿÿÿÿ)r!   r   r   z<p><a href="z">u   </a></p>

é™„ä»¶åˆ—è¡¨ï¼š
z  - [r=   r   z)
)r   r,   ÚreÚcompileÚIr   r&   r.   ÚsearchÚgrouprW   rU   r-   rR   r   r3   ÚsplitÚlen)r4   r   r5   r!   Ú
meta_titler7   Úpub_dater   ÚmÚcontent_htmlÚcontent_divrZ   ÚscopeÚattachmentsr"   r`   Úfull_urlÚatts                     r   Úparse_detailr}   ž   s#  € ä˜˜}Ó-€Dð €EØ—‘˜6¨&´"·*±*Ð=RÔTV×TXÑTXÓ2YÐ)Z�Ó[€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆÙØ—I‘I˜e¬B¯J©J°xÄÇÁÓ,F�IÓGˆ	Ù˜YŸ^™^¨CÔ0Ø×&Ñ&¨TÐ&Ó2ˆEð €HØ�=‰=‹?€DÜ
�	‰	Ð(¨$Ó/€AÙØ—7‘7˜1“:ˆð €LØ—)‘)˜EÐ*;�)Ó<€KÙÜ% k°3Ó7ˆØ—{‘{ 5Ó)ˆð Ò˜4€EØ€KØ�^‰^˜C dˆ^Ó+ò nˆØ�&‘	—‘Ó!×'Ñ'Ó)ˆÜ�9‰9Ð>ÀÕFÜ˜s A f¡I§O¡OÓ$5Ó6ˆHØ×Ñ¨¯©¸$¨Ó)?Ò)ZÀ8Ç>Á>ÐRUÓCVÐWYÑCZÐckÑlÕmð	nô ˆ<×ÑÓÓ  2Ò%©+Ø% c U¨"¨U¨GÐ3PÐQˆØò 	DˆCØ˜e C¨¡L >°°C¸±J°<¸sÐCÑC‰Lð	Dð �(˜L¨+Ð5Ð5r   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Ústrptimer3   Ú
ValueErrorÚ
IndexError)r6   Ú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|› d�z   «       Œ' g }t        |«      D ][  \  }}	 t        |«      }t        |«      }t        d|dz   › dt        |«      › d	�t        j                  ¬
«       |j                  |«       Œ] t        dt        |«      › �t        j                  ¬
«       | r2t!        |«      }t        dt        |«      › �t        j                  ¬
«       t#        «       }	g }
|D ]/  }|d   |	vsŒ|	j%                  |d   «       |
j	                  |«       Œ1 t        dt        |
«      › �t        j                  ¬
«       g }|
D ]…  \  }}}	 t        |«      }t'        ||«      \  }}}}|xs |}|xs |}|j	                  |||||rt)        j*                  |d¬«      ndt,        dœ«       t        d|d d › �t        j                  ¬
«       Œ‡ 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  }|jI                  «        |jK                  «        �Œ t        d$|› �t        j                  ¬
«       |D ]"  }t        t)        j*                  |d¬«      «       Œ$ y # t        $ r2}t        d|dz   › d|› d|› �t        j                  ¬
«       Y d }~�Œ>d }~ww xY w# t        $ r,}t        d|› d|› �t        j                  ¬
«       Y d }~�ŒRd }~ww xY w# t        $ r2}t        d"|d   d d# › d|› �t        j                  ¬
«       Y d }~�Œd }~ww xY w)%Nc              3   ó@   K  — | ]  }|t         j                  v –— Œ y ­w©N)ÚsysÚargv)Ú.0Úargs     r   ú	<genexpr>zmain.<locals>.<genexpr>Ù   s   è ø€ Ò\¨S˜¤§¡œÑ\ùs   ‚)z--incrementalÚincrementalÚincé   rk   z/index_z.htmzPage z: z items)Úfilez error (z): zTotal: zIncremental: zUnique: F)Úensure_asciir(   )r!   Úpage_urlÚpublish_daterj   rz   Ú	site_namez  OK: é2   z  ERR r   rj   iPÃ  z\s+rC   éÈ   r!   rz   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  DB error for é   zSaved to DB: )&ÚanyÚLIST_URLÚrangeÚ	MAX_PAGESr3   r0   r1   Ú	enumerater   r9   Úprintrs   r�   ÚstderrrV   Ú	Exceptionr‰   rK   rQ   r}   ÚjsonÚdumpsÚ	SITE_NAMEr   rm   Úsubr&   rM   rN   Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚGROUPÚrowcountÚcommitÚclose)Úis_incrementalÚ	page_urlsÚiÚ	all_itemsÚidxr   r4   r6   ÚeÚseenÚunique_itemsÚitemÚresultsr!   Ú	list_dateÚ	det_titleÚdet_daterj   rz   Úfinal_titleÚ
final_dateÚsavedÚrÚcontent_textÚsummaryÚconnÚcs                              r   ÚmainrÇ   Ø   sû  € ÜÑ\Ð4[Ô\Ó\€NÜ�
€IÜ�1”i !‘mÓ$ò CˆØ×Ñœ¤IÑ-°'¸!¸¸DÐ0AÑAÕBðCð €IÜ˜iÓ(ò G‰ˆˆSð	GÜ˜“:ˆDÜ˜tÓ$ˆEÜ�E˜#˜a™%˜ ¤3 u£: ,¨fÐ5¼C¿J¹JÕGØ×Ñ˜UÕ#ðGô 
ˆG”C˜	“NÐ#Ð
$¬3¯:©:Õ6ÙÜ& yÓ1ˆ	Ü�œc )›nÐ-Ð.´S·Z±ZÕ@ä‹5€DØ€LØò &ˆØ�‰7˜$ÒØ�H‰H�T˜!‘WÔØ×Ñ Õ%ð&ô
 
ˆH”S˜Ó&Ð'Ð
(¬s¯z©zÕ:à€GØ!-ò 8Ñˆˆs�Ið	8Ü˜“:ˆDÜ8DÀTÈ3Ó8OÑ5ˆI�x ¨+Ø#Ò, uˆKØ!Ò. YˆJØ�N‰NØ$ØØ *Ø"ÙNYœtŸz™z¨+ÀEÕJÐ_aÜ&ñô ô �F˜; s¨Ð+Ð,Ð-´C·J±JÖ?ð8ð$ €EØó MˆØ—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ð	MÜ—?‘?¤7Ó+ˆDØ—‘“ˆAØ�I‰Ið .ð �:‘  '¡
¨A¨nÑ,=ÜœE 7¨LØ˜a 
™mð-ô.ð �z‰z˜AŠ~Ø˜‘
�Ø�K‰KŒMØ�J‰JŽLð)Mô. 
ˆM˜%˜Ð
!¬¯
©
Õ3àò 1ˆÜŒd�j‰j˜¨Ô/Õ0ñ1øô} ò 	GÜ�E˜#˜a™%˜ ¨¨¨S°°Ð4¼3¿:¹:×FÓFûð	GûôB ò 	8Ü�F˜3˜%˜r ! Ð%¬C¯J©J×7Ó7ûð	8ûô2 ò 	MÜ�O A g¡J¨s° OÐ#4°B°q°cÐ:ÄÇÁ×LÓLûð	MúsK   Á)AM*ÆA>N(ÊBO Í*	N%Í3'N Î N%Î(	OÎ1!OÏOÏ 	PÏ)'PÐPÚ__main__rŒ   )#Ú__doc__Úrequestsrm   r¥   r�   Úosr©   r   r   Úbs4r   Úurllib.parser   r0   r1   rž   r§   r®   Úgetenvr«   r�   r    ÚHEADERSr   ÚSessionr   ÚheadersÚupdater   r9   rW   r}   r‰   rÇ   Ú__name__© r   r   ú<module>rÕ      sÒ   ðñ÷
 ,× +× +ß (Ý Ý  à&€Ø€	Ø�iÑ ,Ñ.€Ø-€	Ø€Ø
ˆ"�)‰)�KÐ!2Ó
3€ØÐ Ø€	ð DØOØ0ñ€ð
 €Ø
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ òòó>Wòt*6òZ
òL1ð^ ˆzÒÙ…Fð r   