Ë
    	öwjÓ  ã                   ó¸  — 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m	Z	 ddl
mZ ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ  ej&                  «        e	d¬«      z
  j)                  d«      Zd	Zd
ZdZedz   ZdZdZdd„Zdd„Zd„ Zd„ Zd„ Z d„ Z!e"dk(  r e!«        yy)ug  crawl_ncjk_gggs.py - å�—æ˜Œç»�å¼€åŒº-å…¬å‘Šå…¬ç¤º (æ±Ÿè¥¿å�—æ˜Œ)

ç«™ç‚¹: https://ncjk.nc.gov.cn/ncjkq/gggs/list.shtml
CMS: TRS ç³» (createPageHTML('page_div',13,1,'list','shtml',257) = 257æ�¡/13é¡µ)
åˆ—è¡¨: <a href="/ncjkq/gggs/YYYYMM/32hex.shtml" target="_blank">æ ‡é¢˜</a> + <span>æ—¥æœŸ</span>
åˆ†é¡µ: list_N.shtml (N=2..13)
âš ï¸� WAF: ç‘žæ•° js æ··æ·† + é™�é€Ÿå°�IP (~30s) â€” requests/urllib3 å…¨è¢«æ‹¦ (TLS æŒ‡çº¹), å¿…é¡»ç”¨ curl subprocess
      + Chrome UA + Referer + Accept; è¯·æ±‚é—´éš” 1.5s; 403(7148Bè­¦å‘Šé¡µ)æ—¶ sleep 30 é‡�è¯•
