Ë
    ¸¬uju  ã                   ó(  — 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)uF  
èˆŸå±±å¸‚æ™®é™€åŒºäººæ°‘æ”¿åºœ - å»ºè®¾é¡¹ç›®çŽ¯è¯„ä¼�ä¸šä¿¡æ�¯å…¬ç¤º çˆ¬è™«
CMS: JCMS (same as Hangzhou)
åˆ—è¡¨: API GET + paramJson åˆ†é¡µ
è¯¦æƒ…: requests + <div class="article-content">
WAF: é˜¿é‡Œäº‘ (æµ�è§ˆå™¨UA)

è¿�è¡Œ: python3 crawl_putuo.py [--full]
  --full: å…¨é‡� (2é¡µ39æ�¡)
  ä¸�åŠ : ä»…ç¬¬1é¡µ (æ—¥è·‘å¢žé‡�)
é    N)ÚThreadPoolExecutorÚas_completedÚ	SEARCH_DBz/root/search.dbuC   èˆŸå±±å¸‚æ™®é™€åŒºäººæ°‘æ”¿åºœ-å»ºè®¾é¡¹ç›®çŽ¯è¯„ä¼�ä¸šä¿¡æ�¯å…¬ç¤ºu   èˆŸå±±å¸‚æ™®é™€åŒºäººæ°‘æ”¿åºœzhttps://www.putuo.gov.cnz7/api-gateway/jpaas-publish-server/front/page/build/unitÚbulidstaticÚ2762Ú3wW2GfVyimCCPxV51GOi1Úcolumnu   æ–°é—»åˆ—è¡¨ÚnullÚ
1229863925)Ú	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_putuo.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>4   s3   è ø€ Ò"bÉ4È1Èa a S¨¬&¯,©,×*<Ñ*<¼SÀ»VÓ*DÐ)EÔ#FÑ"bùs   ‚:<©Úheadersé   ©ÚtimeoutÚsuccessÚdataÚhtmlu
   åˆ—è¡¨é¡µ u    è¯·æ±‚å¤±è´¥: )Ú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‰-˜#Ÿ(™(Ñ"bÐSY×S_ÑS_ÓSaÔ"bÓbÑ
b€CÜ
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2Ð%Ó6ˆÜ�z‰z˜$Ÿ)™)›+×,Ñ,Ó.Ó/ˆØ�x‰x˜	Ô"ØˆIØ�F‰|˜FÑ#Ð#øÜò Üˆj˜˜	 °°Ð4Ô5Üûðú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                  «       «      }t        j                  d|«      }|sŒx|j                  d«      }|j                  d«      r|nt        |z   }	|j                  |	||f«       Œº |S )Nz<li>(.*?)</li>z%<a href="([^"]+)"[^>]*title="([^"]*)"é   r   z <span>(\d{4}-\d{2}-\d{2})</span>Úhttp)ÚreÚcompileÚDOTALLÚfindallr#   ÚgroupÚhtmlmodÚunescapeÚstripÚ
startswithÚBASE_URLÚappend)
Ú	html_textrA   ÚpatternÚliÚa_mÚurl_pathÚtitleÚdate_mÚdateÚfull_urls
             r   Ú
parse_listri   A   sÐ   € Ø€Eä�j‰jÐ*¬B¯I©IÓ6€GØ�o‰o˜iÓ(ò .ˆÜ�i‰iÐ@À"ÓEˆÙØØ—9‘9˜Q“<ˆÜ× Ñ  §¡¨1£×!3Ñ!3Ó!5Ó6ˆä—‘Ð>ÀÓCˆÙØØ�|‰|˜A‹ˆà'×2Ñ2°6Ô:‘8ÄÈ8Ñ@SˆØ�‰�h  tÐ,Õ-ð.ð €Lr   c           	      óF  — t         j                  j                  | t        ¬«      }	 t         j                  j	                  |d¬«      }|j                  «       j                  «       }d }t        j                  d|t        j                  «      }|r |j                  d«      j                  «       }nFt        j                  d|t        j                  «      }|r|j                  d«      j                  «       }|}	t        j                  d|«      }|rKt        j                  t        j                  dd	|j                  d«      «      j                  «       «      }
|
r|
}	|r%t        j                  d
d|«      j                  «       }| |	||fS # t        $ r}| ||d fcY d }~S d }~ww xY w)Nr2   r4   r5   z/<div class="article-content">(.*?)</div>\s*<divrS   z(<div class="article-content">(.*?)</div>z#<div class="title"[^>]*>(.*?)</div>z<[^>]+>r    z\s+ú )r*   rB   rC   rD   rE   rG   rH   rJ   rU   r#   rW   rY   r\   rZ   r[   Úsub)rM   re   rg   rN   rO   r9   rP   ÚcontentÚmÚfinal_titleÚts              r   Úfetch_detailrq   V   sS  € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€Cð(Ü�~‰~×%Ñ% c°2Ð%Ó6ˆØ�y‰y‹{×!Ñ!Ó#ˆð
 €GÜ
