Ë
    ¸¬uj=  ã                   ó(  — 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Z	ddl
Z	ddlZ	ddlZddlmZmZ ej"                  j%                  dd«      ZdZdZdZe› d	�Zd
dddddddœZddiZdZdZdZdZd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#e$dk(  r e#«        yy)uw  
æ�­å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - 2026å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·å…¬ç¤º çˆ¬è™«
CMS: JCMS (Java CMS)
åˆ—è¡¨: API GET + paramJson åˆ†é¡µ
è¯¦æƒ…: requests + <meta ArticleTitle> + <div class="pageFile-Content">
WAF: é˜¿é‡Œäº‘ (éœ€æµ�è§ˆå™¨ UA)

è¿�è¡Œ: python3 crawl_hangzhou.py [--full]
  --full: å…¨é‡�çˆ¬å�– (æ‰€æœ‰46é¡µ)
  ä¸�åŠ å�‚æ•°: ä»…çˆ¬ç¬¬1é¡µ (å¢žé‡�æ¨¡å¼�ï¼Œæ—¥è·‘ç”¨)
é    N)ÚThreadPoolExecutorÚas_completedÚ	SEARCH_DBz/root/search.dbuA   æ�­å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-2026å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·å…¬ç¤ºu   æ�­å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€zhttps://epb.hangzhou.gov.cnz7/api-gateway/jpaas-publish-server/front/page/build/unitÚbulidstaticÚ3249ÚpWtD8p2JcI0v1rw5TsyBqÚcolumnu   å½“å‰�æ �ç›®listÚnullÚS5UyzHsYHfVcPzifFrjDT)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚeditTypeÚpageIdz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36é   é.   )g333333Ó?g      à?é   c                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú#/root/gov_crawler/crawl_hangzhou.pyÚlogr   -   s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 ó8  — t        t        «      }t        j                  | t        ddœd¬«      |d<   t
        dz   dj                  d„ |j                  «       D «       «      z   }t        j                  j                  |t        ¬	«      }	 t        j                  j                  |d
¬«      }t        j                  |j                  «       j                  «       «      }|j!                  d«      sg S |d   d   S # t"        $ r}t%        d| › d|› �«       Y d }~y d }~ww xY w)NÚ )ÚpageNoÚpageSizeÚsearchF)Úensure_asciiÚ	paramJsonú?ú&c              3   ó|   K  — | ]4  \  }}|› d t         j                  j                  t        |«      «      › �–— Œ6 y­w)ú=N)ÚurllibÚparseÚquoteÚstr)Ú.0ÚkÚvs      r   ú	<genexpr>zfetch_list.<locals>.<genexpr>5   s8   è ø€ ò #Ù04°°1ˆ1ˆ#ˆQŒv�|‰|×!Ñ!¤# a£&Ó)Ð*Ô+ñ#ùs   ‚:<©Úheadersé
   ©ÚtimeoutÚsuccessÚdataÚhtmlu   åˆ—è¡¨APIè¯·æ±‚å¤±è´¥ (page z): )ÚdictÚ
API_PARAMSÚjsonÚdumpsÚ	PAGE_SIZEÚAPI_URLÚjoinÚitemsr*   ÚrequestÚRequestÚHEADERSÚurlopenÚloadsÚreadÚdecodeÚgetÚ	Exceptionr   )Úpage_noÚparamsÚurlÚreqÚrespr8   Úes          r   Ú
fetch_listrQ   1   sõ   € Ü”*Ó€FÜŸ*™*°ÄYÐZ\Ñ%]ÐlqÔr€Fˆ;Ñä
�C‰-˜#Ÿ(™(ñ #Ø8>¿¹»ô#ó ñ €Cô �.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2Ð%Ó6ˆÜ�z‰z˜$Ÿ)™)›+×,Ñ,Ó.Ó/ˆØ�x‰x˜	Ô"ØˆIØ�F‰|˜FÑ#Ð#øÜò ÜÐ*¨7¨)°3°q°cÐ:Ô;Üûðús   ÂA$C5 Ã-C5 Ã5	DÃ>DÄDc                 óö  — g }t        j                  dt         j                  «      }|j                  | «      D ]¾  }t        j                  d|«      }|sŒ|j                  d«      }t        j                  |j                  d«      j                  «       «      }d|vrŒdt        j                  d|«      }|r|j                  d«      nd}|j                  d«      r|nt        |z   }	|j                  |	||f«       ŒÀ |S )	Nz<li>(.*?)</li>z%<a href="([^"]+)"[^>]*title="([^"]*)"é   é   z/art/z>(\d{4}-\d{2}-\d{2})<r    Úhttp)ÚreÚcompileÚDOTALLÚfindallr#   ÚgroupÚhtmlmodÚunescapeÚstripÚ
startswithÚBASE_URLÚappend)
Ú	html_textrA   ÚpatternÚliÚa_matchÚurl_pathÚtitleÚ
date_matchÚdateÚfull_urls
             r   Ú