è¯¦æƒ…: meta ArticleTitle + meta PubDate + div.zoom (å†…å�« zoomcon)
é    N)ÚdatetimeÚ	timedelta)Úurljoin)Úpush_to_searchdbiG  )Údaysz%Y-%m-%du   å�—æ˜Œç»�å¼€åŒº-å…¬å‘Šå…¬ç¤ºu   æ±Ÿè¥¿zhttps://ncjk.nc.gov.cnz/ncjkq/gggs/list.shtmlzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36i@  c                 ó  — |€<dt        j                  «       › dt        t        j                  «       dz  «      dz  › d�}dddd	d
t        dd|› �ddddddd|d|d| g}t        j                  |ddd¬«      }|j                  S )Nz/tmp/ncjk_cj_Ú_iè  i † z.txtÚcurlz-skz-mÚ25z-Az-Hz	Referer: z]Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8zAccept-Language: zh-CN,zh;q=0.9zConnection: keep-alivez-cz-bz-LTé   )Úcapture_outputÚtextÚtimeout)ÚosÚgetpidÚintÚtimeÚUAÚ
subprocessÚrunÚstdout)ÚurlÚrefererÚcjÚcmdÚrs        ú$/root/gov_crawler/crawl_ncjk_gggs.pyÚcurl_getr      s—   € Ø	€zØœRŸY™Y›[˜M¨¬3¬t¯y©y«{¸TÑ/AÓ+BÀVÑ+KÐ*LÈDÐQˆà��t˜TØŒbØ�	˜'˜Ð#ØÐmØÐ/ØÐ&Øˆb�$˜Øˆcð	€Cô 	�‰�s¨4°dÀBÔG€AØ�8‰8€Oó    c           
      ó  — |xs t         }t        d«      D ]n  }t        | |«      }t        |«      t        k  sd|v rGt        d| › dt        |«      › d|dz   › d�t        j                  ¬«       t        j                  d	«       Œl|c S  y
)uN   å¸¦é™�é€Ÿä¸Ž WAF é‡�è¯•çš„æŠ“å�– (æ¯�æ¬¡ç‹¬ç«‹ cookie jar, é�¿å…�é¢‘çŽ‡è¿½è¸ª)é   u   é¡µé�¢æœªæ‰¾åˆ°z    [WAF/blocked] z len=z	 attempt=é   z, sleep 30...)Úfiler   Ú )
ÚLIST_URLÚranger   ÚlenÚWAF_BLOCK_SIZEÚprintÚsysÚstderrr   Úsleep)r   r   ÚrefÚattemptÚhtmls        r   Úfetchr0   -   s‡   € à
Ò
”X€CÜ˜“8ò ˆÜ˜˜SÓ!ˆÜˆt‹9”~Ò%Ð):¸dÑ)BäÐ& s e¨5´°T³°¸9ÀWÈqÁ[ÀMÐQ^Ð_Ôfi×fpÑfpÕqÜ�J‰J�rŒNØØŠðð r   c                 óÜ  — g }t        j                  d| t         j                  «      D �]   }|j                  d«      |j                  d«      }}t        j                  dd|«      j                  «       }|j                  dd«      j                  «       }t        j                  dd|«      }t        |«      dk  rŒ‘d}t        j                  d	| |j                  «       |j                  «       d
z    «      }|r|j                  d«      }|j                  t        t        |«      ||dœ«       �Œ t        «       }	g }
|D ]/  }|d   |	v rŒ|	j                  |d   «       |
j                  |«       Œ1 |
S )u>   åˆ—è¡¨æ�¡ç›®: /ncjkq/gggs/YYYYMM/32hex.shtml + æ ‡é¢˜ + æ—¥æœŸz@<a href="(/ncjkq/gggs/\d{6}/[0-9a-f]{32}\.shtml)"[^>]*>(.*?)</a>r"   é   ú<[^>]+>r$   õ   â€‹õ   ^\s*(?:&middot;|&nbsp;|Â·|\s)+é   z <span>(\d{4}-\d{2}-\d{2})</span>éÈ   )r   ÚtitleÚdater   )ÚreÚfinditerÚDOTALLÚgroupÚsubÚstripÚreplacer'   ÚsearchÚendÚappendr   ÚBASEÚsetÚadd)r/   Úpage_noÚitemsÚmÚhrefÚ
title_htmlr8   Ú	date_textÚdmÚseenÚuniqÚits               r   Úextract_itemsrQ   ;   sB  € à€EÜ�[‰[Ð\Ð^bÔdf×dmÑdmÓnó VˆØŸ7™7 1›: q§w¡w¨q£zˆjˆÜ—‘�z 2 zÓ2×8Ñ8Ó:ˆØ—‘˜h¨Ó+×1Ñ1Ó3ˆÜ—‘Ð8¸"¸eÓDˆÜˆu‹:˜Š>Øàˆ	Ü�Y‰YÐ:¸DÀÇÁÃÈÏÉËÐSVÉÐ<WÓXˆÙØŸ™ ›ˆIØ�‰œW¤T¨4Ó0¸5È)ÑTÖUðVô ‹5€DØ€DØò ˆØˆe‰9˜ÑØØ�‰��E‘ÔØ�‰�B�ð	ð
 €Kr   c                 óà  — t        j                  || t         j                  «      }|sy| j                  d|j	                  «       «      }|dk(  ry|dz   }d}t        j
                  d| |d t         j                  «      D ]j  }|j                  d«      j                  d«      s |j                  d«      j                  d	«      r|dz  }ŒI|dz  }|dk(  sŒT| |||j	                  «       z    c S  | |d S )
u&   å¹³è¡¡ div åŒ¹é…� (å¤§å°�å†™ä¸�æ•�æ„Ÿ)r$   ú>éÿÿÿÿr"   z<div[\s>]|</div>Nr   z<divz<DIV)r:   rA   ÚIÚfindÚstartr;   r=   Ú
startswith)r/   Úopen_tag_rerI   ÚgtÚiÚdepthÚmms          r   Úextract_balanced_divr^   V   sÛ   € ä
�	‰	�+˜t¤R§T¡TÓ*€AÙØØ	�‰�3˜Ÿ™›	Ó	"€BØ	ˆR‚xØØ
ˆQ‰€AØ€EÜ�k‰kÐ-¨t°A°B¨x¼¿¹Ó>ò .ˆØ�8‰8�A‹;×!Ñ! &Ô)¨R¯X©X°a«[×-CÑ-CÀFÔ-KØ�Q‰J‰Eà�Q‰JˆEØ˜‹zØ˜A˜a "§(¡(£*™nÐ-Ò-ð.ð ��ˆ8€Or   c                 ó|  — t        | «      }|syd}t        j                  d|«      }|r|j                  d«      j	                  «       }|s‚t        j                  d|t        j
                  «      }|r[t        j                  dd|j                  d«      «      j	                  «       }t        j                  d|«      d   j	                  «       }|j                  d	d«      j	                  «       }t        j                  d