�	‰	ÐDÀdÌBÏIÉIÓV€AÙØ—'‘'˜!“*×"Ñ"Ó$‰ä�I‰IÐAÀ4ÌÏÉÓSˆÙØ—g‘g˜a“j×&Ñ&Ó(ˆGð €KÜ
�	‰	Ð8¸$Ó?€AÙÜ×ÑœRŸV™V J°°A·G±G¸A³JÓ?×EÑEÓGÓHˆÙØˆKáÜ—&‘&˜  gÓ.×4Ñ4Ó6ˆà�˜d GÐ,Ð,øô1 ò (Ø�U˜D $Ð'Õ'ûð(ús   §?F Æ	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Úconnrw   ÚinsertedÚskippedrM   re   rg   rm   rP   s
             r   Ú
save_to_dbr�   v   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                  óN  — 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 }t!        |«      D ��	�
�ci c]"  \  }\  }	}
}|j#                  t$        |	|
|«      |“Œ$ }}
}	}}d}t        |«      }t'        |«      D ]>  }|dz  }	 |j)                  |j+                  «       «       ||k(  sŒ.t        d|› d|› �«       Œ@ 	 d d d «       t/        |«      \  }}t        d|› d|› �«       y c c}}
}	}w # t,        $ r& ||   }||   \  }	}
}|j)                  |	|
|d f«       Y Œxw xY w# 1 sw Y   ŒcxY w)Nz--fullu   å¼€å§‹u   å…¨é‡�u   å¢žé‡�u	   çˆ¬å�–...rS   u   ç¬¬ u
    é¡µè·³è¿‡u    é¡µä¸ºç©ºï¼Œç»“æ�Ÿu    é¡µ: u    æ�¡u
   å…±èŽ·å�– u    æ�¡åˆ—è¡¨æ•°æ�®u   æ²¡æœ‰æ•°æ�®ï¼Œé€€å‡ºu   å¼€å§‹å¤šçº¿ç¨‹çˆ¬å�–è¯¦æƒ… (u
   çº¿ç¨‹)...)Úmax_workersr   u   è¯¦æƒ…è¿›åº¦: ú/u   å…¥åº“å®Œæˆ�: æ–°å¢ž u	   , è·³è¿‡ )ÚsysÚargvr   ÚrangeÚ	MAX_PAGESÚtimeÚsleepÚrandomÚuniformÚREQUEST_DELAYrQ   ri   ÚlenÚextendÚNUM_THREADSr   Ú	enumerateÚsubmitrq   r   r_   ÚresultrJ   r�   )Úis_fullÚ	all_itemsÚpages_to_crawlrK   r`   rA   ÚresultsÚexecutorÚirM   rp   ÚdÚfuturesÚdoneÚtotalÚfÚidxr   r€   s                      r   Úmainr    �   s7  € Øœ#Ÿ(™(Ð"€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¸ÜU^Ð_hÓUi×jÑjÁ>À1ÁkÀsÈAÈq�8—?‘?¤<°°a¸Ó;¸QÑ>ÐjˆÓjØˆÜ�G“ˆÜ˜gÓ&ò 		5ˆAØ�A‰IˆDð2Ø—‘˜qŸx™x›zÔ*ð
 �u‹}Ü�n T F¨!¨E¨7Ð3Õ4ñ		5÷	5ô # 7Ó+Ñ€HˆgÜÐ
 ˜z¨°7°)Ð<Õ=ùõ køô ò 2Ø˜a‘j�Ø% c™N‘	��Q˜Ø—‘  Q¨¨4Ð0Ö1ð2ú÷5ð 5úsH   Ä"HÄ3'G!Å%HÆ G)ÆHÆ%HÇ!HÇ),HÈHÈHÈHÈH$Ú__main__)%Ú__doc__r…   rU   r‰   r‹   rt   ÚosÚurllib.requestr*   Úurllib.parseÚurllib.errorr<   r9   rZ   Úconcurrent.futuresr   r   ÚenvironrI   rv   r   ry   r^   r?   r;   rD   r>   rˆ   r�   r�   r   rQ   ri   rq   r�   r    Ú__name__© r   r   ú<module>r«      sÍ   ðñ
÷ \× [× [× [× [Û ß ?à
�*‰*�.‰.˜Ð&7Ó
8€ØQ€	Ø	)€à%€ØˆJÐMÐ
N€ð ØØ'ØØØØñ€
ð ð  Dð€ð €	Ø€	Ø€Ø€ò.òò ò*-ò@ò4,>ð^ ˆzÒÙ…Fð r   