Ë
    ¸¬uj£  ã                   ón  — 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mZmZ ddlmZmZ ej$                  j'                  dd«      ZdZdZd	Ze› d
�ZdZddiZdZdZdZ ej<                  «        ed¬«      z
  j?                  «       Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&e'dk(  r e&«        yy)u—  
éŸ¶å…³å¸‚å�—é›„å¸‚æ°´åŠ¡å±€æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�° - çˆ¬è™«
CMS: Laravel + Vue SPA (çœ�çº§æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�°)
åˆ—è¡¨: /sgnxshuiwj/gkmlpt/api/all/{catId}?page=N&sid={siteId} (JSON, 100æ�¡/é¡µ)
è¯¦æƒ…: requests + <div class="article-content">
WAF: æ— 

è¿�è¡Œ: python3 crawl_nanxiong.py [--full]
  --full: å…¨é‡�çˆ¬å�– (æ‰€æœ‰3é¡µï¼Œå�«æ—¥æœŸè¿‡æ»¤)
  ä¸�åŠ : ä»…çˆ¬ç¬¬1é¡µ (å¢žé‡�æ¨¡å¼�ï¼Œæ—¥è·‘ç”¨)
é    N)ÚdatetimeÚ	timedelta)ÚThreadPoolExecutorÚas_completedÚ	SEARCH_DBz/root/search.dbu.   éŸ¶å…³å¸‚å�—é›„å¸‚æ°´åŠ¡å±€-æ”¿åºœä¿¡æ�¯å…¬å¼€u   éŸ¶å…³å¸‚å�—é›„å¸‚æ°´åŠ¡å±€zhttps://www.gdnx.gov.cnz/sgnxshuiwj/gkmlpt/api/all/1653Ú751222z
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      à?iG  )Údaysc                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú#/root/gov_crawler/crawl_nanxiong.pyÚlogr   $   s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 óˆ  — t         › d| › dt        › �}t        j                  j	                  |t
        ¬«      }	 t        j                  j                  |d¬«      }t        j                  |j                  «       j                  «       «      }|j                  dg «      S # t        $ r}t        d| › d|› �«       Y d }~y d }~ww xY w)	Nz?page=z&sid=©Úheadersé   ©ÚtimeoutÚarticlesu
   åˆ—è¡¨é¡µ u    è¯·æ±‚å¤±è´¥: )ÚAPI_URLÚSITE_IDÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚjsonÚloadsÚreadÚdecodeÚgetÚ	Exceptionr   )Úpage_noÚurlÚreqÚrespÚdataÚes         r   Ú
fetch_listr/   (   s¥   € ÜˆI�V˜G˜9 E¬'¨Ð
3€CÜ
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2Ð%Ó6ˆÜ�z‰z˜$Ÿ)™)›+×,Ñ,Ó.Ó/ˆØ�x‰x˜
 BÓ'Ð'øÜò Üˆj˜˜	 °°Ð4Ô5Üûðús   ¹A#B Â	CÂ&B<Â<Cc           
      ób  — g }| D �]  }|j                  d«      xs |j                  d«      xs d}t        |t        «      rt        |«      }|dkD  r|}n|}|r|r
|t        k  rŒ_d}|r%	 t        j                  |«      j                  d«      }|j                  d	d«      }|j                  d
«      r|nt        |z   }t        j                  |j                  dd«      j                  «       «      }|j                  ||||j                  dt        «      f«       �Œ |S #  t        |«      dd }Y Œ¡xY w)u'   è§£æž�APIè¿”å›žçš„articlesï¼Œè¿‡æ»¤3å¹´ÚdateÚfirst_publish_timer   g   ¢”mBÚ z%Y-%m-%dNé
   r*   ÚhttpÚtitleÚ	publisher)r'   Ú