d|«      }d}t        j                  d|«      }|r8t        j                  d|j                  d«      «      }|r|j                  d«      }|s)t        j                  d|«      }|r|j                  d«      }d}t        |d«      }|j	                  «       r|j	                  «       }|j	                  «       s,t        |d«      }|j	                  «       r|j	                  «       }t        j                  dd|«      }t        j                  dd|t        j
                  t        j                  z  ¬«      }|||fS )N)r$   r$   r$   r$   z3<meta[^>]*name="ArticleTitle"[^>]*content="([^"]*)"r"   z<title>\s*([^<]+?)\s*</title>z\s+u   _å…¬å‘Šå…¬ç¤º|_r   r4   r5   z.<meta[^>]*name="PubDate"[^>]*content="([^"]*)"z(\d{4}-\d{2}-\d{2})z!(\d{4}-\d{2}-\d{2})\s+\d{2}:\d{2}z<div[^>]*id="zoomcon"[^>]*>z%<div[^>]*class="[^"]*zoom[^"]*"[^>]*>z<UCAPCONTENT>|</UCAPCONTENT>z<script.*?</script>)Úflags)r0   r:   rA   r=   r?   r<   r>   Úsplitr@   r^   rU   )r   r/   r8   rI   rL   ÚmdÚcontentÚcs           r   Úfetch_detailre   j   sÃ  € Ü�‹:€DÙØà€EÜ
�	‰	ÐHÈ$ÓO€AÙØ—‘˜“
× Ñ Ó"ˆÙÜ�I‰IÐ6¸¼b¿i¹iÓHˆÙÜ—F‘F˜6 2 q§w¡w¨q£zÓ2×8Ñ8Ó:ˆEÜ—H‘HÐ/°Ó7¸Ñ:×@Ñ@ÓBˆEØ�M‰M˜( BÓ'×-Ñ-Ó/€EÜ�F‰FÐ4°b¸%Ó@€Eà€IÜ
�	‰	ÐCÀTÓJ€AÙÜ�Y‰YÐ-¨q¯w©w°q«zÓ:ˆÙØŸ™ ›ˆIÙÜ�I‰IÐ:¸DÓAˆÙØŸ™ ›
ˆIà€GÜ˜TÐ#AÓB€AØ‡w�w„yØ—'‘'“)ˆØ�=‰=Œ?ä  Ð'OÓPˆØ�7‰7Œ9Ø—g‘g“iˆGÜ�f‰fÐ4°b¸'ÓB€GÜ�f‰fÐ+¨R°ÄÇ	Á	ÌBÏDÉDÑ@PÔQ€GØ�)˜WÐ$Ð$r   c                  ó>  — t        j                  «       } | j                  dt        d¬«       | j	                  «       }g }t        «       }t        d|j                  dz   «      D ]Ù  }|dk(  rt        nt        j                  dd|› d�«      }t        |t        ¬«      }|st        d	|› d
�«        n�t        ||«      }t        |«      }|D ]/  }	|	d   |v rŒ|j                  |	d   «       |j                  |	«       Œ1 t        d	|› dt        |«      |z
  › dt        |«      › d�«       |s nt!        j"                  d«       ŒÛ g }
