Ë
    ¡Š£jÏ-  ã                   ó˜  — 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m	Z	 ddl
mZ ddlmZ dZdZdZd	d
ddœZd„ Zh d£Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  �rÉdej4                  v �r² ed«        ej8                   e«       «      Z ej<                  «       Zej@                  jC                  e«       ej:                  jC                  e«       ejE                  ed¬«      Z#de#_$         ee#jJ                  «      Z& ed e'e&«      › d�«        ejP                  ejR                  jU                  e«      d¬«        e+edd¬«      5 Z,e&D ]´  Z-	 ejE                  e-d    d¬«      Z#de#_$         ee-d    e#jJ                  «      Z.e.d!   xs e-d!   Z/e/e-d    e.d"   xs e-d#   e.d$   e.d%   d&d'e.d(   r ej`                  e.d(   d)¬*«      nd+d,œZ1e,je                   ej`                  e1d)¬*«      d-z   «        ejj                  d/«       Œ¶ 	 ddd«        ed0 e'e&«      › d1�«       y e«        yy# e3$ rZ4 ed.e4› �«       Y dZ4[4ŒNdZ4[4ww xY w# 1 sw Y   ŒBxY w)2u'  
Crawl å¹¿ä¸œçœ�å›½é™…å·¥ç¨‹å’¨è¯¢æœ‰é™�å…¬å�¸ - å…¬ç¤ºå…¬å‘Š
https://www.gdiecc.com.cn/gongshigonggao-list.html
WAF protected by Aliyun - uses Playwright for cookie bootstrapping, then requests for all pages.

List: <ul><li><a href="/gongshigonggao-show-{id}.html">title</a><span>æ›´æ–°æ—¶é—´ï¼šYYYY-MM-DD</span></li></ul>
Detail: 
  Title: <h1> tag text
  Date: å�‘å¸ƒæ—¶é—´ï¼šYYYY-MM-DD in .wh-article-top
  Content: .wh-article-con div
  Attachments: <a href="*.pdf|*.doc|*.docx">