isinstanceÚstrÚintÚTHREE_YEARS_AGOr   ÚfromtimestampÚstrftimeÚ
startswithÚBASE_URLÚhtmlmodÚunescapeÚstripÚappendÚSOURCE)	r   Úis_fullÚitemsÚartÚpub_dateÚdate_strÚurl_pathÚfull_urlr6   s	            r   Úparse_articlesrL   4   s%  € à€EØó PˆØ—7‘7˜6“?ÒH c§g¡gÐ.BÓ&CÒHÀqˆÜ�h¤Ô$Ü˜8“}ˆHØ�dŠ?Ø‰HàˆHñ ‘x H¬Ò$>Øð ˆÙð.Ü#×1Ñ1°(Ó;×DÑDÀZÓP�ð —7‘7˜5 "Ó%ˆØ'×2Ñ2°6Ô:‘8ÄÈ8Ñ@SˆÜ× Ñ  §¡¨°"Ó!5×!;Ñ!;Ó!=Ó>ˆà�‰�h  x°·±¸ÄfÓ1MÐNÖOð3Pð4 €Løð.Ü˜x›=¨¨"Ð-’ús   Á)$DÄD.c                 ój  — 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|«      }	|	r[t        j                  |	j                  d«      j                  «       «      }t        j                  d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)Nr   r   r   z9<div class="article-content[^"]*"[^>]*>(.*?)</div>\s*<divé   z2<div class="article-content[^"]*"[^>]*>(.*?)</div>z<title>(.*?)</title>u#   _å…¨æ¤’åŽ¿äººæ°‘æ”¿åºœ|_å�—é›„å¸‚.*r3   z\s+ú )r   r   r    r!   r"   r%   r&   r(   ÚreÚsearchÚDOTALLÚgrouprB   r@   rA   Úsub)r*   r6   r1   Úsourcer+   r,   Ú	html_textr.   ÚcontentÚmÚfinal_titleÚts               r   Úfetch_detailr[   T   so  € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€Cð0Ü�~‰~×%Ñ% c°2Ð%Ó6ˆØ—I‘I“K×&Ñ&Ó(ˆ	ð
 €GÜ
�	‰	ÐNÐPYÔ[]×[dÑ[dÓe€AÙØ—'‘'˜!“*×"Ñ"Ó$‰ô �I‰IÐKÈYÔXZ×XaÑXaÓbˆÙØ—g‘g˜a“j×&Ñ&Ó(ˆGð €KÜ
�	‰	Ð)¨9Ó5€AÙÜ×Ñ˜QŸW™W Q›Z×-Ñ-Ó/Ó0ˆä�F‰FÐ9¸2¸qÓA×GÑGÓIˆÙØˆKáÜ—&‘&˜  gÓ.×4Ñ4Ó6ˆà�˜d G¨VÐ4Ð4øô7 ò 0Ø�U˜D $¨Ð/Õ/ûð0ús   §?F Æ	F2Æ!F-Æ'F2Æ-F2c                 óˆ  — t        j                  t        «      }|j                  «       }d}d}| D ]C  \  }}}}}		 |j	                  dt
        ||||	|xs df«       |j                  dkD  r|dz  }n|dz  }ŒE |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 (?, ?, ?, ?, ?, ?)r3   rN   u   å…¥åº“å¤±è´¥: é2   z... )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuter   Úrowcountr(   r   ÚcommitÚclose)r   Úconnra   ÚinsertedÚskippedr*   r6   r1   rW   rU   r.   s              r   Ú