t%        |«      D �]w  \  }}	t'        |	d   «      \  }}}|s|	d   }|st        d|	d   › �«       Œ4|xs |	j)                  dd«      }|r
|t*        k  rŒVg }t-        j.                  d|t,        j0                  «      D ]—  }|j3                  d«      t-        j4                  dd|j3                  d«      «      j7                  «       }}t-        j8                  d|t,        j:                  «      sd|j=                  «       v sŒ€|j                  |xs d|dœ«       Œ™ |
j                  ||	d   |	d   |t>        |d|rtA        jB                  |d¬«      ndtD        dœ	«       |dz  d k(  s�Œct!        j"                  d«       �Œz t        d!t        |
«      › d"�«       |
D �cg c]  }|d#   j7                  «       sŒ|‘Œ }}|rtG        |d$«       t        |«      S c c}w )%Nz--pagesé   )ÚtypeÚdefaultr"   z
list.shtmlÚlist_z.shtml)r   z  page z: fetch fail (stop)r   z: +z items (total ú)g      ø?r8   z    SKIP empty content: r9   r$   z$<a[^>]*href="([^"]+)"[^>]*>(.*?)</a>r3   r2   z*\.(pdf|doc|docx|xls|xlsx|zip|rar|caj|wps)$Údownloadu   é™„ä»¶)r8   r   F)Úensure_asciiz[])	r8   r   Ú
source_urlÚpub_dateÚ	site_namerc   ÚsummaryÚattachmentsÚ
group_nameé   r6   z	  Total: z itemsrc   Ú	ncjk_gggs)$ÚargparseÚArgumentParserÚadd_argumentr   Ú
parse_argsrE   r&   Úpagesr%   r@   r0   r)   rQ   r'   rF   rC   r   r,   Ú	enumeratere   ÚgetÚCUTOFFr:   r;   r<   r=   r>   r?   rA   rU   ÚlowerÚ	SITE_NAMEÚjsonÚdumpsÚ
GROUP_NAMEr   )ÚapÚargsrH   rN   rG   r   r/   Ú
page_itemsÚbeforerP   ÚrecordsÚidxr8   rL   rc   ÚpdÚattsÚamÚhÚtr   Úvalids                         r   Úmainr�   ”   sï  € Ü	×	 Ñ	 Ó	"€BØ‡O�O�I¤C°€OÔ4Ø�=‰=‹?€Dà€EÜ‹5€DÜ˜˜DŸJ™J¨™NÓ+ò ˆØ! Qš,�h¬H×,<Ñ,<¸\ÈUÐSZÐR[Ð[aÐKbÓ,cˆÜ�S¤(Ô+ˆÙÜ�G˜G˜9Ð$7Ð8Ô9ÙÜ" 4¨Ó1ˆ
Ü�U“ˆØò 	ˆBØ�%‰y˜DÑ ØØ�H‰H�R˜‘YÔØ�L‰L˜Õð		ô
 	�˜�y ¤C¨£J°Ñ$7Ð#8¸ÄsÈ5ÃzÀlÐRSÐTÔUÙÙÜ�
‰
�3�ð!ð$ €GÜ˜UÓ#ó ‰ˆˆRÜ$0°°E±Ó$;Ñ!ˆˆy˜'ÙØ�w‘KˆEÙÜÐ,¨R°©Y¨KÐ8Ô9ØØÒ,˜"Ÿ&™& ¨Ó,ˆÙ�"”v’+ØàˆÜ—+‘+ÐEÀwÔPR×PYÑPYÓZò 	@ˆBØ—8‘8˜A“;¤§¡ z°2°r·x±xÀ³{Ó C× IÑ IÓ KˆqˆAÜ�y‰yÐFÈÌ2Ï4É4ÔPÐT^Ðbc×biÑbiÓbkÒTkØ—‘ a¢m¨8¸AÑ>Õ?ð	@ð 	�‰Ø 2 e¡9¸B¸u¹IØ¬¸wØÑRV¬$¯*©*°TÈÕ*NÐ\`Ü$ñ	
ô 	ð �‰7�aŒ<Ü�J‰J�sŽOð/ô0 
ˆI”c˜'“l�^ 6Ð
*Ô+ØÖ8�1 1 Y¡<×#5Ñ#5Õ#7ŠQÐ8€EÐ8ÙÜ˜ Ô,Üˆu‹:Ðùò 9s   Ë"LË;LÚ__main__)N)#Ú__doc__r*   r   r   r:   rv   r€   r   r   r   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   ÚnowÚstrftimer}   r   r‚   rD   r%   r   r(   r   r0   rQ   r^   re   r�   Ú__name__© r   r   ú<module>r�      sÇ   ðñ	÷ 5× 4× 4Ó 4ß (Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à
ˆ(�,‰,‹.™9¨'Ô2Ñ
2×	<Ñ	<¸ZÓ	H€Ø*€	Ø€
Ø€ØÐ*Ñ*€Øv€Ø€óó"òò6ò('%òT6ðr ˆzÒÙ…Fð r   