parse_listrj   E   sÞ   € Ø€EÜ�j‰jÐ*¬B¯I©IÓ6€GØ�o‰o˜iÓ(ò .ˆÜ—)‘)ÐDÀbÓIˆÙØØ—=‘= Ó#ˆÜ× Ñ  §¡¨qÓ!1×!7Ñ!7Ó!9Ó:ˆØ˜(Ñ"ØÜ—Y‘YÐ7¸Ó<ˆ
Ù&0ˆz×Ñ Ô"°bˆØ'×2Ñ2°6Ô:‘8ÄÈ8Ñ@SˆØ�‰�h  tÐ,Õ-ð.ð €Lr   c                 ó.  — t         j                  j                  | t        ¬«      }	 t         j                  j	                  |d¬«      }|j                  «       j                  «       }|}t        j                  d|«      }|r2t        j                  |j                  d«      j                  «       «      }d}	t        j                  d|t        j                  «      }|r |j                  d«      j                  «       }	nSdD ]N  }
t        j                  d	|
› d
�|t        j                  «      }|sŒ/|j                  d«      j                  «       }	 n |	r%t        j                  dd|	«      j                  «       }	| |||	fS # t        $ r}| ||dfcY d}~S d}~ww xY w)u$   çˆ¬å�–å�•ç¯‡è¯¦æƒ… (ç”¨äºŽçº¿ç¨‹æ± )r2   r4   r5   Nz1<meta[^>]*ArticleTitle["\s][^>]*content="([^"]*)"rS   z2<div class="pageFile-Content">(.*?)</div>\s*</div>)Ú
TRS_EditorÚneirongz<div[^>]*class="[^"]*z[^"]*"[^>]*>(.*?)</div>z\s+ú )r*   rB   rC   rD   rE   rG   rH   rJ   rV   r#   r[   r\   rZ   r]   rX   Úsub)rM   rf   rh   rN   rO   r9   rP   Úfinal_titleÚmÚcontentÚclss              r   Úfetch_detailrt   W   sb  € ä
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€Cð(Ü�~‰~×%Ñ% c°2Ð%Ó6ˆØ�y‰y‹{×!Ñ!Ó#ˆð
 €KÜ
�	‰	ÐFÈÓM€AÙÜ×&Ñ& q§w¡w¨q£z×'7Ñ'7Ó'9Ó:ˆð €GÜ
�	‰	ÐGÈÌrÏyÉyÓY€AÙØ—'‘'˜!“*×"Ñ"Ó$‰ð -ò 	ˆCÜ—	‘	Ð2°3°%Ð7NÐOÐQUÔWY×W`ÑW`ÓaˆAÚØŸ'™' !›*×*Ñ*Ó,�Ùð		ñ Ü—&‘&˜  gÓ.×4Ñ4Ó6ˆà�˜d GÐ,Ð,øô3 ò (Ø�U˜D $Ð'Õ'ûð(ús   §?E; Å;	FÆFÆ	FÆFc                 óŽ  — t        j                  t        «      }|j                  «       }d}d}| D ]F  \  }}}}	 |j	                  dt
        |||t        |xs df«       |j                  dkD  r|dz  }n|dz  }ŒH |j                  «        |j                  «        ||fS # t        $ r}	t        d|d d › d|	› �«       Y d }	~	Œ�d }	~	ww xY w)Nr   z�INSERT OR IGNORE INTO gov_raw
                   (site_name, title, page_url, publish_date, source_url, content)
                   VALUES (?, ?, ?, ?, ?, ?)r    rS   u   å…¥åº“å¤±è´¥: é2   z... )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuter   ÚSOURCEÚrowcountrJ   r   ÚcommitÚclose)
ÚarticlesÚconnrz   ÚinsertedÚskippedrM   rf   rh   rr   rP   s
             r   Ú