Pagination: /gongshigonggao-list-{page}.html (page 1 = no suffix)
é    N)ÚBeautifulSoup)Úurljoin)Úasync_playwrightzhttps://www.gdiecc.com.cnz2https://www.gdiecc.com.cn/gongshigonggao-list.htmlz%/root/gov_crawler/output/gdiecc.jsonlz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/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)ú
User-AgentÚAcceptzAccept-Languagec               ƒ   ót  K  — t        «       4 ƒd{  –—† } | j                  j                  ddddg¬«      ƒ d{  –—† }|j                  t        d   d¬	«      ƒ d{  –—† }|j                  «       ƒ d{  –—† }|j                  t        d
d¬«      ƒ d{  –—†  t        j                  d«      ƒ d{  –—†  |j                  «       ƒ d{  –—† D �ci c]  }|d   |d   “Œ }}|j                  «       ƒ d{  –—†  |cddd«      ƒd{  –—†  S 7 Œú7 ŒÔ7 Œ´7 Œž7 Œ€7 Œe7 ŒOc c}w 7 Œ*7 Œ# 1 ƒd{  –—†7  sw Y   yxY w­w)z8Use Playwright once to bypass WAF and get valid cookies.NTz>/root/.cache/ms-playwright/chromium-1228/chrome-linux64/chromez--no-sandboxz--disable-setuid-sandbox)ÚheadlessÚexecutable_pathÚargsr   zzh-CN)Ú
user_agentÚlocaleÚnetworkidlei`ê  )Ú
wait_untilÚtimeouté   ÚnameÚvalue)r   ÚchromiumÚlaunchÚnew_contextÚHEADERSÚnew_pageÚgotoÚLIST_URLÚasyncioÚsleepÚcookiesÚclose)ÚpÚbrowserÚctxÚpgÚcr   s         ú!/root/gov_crawler/crawl_gdiecc.pyÚbootstrap_cookiesr%      s*  è ø€ äÓ!÷ ð  QØŸ
™
×)Ñ)ØØ\Ø Ð"<Ð=ð *ó 
÷ 
ˆð
 ×'Ñ'Ü˜|Ñ,Øð (ó 
÷ 
ˆð —<‘<“>×!ˆØ�g‰g”h¨=À%ˆgÓH×HÐHÜ�m‰m˜AÓ×ÐØ8;¿¹»×2EÖF¨Q�1�V‘9˜a ™jÑ(ÐFˆÐFØ�m‰m‹o×ÐØ÷÷ ò øð
øð

øð "øØHøØøØ2EúÒFØøðø÷ ÷ ñ üsÌ   ‚D8‘D’D8•$D#¹Dº!D#ÁDÁD#Á3DÁ4D#ÂDÂD#Â0DÂ1D#ÃDÃ	D#ÃDÃD#Ã4DÃ5D#Ã:D8ÄD!ÄD8ÄD#ÄD#ÄD#ÄD#ÄD#ÄD#ÄD#Ä!D8Ä#D5Ä)D,Ä*D5Ä1D8>)   r   ÚddÚdlÚdtÚh1Úh2Úh3Úh4Úh5Úh6ÚhrÚliÚolÚtdÚthÚtrÚulÚdivÚnavÚpreÚformÚmainÚasideÚtableÚtbodyÚtfootÚtheadÚcenterÚdialogÚfigureÚfooterÚheaderÚhgroupÚaddressÚarticleÚcaptionÚdetailsÚsectionÚfieldsetÚ
blockquoteÚ
figcaptionc                 óÒ   ‡‡‡— | €yddl }ddlmŠ g Šˆˆˆfd„Š ‰| «       dj                  ‰«      }|j	                  dd|«      }|j	                  dd	|«      }|j                  «       S )
ul   å�—çº§è¾¹ç•Œå‡ºæ�¢è¡Œã€�è¡Œå†…èŠ‚ç‚¹ç›´æŽ¥æ‹¼æŽ¥ã€�<br> å‡ºæ�¢è¡Œï¼ˆâ‰ˆ æµ�è§ˆå™¨çœ‹åˆ°çš„æ�¢è¡Œç»“æž„ï¼‰ã€‚NÚ r   )ÚNavigableStringc                 óF  •— | j                   D ]‘  }t        |‰«      r‰j                  t        |«      «       Œ*t	        |dd «      dk(  r‰j                  d«       ŒLt	        |dd «      t
        v r+‰j                  d«        ‰|«       ‰j                  d«       ŒŠ ‰|«       Œ“ y )Nr   Úbrú
)ÚchildrenÚ
isinstanceÚappendÚstrÚgetattrÚ_BLOCK_TAGS)ÚnodeÚchrP   ÚoutÚwalks     €€€r$   r]   zbody_text.<locals>.walkD   s„   ø€ Ø—-‘-ò 
	ˆBÜ˜"˜oÔ.Ø—
‘
œ3˜r›7Õ#Ü˜˜V TÓ*¨dÒ2Ø—
‘
˜4Õ Ü˜˜V TÓ*¬kÑ9Ø—
‘
˜4Ô Ù�R”Ø—
‘
˜4Õ á�R•ñ
	ó    z[ \t\r\f\v]*\n[ \t\r\f\v]*rS   z\n{3,}z

)ÚreÚbs4rP   ÚjoinÚsubÚstrip)ÚelÚ_reÚtrP   r\   r]   s      @@@r$   Ú	body_textrg   <   sb   ú€ à	€zØÛÝ#Ø
€Cöñ 	ˆ„HØ
�‰�‹€AØ�‰Ð-¨t°QÓ7€AØ�‰�	˜6 1Ó%€AØ�7‰7‹9Ðr^   c                 ó$   — | dk(  rt         S d| › d�S )Né   z.https://www.gdiecc.com.cn/gongshigonggao-list-z.html)r   )Úpage_nums    r$   Úget_page_urlrk   W   s   € Ø�1‚}ÜˆØ;¸H¸:ÀUÐKÐKr^   c                 ó,  — t        | d«      }g }|j                  d«      D ]ñ  }|j                  d«      }t        |«      dk  rŒ#|D ]Ê  }|j                  dd¬«      }|sŒ|j	                  dd	«      }d
|vrŒ0|j                  d«      st        t        |«      }|j                  d¬«      }|sŒfd	}	|j                  d«      }
|
r;|
j                  d¬«      }t        j                  d|«      }|r|j                  d«      }	|j                  |||	dœ«       ŒÌ Œó |S )Núhtml.parserr5   r0   é   ÚaT©Úhrefrq   rO   zgongshigonggao-showÚhttp©rc   Úspanú(\d{4}-\d{1,2}-\d{1,2})ri   )ÚurlÚtitleÚdate)r   Úfind_allÚlenÚfindÚgetÚ
startswithr   ÚBASE_URLÚget_textr_   ÚsearchÚgrouprV   )ÚhtmlÚsoupÚitemsr5   Úlisr0   ro   rq   rw   rx   rt   ÚtxtÚms                r$   Ú
parse_listrˆ   \   s  € Ü˜˜}Ó-€DØ€EØ�m‰m˜DÓ!ò FˆØ�k‰k˜$ÓˆÜˆs‹8�aŠ<ØØò 	FˆBØ—‘˜ $�Ó'ˆAÙØØ—5‘5˜ Ó$ˆDØ$¨DÑ0ØØ—?‘? 6Ô*Üœx¨Ó.�Ø—J‘J T�JÓ*ˆEÙØØˆDØ—7‘7˜6“?ˆDÙØ—m‘m¨$�mÓ/�Ü—I‘IÐ8¸#Ó>�ÙØŸ7™7 1›:�DØ�L‰L °¸tÑDÕEñ'	Fð	Fð0 €Lr^   c                 óÆ  — t        |d«      }d}|j                  dd¬«      }|r|j                  d«      }n|j                  d«      }|r|j                  d¬«      }d}|j                  dd¬«      }|r;|j                  d¬«      }t        j                  d	|«      }	|	r|	j                  d
«      }|sZdD ]U  }
|j                  d|
¬«      }|sŒ|j                  d¬«      }t        j                  d	|«      }	|	sŒD|	j                  d
«      } n |j                  dd¬«      }|s|j                  dd¬«      }d}d}g }|�r|j                  d«      D ]:  }g d¢}t        |j                  «      D ]  }||vsŒ|j                  d«      rŒ||= Œ Œ< t        |«      }t        |«      }|j                  dd¬«      D ]�  }|j                  dd«      }t        j                  d|j                  «       «      sŒ:|j                  d«      r|nt        | |«      }|j                  ||j                  d¬«      xs t         j"                  j%                  |«      dœ«       ŒŸ ||||r|d d |dœS d|dœS )Nrm   rO   r6   zwh-article-top)Úclass_r)   Trs   ru   ri   )Ú	ingongshiz
wh-articlezwh-article-conÚcontent)rq   ÚsrcÚaltÚtargetÚborderzmso-ro   rp   rq   z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$rr   )rv   Útextiô  )rw   Úpub_dateÚcontent_htmlÚsummaryÚattachments)r   r{   r   r_   r€   r�   ry   ÚlistÚattrsr}   rW   rg   r|   Úlowerr   rV   ÚosÚpathÚbasename)rv   r‚   rƒ   rw   Útop_divr)   r’   Údate_divr†   r‡   Úclsrd   Úcontent_divr“   r”   r•   ÚtagÚattrs_to_keepÚattrro   ÚahrefÚfull_urls                         r$   Úparse_detailr¥   y   su  € Ü˜˜}Ó-€Dð €EØ�i‰i˜Ð&6ˆiÓ7€GÙØ�\‰\˜$Ó‰à�Y‰Y�t‹_ˆÙ	Ø—‘ $�Ó'ˆð €HØ�y‰y˜Ð'7ˆyÓ8€HÙØ×Ñ dÐÓ+ˆÜ�I‰IÐ0°#Ó6ˆÙØ—w‘w˜q“zˆHñ Ø.ò 	ˆCØ—‘˜5¨�Ó-ˆBÚØ—k‘k¨�kÓ-�Ü—I‘IÐ8¸#Ó>�ÚØ Ÿw™w q›z�HÙð	ð —)‘)˜EÐ*:�)Ó;€KÙØ—i‘i ¨i�iÓ8ˆà€LØ€GØ€KÚà×'Ñ'¨Ó-ò 	"ˆCÚFˆMÜ˜SŸY™Y›ò "�Ø˜}Ò,°T·_±_ÀVÕ5LØ˜D™	ñ"ð	"ô
 ˜;Ó'ˆÜ˜KÓ(ˆà×%Ñ% c°Ð%Ó5ò 	qˆAØ—E‘E˜& "Ó%ˆEÜ�y‰yÐ>ÀÇÁÃÕNØ$)×$4Ñ$4°VÔ$<™5Ä'È#ÈuÓBU�Ø×"Ñ"¨8¸Q¿Z¹ZÈd¸ZÓ=SÒ=nÔWY×W^ÑW^×WgÑWgÐhmÓWnÑ#oÕpð		qð ØØ$Ù$+�7˜4˜C�=Ø"ñð ð 24Ø"ñð r^   c                  óÊ  — t        d«       t        j                  t        «       «      } t        d| j	                  «       D ��ci c]  \  }}t        |«      dkD  sŒ||d d dz   “Œ c}}«       t        j                  «       }|j                  j                  t        «       |j                  j                  | «       t        d«       |j                  t        d¬«      }d|_        t        |j                   «      }t        d	t        |«      › d
�«       d}t#        dd«      D ]Ò  }t%        |«      }	 |j                  |d¬«      }	d|	_        d|	j                   v rt        d|› d�«        n�t        |	j                   «      }
t        |
«      dk(  rt        d|› d�«        nY|j'                  |
«       |}|dz  dk(  r't        d|› dt        |
«      › dt        |«      › d�«       t)        j*                  d«       ŒÔ t        dt        |«      › d|› �«       t/        j0                  t.        j2                  j5                  t6        «      d¬«       d}t9        t6        dd¬«      5 }t;        |«      D �]x  \  }}t        |d   «      d kD  r|d   d d  dz   n|d   }t        d!|dz   › d"t        |«      › d#|› �«       	 |j                  |d$   d¬«      }d|_        d|j                   v r`t        d%«       t        j                  t        «       «      } |j                  j                  | «       |j                  |d$   d¬«      }d|_        t=        |d$   |j                   «      }|d   xs |d   }||d$   |d&   xs |d'   |d(   |d)   d*d+|d,   rt?        j@                  |d,   d-¬.«      nd/d0œ}|jC                  t?        j@                  |d-¬.«      d1z   «       |dz  }t)        j*                  d3«       �Œ{ 	 d d d «       t        d4|› d5t6        › �«       y c c}}w # t,        $ r}t        d|› d|› �«       Y d }~ �Œ4d }~ww xY w# t,        $ r}t        d2|d$   › d|› �«       Y d }~Œˆd }~ww xY w# 1 sw Y   ŒxxY w)6Nz+Bootstrapping WAF cookies via Playwright...zGot cookies:é   z...zFetching page 1...é   ©r   úutf-8z  Found ú items on page 1ri   é   ée   Ú
renderDataz  Page z: WAF blockedr   z: 0 items, endé   z: z items (total: ú)g333333Ó?z: ERROR z
Total items from list: z	, pages: T©Úexist_okÚw©Úencodingrw   é(   z  [ú/z] rv   z.    WAF blocked on detail! Re-bootstrapping...r’   rx   r“   r”   õ'   å¹¿ä¸œçœ�å›½é™…å·¥ç¨‹å’¨è¯¢æœ‰é™�å…¬å�¸õ   ä¼�ä¸šr•   F©Úensure_asciirO   ©rw   rv   rx   rŒ   r”   Ú	site_namer�   r•   rS   z    [ERROR] ç      à?z
Done! z records written to )"Úprintr   Úrunr%   r„   rz   ÚrequestsÚSessionÚheadersÚupdater   r   r|   r   rµ   rˆ   r‘   Úrangerk   ÚextendÚtimer   Ú	Exceptionr™   Úmakedirsrš   ÚdirnameÚOUTPUT_FILEÚopenÚ	enumerater¥   ÚjsonÚdumpsÚwrite)r   ÚkÚvÚsÚrespr„   Útotal_pagesr   rv   ÚrÚ
page_itemsÚeÚrecord_countÚfÚiÚitemÚpreviewÚdetailÚfinal_titleÚrecords                       r$   r:   r:   º   s  € ä	Ð
7Ô8Ü�k‰kÔ+Ó-Ó.€GÜ	ˆ.°w·}±}³×V©t¨q°!Ì#ÈaË&ÐSUË+˜1˜a  ˜f U™l™?ÓVÔWä×ÑÓ€AØ‡I�I×Ñ”WÔØ‡I�I×Ñ�WÔô 
Ð
ÔØ�5‰5” 2ˆ5Ó&€DØ€D„MÜ�t—y‘yÓ!€EÜ	ˆH”S˜“Z�LÐ 0Ð
1Ô2ð €KÜ�1�c‹]ò ˆÜ˜1‹oˆð	Ø—‘�c 2�Ó&ˆAØ ˆAŒJØ˜qŸv™vÑ%Ü˜ ˜s -Ð0Ô1ÙÜ# A§F¡FÓ+ˆJÜ�:‹ !Ò#Ü˜ ˜s .Ð1Ô2ÙØ�L‰L˜Ô$ØˆKØ�2‰v˜Š{Ü˜ ˜s "¤S¨£_Ð$5°_ÄSÈÃZÀLÐPQÐRÔSÜ�J‰J�s�Oð!ô* 
Ð%¤c¨%£j \°¸;¸-Ð
HÔIô ‡K�K”—‘—‘¤Ó,°tÕ<Ø€LÜ	Œk˜3¨Ô	1ð °QÜ  Ó'ó 	‰GˆAˆtÜ47¸¸W¹Ó4FÈÒ4K�d˜7‘m C RÐ(¨5Ò0ÐQUÐV]ÑQ^ˆGÜ�C˜˜!™�u˜Aœc %›j˜\¨¨G¨9Ð5Ô6ð9Ø—u‘u˜T %™[°"�uÓ5�Ø '�”Ø 4§9¡9Ñ,ÜÐJÔLÜ%Ÿk™kÔ*;Ó*=Ó>�GØ—I‘I×$Ñ$ WÔ-ØŸ5™5  e¡°b˜5Ó9�DØ$+�D”Mä% d¨5¡k°4·9±9Ó=�Ø$ W™oÒ>°°g±�à(Ø ™;Ø" :Ñ.Ò>°$°v±,Ø% nÑ5Ø% iÑ0Ø!JØ%Ø\bÐcpÒ\q¤4§:¡:¨f°]Ñ.CÐRWÕ#XÐwyñ	�ð —‘œŸ
™
 6¸Ô>ÀÑEÔFØ Ñ!�ô �J‰J�sŽOñ;	÷ô@ 
ˆH�\�NÐ"6´{°mÐ
DÕEùóS Wøô@ ò 	Ü�G˜A˜3˜h q cÐ*Ô+Þûð	ûôJ ò 9Ü˜ T¨%¡[ M°°A°3Ð7×8Ñ8ûð9ú÷9ð úsi   ÁP ÁP Ä-7PÅ&2PÆAPÉAQÊ.DP/Ï	QÐ	P,ÐP'Ð'P,Ð/	QÐ8QÑQÑQÑQÑQ"Ú__main__z--incrementalz#Incremental mode: crawl page 1 onlyr¨   r©   rª   zFound r«   Tr±   r³   r´   rv   rw   r’   rx   r“   r”   r¸   r¹   r•   Frº   rO   r¼   rS   zERROR: r¾   zIncremental done: z records)6Ú__doc__r   rÁ   rÎ   r_   r™   ÚsysrÇ   r`   r   Úurllib.parser   Úplaywright.async_apir   r~   r   rË   r   r%   rY   rg   rk   rˆ   r¥   r:   Ú__name__Úargvr¿   rÀ   r   rÂ   rÓ   rÃ   rÄ   r|   rÔ   rµ   r‘   r„   rz   rÉ   rš   rÊ   rÌ   rÚ   rÜ   rÞ   rß   rÏ   rà   rÐ   rÈ   rØ   r   © r^   r$   ú<module>ré      sv  ðñ÷ 2× 1× 1Ó 1Ý Ý  Ý 1à&€Ø?€Ø5€ð QØOØ0ñ€òò.*€òò6Lò
ò:?òBMFð^ ˆzÓØ˜#Ÿ(™(Ò"ÙÐ3Ô4Ø�'—+‘+Ñ/Ó1Ó2ˆØˆH×ÑÓˆØ	�	‰	×Ñ˜Ô!Ø	�	‰	×Ñ˜Ô!Ø�u‰u�X rˆuÓ*ˆØˆŒÙ˜4Ÿ9™9Ó%ˆÙ�‘s˜5“z�lÐ"2Ð3Ô4Øˆ�‰�B—G‘G—O‘O KÓ0¸4Õ@Ù�+˜s¨WÔ5ð 	 ¸Øò  �ð)ØŸ5™5  e¡°b˜5Ó9�DØ$+�D”MÙ)¨$¨u©+°t·y±yÓA�FØ"(¨¡/Ò"B°T¸'±]�Kà!,Ø# E™{Ø & zÑ 2Ò B°d¸6±lØ#)¨.Ñ#9Ø#)¨)Ñ#4Ø%NØ!)Ø`fÐgtÒ`u z t§z¡z°&¸Ñ2GÐV[Õ'\Ð{}ñ	�Fð —G‘G˜J˜DŸJ™J v¸EÔBÀTÑIÔJð �—
‘
˜3•ñ' ÷	 ñ* 	Ð"¡3 u£: ,¨hÐ7Õ8á�ðG øð< !ò )Ù˜G A 3˜-×(Ñ(ûð)ú÷%	 ð 	 ús7   ÅI ÅBH#Ç*I È#H=È(H8È3I È8H=È=I É I	