save_to_dbri   w   sÛ   € Ü�?‰?œ7Ó#€DØ�[‰[‹]€FØ€HØ€Gà-5ò 4Ñ)ˆˆU�D˜' 6ð	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                  ó†  — 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�«       ŒI|st        d|› d	�«        nFt        || «      }t        d|› d
t        |«      › 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 ]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 Œƒw xY w# 1 sw Y   ŒfxY w)Nz--fullu   å¼€å§‹u   å…¨é‡�u   å¢žé‡�u	   çˆ¬å�–...rN   u   ç¬¬ u
    é¡µè·³è¿‡u    é¡µä¸ºç©ºï¼Œç»“æ�Ÿu    é¡µ: u    æ�¡, 3å¹´è¿‡æ»¤å�Ž u    æ�¡u
   å…±èŽ·å�– u    æ�¡åˆ—è¡¨æ•°æ�®u   æ²¡æœ‰æ•°æ�®ï¼Œé€€å‡ºu   å¼€å§‹å¤šçº¿ç¨‹çˆ¬å�–è¯¦æƒ… (u
   çº¿ç¨‹)...)Úmax_workersr   é   u   è¯¦æƒ…è¿›åº¦: ú/u   å…¥åº“å®Œæˆ�: æ–°å¢ž u	   , è·³è¿‡ )ÚsysÚargvr   ÚrangeÚ	MAX_PAGESÚtimeÚsleepÚrandomÚuniformÚREQUEST_DELAYr/   rL   ÚlenÚextendÚNUM_THREADSr   Ú	enumerateÚsubmitr[   r   rC   Úresultr(   ri   )rE   Ú	all_itemsÚpages_to_crawlr)   r   rF   ÚresultsÚexecutorÚir*   rZ   ÚdÚsÚfuturesÚdoneÚtotalÚfÚidxrg   rh   s                       r   Úmainr‰   ‘   s\  € Øœ#Ÿ(™(Ð"€GÜˆ&™W‘¨(Ð3°9Ð=Ô>à€IÙ07”U˜1œi¨!™mÔ,¸a¸S€Nà!ò  ˆÜ�
‰
”6—>‘>¤=Ð1Ô2Ü˜gÓ&ˆØÐÜ�$�w�i˜zÐ*Ô+ØÙÜ�$�w�iÐ2Ð3Ô4ÙÜ˜x¨Ó1ˆÜˆd�7�)˜6¤# h£- Ð0DÄSÈÃZÀLÐPTÐUÔVØ×Ñ˜Õð ô ˆ*”S˜“^Ð$Ð$4Ð5Ô6áÜÐ#Ô$Øô Ð
'¬ }°JÐ?Ô@Ø€GÜ	¬Ô	4ð 5¸Ü[dÐenÓ[o×pÒpÑFWÀaÉÈ#ÈqÐRSÐUV�8—?‘?¤<°°a¸¸AÓ>ÀÑAÐpˆÔpØˆÜ�G“ˆÜ˜gÓ&ò 		5ˆAØ�A‰IˆDð5Ø—‘˜qŸx™x›zÔ*ð
 �b‰y˜AŠ~ ¨£Ü�n T F¨!¨E¨7Ð3Õ4ñ		5÷	5ô  # 7Ó+Ñ€HˆgÜÐ
 ˜z¨°7°)Ð<Õ=ùö! qøô ò 5Ø˜a‘j�Ø(¨™~‘��Q˜˜1Ø—‘  Q¨¨4°Ð3Ö4ð5ú÷5ð 5úsH   Ä/H7Å)G:Å*&H7ÆHÆ0H7Æ>H7Ç:	H7È.H4È1H7È3H4È4H7È7I Ú__main__)(Ú__doc__rn   rP   rr   rt   r^   ÚosÚurllib.requestr   Úurllib.errorr#   Úhtmlr@   r   r   Úconcurrent.futuresr   r   Úenvironr'   r`   r   rD   r?   r   r   r!   rq   ry   rv   ÚnowÚ	timestampr;   r   r/   rL   r[   ri   r‰   Ú__name__© r   r   ú<module>r–      sÑ   ðñ
÷ N× M× M× MÓ MÛ ß (ß ?à
�*‰*�.‰.˜Ð&7Ó
8€Ø<€	Ø	&€à$€ØˆJÐ5Ð
6€Ø
€àð  Dð€ð €	Ø€Ø€Ø�8—<‘<“>¡I°5Ô$9Ñ9×DÑDÓF€ò.ò	òò@ 5òFò4.>ðb ˆzÒÙ…Fð r   