save_to_dbr„   y   sÙ   € Ü�?‰?œ7Ó#€DØ�[‰[‹]€FØ€HØ€Gà%-ò 4Ñ!ˆˆU�D˜'ð	4Ø�N‰Nð0ô ˜E 3¨¬f°g²mÀÐDô	ð �‰ Ò"Ø˜A‘‘à˜1‘�øð4ð 	‡K�K„MØ‡J�J„LØ�WÐÐøô ò 	4Ü�.  S b  
¨$¨q¨cÐ2×3Ñ3ûð	4ús   ¹>BÂ	CÂ&B?Â?Cc                  óJ  — dt         j                  v } t        d| rdnd› d�«       g }| rt        dt        dz   «      ndg}|D ]’  }t        j                  t        j                  t        Ž «       t        |«      }|€t        d|› d�«       ŒIt        |«      }|st        d|› d	�«        n.t        d|› d
t        |«      › d�«       |j                  |«       Œ” t        dt        |«      › d�«       |st        d«       y t        dt        › d�«       g }t        t        ¬«      5 }|D ��	�
ci c]"  \  }}	}
|j!                  t"        ||	|
«      ||	|
f“Œ$ }}	}}
d}t        |«      }t%        |«      D ]F  }|dz  }	 |j'                  |j)                  «       «       |dz  dk(  s||k(  sŒ6t        d|› d|› �«       ŒH 	 d d d «       t-        |«      \  }}t        d|› d|› �«       y c c}
}	}w # t*        $ r(}||   \  }}	}
|j'                  ||	|
d f«       Y d }~Œ}d }~ww xY w# 1 sw Y   ŒdxY w)Nz--fullu   å¼€å§‹u   å…¨é‡�u   å¢žé‡�u	   çˆ¬å�–...rS   u   ç¬¬ u
    é¡µè·³è¿‡u    é¡µä¸ºç©ºï¼Œç»“æ�Ÿu    é¡µ: u    æ�¡u
   å…±èŽ·å�– u    æ�¡åˆ—è¡¨æ•°æ�®u   æ²¡æœ‰æ•°æ�®ï¼Œé€€å‡ºu   å¼€å§‹å¤šçº¿ç¨‹çˆ¬å�–è¯¦æƒ… (u
   çº¿ç¨‹)...)Úmax_workersr   rv   u   è¯¦æƒ…è¿›åº¦: ú/u   å…¥åº“å®Œæˆ�: æ–°å¢ž u	   , è·³è¿‡ )ÚsysÚargvr   ÚrangeÚ	MAX_PAGESÚtimeÚsleepÚrandomÚuniformÚREQUEST_DELAYrQ   rj   ÚlenÚextendÚNUM_THREADSr   Úsubmitrt   r   r`   ÚresultrJ   r„   )Úis_fullÚ	all_itemsÚpages_to_crawlrK   ra   rA   ÚresultsÚexecutorrM   ÚtÚdÚfuturesÚdoneÚtotalÚfrP   r‚   rƒ   s                     r   Úmainr¡   “   s>  € Øœ#Ÿ(™(Ð"€GÜˆ&™W‘¨(Ð3°9Ð=Ô>ð €IÙ07”U˜1œi¨!™mÔ,¸a¸S€Nà!ò  ˆÜ�
‰
”6—>‘>¤=Ð1Ô2Ü˜wÓ'ˆ	ØÐÜ�$�w�i˜zÐ*Ô+ØÜ˜9Ó%ˆÙÜ�$�w�iÐ2Ð3Ô4ÙÜˆd�7�)˜6¤# e£* ¨TÐ2Ô3Ø×Ñ˜Õð ô ˆ*”S˜“^Ð$Ð$4Ð5Ô6áÜÐ#Ô$Øô Ð
'¬ }°JÐ?Ô@Ø€GÜ	¬Ô	4ð 5¸ØZc×dÐdÉYÈSÐRSÐUV�8—?‘?¤<°°a¸Ó;¸cÀ1Àa¸[ÑHÐdˆÒdØˆÜ�G“ˆÜ˜gÓ&ò 	5ˆAØ�A‰IˆDð2Ø—‘˜qŸx™x›zÔ*ð �b‰y˜AŠ~ ¨£Ü�n T F¨!¨E¨7Ð3Õ4ñ	5÷	5ô # 7Ó+Ñ€HˆgÜÐ
 ˜z¨°7°)Ð<Õ=ùô eøô ò 2Ø# A™J‘	��Q˜Ø—‘  Q¨¨4Ð0×1Ñ1ûð2ú÷5ð 5úsN   Ä"HÄ)'G
Å$HÅ5G%ÆHÆ"HÇHÇ%	HÇ.HÈHÈHÈHÈH"Ú__main__)%Ú__doc__r<   rV   rŒ   rŽ   rˆ   rw   ÚosÚurllib.requestr*   Úurllib.parseÚurllib.errorr9   r[   Úconcurrent.futuresr   r   ÚenvironrI   ry   r   r|   r_   r?   r;   rD   r>   r‹   r�   r“   r   rQ   rj   rt   r„   r¡   Ú__name__© r   r   ú<module>r¬      sÍ   ðñ
÷ \× [× [× [× [Û ß ?à
�*‰*�.‰.˜Ð&7Ó
8€ØO€	Ø	#€à(€ØˆJÐMÐ
N€ð ØØ'ØØØØ%ñ€
ð ð  Dð€ð €	Ø€	Ø€Ø€ò.òò(ò$-òDò4.>ðb ˆzÒÙ…Fð r   