Ë
    ¸¬ujŒ  ã                   óp  — 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mZ ddlZddlmZ ej"                  j%                  dd«      ZdZd	Zd
ZdZdddddddœZdddœZdZdZ ej8                  «        e	d¬«      z
  Zej=                  d«      Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$e%d k(  r e$«        yy)!u  
crawl_xiaoshan.py â€” æ�­å·žå¸‚è�§å±±åŒºäººæ°‘æ”¿åºœ-å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤º
CMS: JCMSï¼ˆå»ºæžœCMSï¼‰
åˆ—è¡¨: GET /api-gateway/jpaas-publish-server/front/page/build/unit
       å…³é”®å�‚æ•° paramJson={"pageNo":N,"pageSize":"20"}
è¯¦æƒ…: æ ‡å‡†HTMLï¼Œæ ‡é¢˜h2.article-titleHï¼Œæ­£æ–‡div#zoom.article-contentï¼Œæ—¥æœŸspan.article-time
WAF: OpenResty ç®€å�•é¢‘çŽ‡é™�åˆ¶ï¼ˆ~1000/hrï¼‰

è¿�è¡Œ: python3 crawl_xiaoshan.py [--full]
  --full: å…¨é‡�çˆ¬å�–ï¼ˆ24é¡µ~467æ�¡ï¼‰
  ä¸�åŠ : ä»…ç¬¬1é¡µï¼ˆæ—¥è·‘å¢žé‡�ï¼‰
é    N)ÚdatetimeÚ	timedelta)ÚThreadPoolExecutorÚas_completed)Ú	urlencodeÚ	SEARCH_DBz/root/search.dbuI   æ�­å·žå¸‚è�§å±±åŒºäººæ°‘æ”¿åºœ-å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤ºu   æ�­å·žå¸‚è�§å±±åŒºäººæ°‘æ”¿åºœzhttps://www.xiaoshan.gov.cnz7/api-gateway/jpaas-publish-server/front/page/build/unitÚ2243Ú
1229856904ÚbulidstaticÚcolumnu   å½“å‰�æ �ç›®åˆ—è¡¨1aÚGazmxWZitZXDWHJedYwxo)ÚwebIdÚpageIdÚ	parseTypeÚpageTypeÚtagIdÚtplSetIdz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36z8https://www.xiaoshan.gov.cn/col/col1229856904/index.html)z
User-AgentÚRefereré   é   iG  )Údaysz%Y-%m-%dc                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú#/root/gov_crawler/crawl_xiaoshan.pyÚlogr   /   s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 ó„  — t        j                  | ddœd¬«      }t        t        |¬«      }t        t
        z   dz   t        |«      z   }t        j                  j                  |t        ¬«      }	 t        j                  j                  |d¬	«      }t        j                  |j                  «       j                  «       «      }|j#                  d«      s"t!        d
| › d|j#                  d«      › �«       g S |j#                  di «      j#                  dd«      }|sg S t%        j&                  dt$        j(                  «      }	g }
|	j+                  |«      D ]®  }|j-                  d«      j/                  «       }|j-                  d«      j/                  «       }|j-                  d«      j/                  «       }|j1                  d«      r|}n'|j1                  d«      r
t        |z   }nt        dz   |z   }|
j3                  |||f«       Œ° |
st!        d
| › d|dd › �«       |
S # t        $ r}t!        d
| › d|› �«       g cY d}~S d}~ww xY w)uO   è°ƒç”¨JCMSåˆ—è¡¨APIï¼ˆå¸¦paramJsonåˆ†é¡µå�‚æ•°ï¼‰ï¼Œè¿”å›ž [(url, title, date)]Ú20)ÚpageNoÚpageSizeF)Úensure_ascii)Ú	paramJsonú?©Úheadersé   ©Útimeoutõ   ç¬¬u   é¡µAPIè¯·æ±‚å¤±è´¥: NÚsuccessu   é¡µAPIè¿”å›žå¤±è´¥: ÚmessageÚdataÚhtmlÚ zz<a\s+title="([^"]*)"[^>]*href="([^"]*)"[^>]*>.*?</a>.*?<b[^>]*class="zfxxgk_zdgkc_time"[^>]*>\s*(\d{4}-\d{2}-\d{2})\s*</b>é   é   é   Úhttpú/u#   é¡µ: æ­£åˆ™æœªåŒ¹é…�ï¼ŒHTMLå‰�300: i,  )ÚjsonÚdumpsÚdictÚBASE_PARAMSÚBASE_URLÚLIST_APIr   ÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚloadsÚreadÚdecodeÚ	Exceptionr   ÚgetÚreÚcompileÚDOTALLÚfinditerÚgroupÚstripÚ
startswithÚappend)Úpage_noÚ
param_jsonÚparamsÚurlÚreqÚrespr0   Úer1   ÚpatternÚarticlesÚmÚtitleÚhrefÚdateÚfull_urls                   r   Úfetch_list_pager^   3   s  € ä—‘ w¸DÑAÐPUÔV€JÜ”+¨Ô4€FÜ
”XÑ
 Ñ
#¤i°Ó&7Ñ
7€Cä
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2Ð%Ó6ˆÜ�z‰z˜$Ÿ)™)›+×,Ñ,Ó.Ó/ˆð
 �8‰8�IÔÜˆc�'�Ð.¨t¯x©x¸	Ó/BÐ.CÐDÔEØˆ	à�8‰8�F˜BÓ×#Ñ# F¨BÓ/€DÙØˆ	ô �j‰jð	Rä
�	‰	ó€Gð
 €HØ×Ñ˜dÓ#ò 1ˆØ—‘˜“
× Ñ Ó"ˆØ�w‰w�q‹z×ÑÓ!ˆØ�w‰w�q‹z×ÑÓ!ˆà�?‰?˜6Ô"Ø‰HØ�_‰_˜SÔ!Ü $‘‰Hä #‘~¨Ñ,ˆHà�‰˜ 5¨$Ð/Õ0ð1ñ Üˆc�'�Ð=¸dÀ4ÀC¸j¸\ÐJÔKØ€OøôG ò Üˆc�'�Ð.¨q¨cÐ2Ô3Ø�	ûðús   Á.AH È	H?È"H:È4H?È:H?c                 óà  — t         j                  j                  | t        ¬«      }t	        j
                  t        j                  dd«      «       	 t         j                  j                  |d¬«      }|j                  «       j                  d¬«      }|}t        j                  d|t        j                  «      }|r|j!                  d«      j#                  «       }d
}	t        j                  d|t        j                  «      }
|
r8|
j!                  d«      j#                  «       }t        j$                  dd|«      }|}	| |||	fS # t        $ r$}t        d| d	d
 › d|› �«       | ||d
fcY d
}~S d
}~ww xY w)u0   çˆ¬è¯¦æƒ…é¡µ -> (url, full_title, date, content)r(   gš™™™™™É?g      à?é   r+   Úreplace)Úerrorsu   è¯¦æƒ…é¡µå¤±è´¥ éÎÿÿÿNú: z.<h2[^>]*class="article-titleH"[^>]*>(.*?)</h2>r3   zV<div[^>]*id="zoom"[^>]*class="article-content"[^>]*>(.*?)</div>\s*(?:<!--|<div|</div>)z\s+ú )r>   r?   r@   rA   ÚtimeÚsleepÚrandomÚuniformrB   rD   rE   rF   r   rH   ÚsearchrJ   rL   rM   Úsub)rS   Ú
list_titler\   rT   rU   r1   rV   Ú
full_titleÚmtÚcontentÚmcÚbodys               r   Úfetch_detailrr   c   s?  € ä
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CÜ‡J�JŒv�~‰~˜c 3Ó'Ô(ð-Ü�~‰~×%Ñ% c°2Ð%Ó6ˆØ�y‰y‹{×!Ñ!¨Ð!Ó3ˆð €JÜ	�‰ÐDÀdÌBÏIÉIÓ	V€BÙ	Ø—X‘X˜a“[×&Ñ&Ó(ˆ
ð €GÜ	�‰ØaØŒb�i‰ió
€Bñ 
Ø�x‰x˜‹{× Ñ Ó"ˆÜ�v‰v�f˜c 4Ó(ˆØˆà�˜T 7Ð+Ð+øô+ ò -ÜÐ˜s 3 4˜y˜k¨¨A¨3Ð/Ô0Ø�Z  tÐ,Õ,ûð-ús   ÁAE  Å 	E-Å	E(Å"E-Å(E-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 (?, ?, ?, ?, ?, ?)r2   r3   u   å…¥åº“å¤±è´¥: rc   rd   )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuter   ÚSOURCEÚrowcountrF   r   ÚcommitÚclose)
rX   Úconnrw   ÚinsertedÚskippedrS   rZ   r\   ro   rV   s
             r   Ú
save_to_dbr€   ‚   sÙ   € Ü�?‰?œ7Ó#€DØ�[‰[‹]€FØ€HØ€Gà%-ò 3Ñ!ˆˆU�D˜'ð	3Ø�N‰Nð0ô ˜E 3¨¬f°g²mÀÐDô	ð �‰ Ò"Ø˜A‘‘à˜1‘�øð3ð 	‡K�K„MØ‡J�J„LØ�WÐÐøô ò 	3Ü�.  S T  ¨2¨a¨SÐ1×2Ñ2ûð	3ús   ¹>BÂ	CÂ&B?Â?Cc                  óÈ  — dt         j                  v } t        d| rdnd› d�«       | rt        dt        dz   «      ndg}g }|D ]µ  }t        |«      }|st        d|› d�«        n—|D ���cg c]  \  }}}|t        k\  sŒ|||f‘Œ }}}}t        d|› d	t        |«      › d
t        |«      › d�«       |j                  |«       t        |«      dk(  r n+t        j                  t        j                  dd«      «       Œ· |st        d«       y t        dt        |«      › d�«       g }	t        t        ¬«      5 }
t        |«      D ����ci c]"  \  }\  }}}|
j!                  t"        |||«      |“Œ$ }}}}}dt        |«      }}t%        |«      D ]I  }|dz  }|j'                  «       }|r|	j)                  |«       |dz  dk(  s||k(  sŒ9t        d|› d|› �«       ŒK 	 d d d «       t        dt        |	«      › d�«       g }|	D ]   \  }}}}|j)                  ||||r|ndf«       Œ" |r t+        |«      \  }}t        d|› d|› �«       y t        d«       y c c}}}w c c}}}}w # 1 sw Y   Œ…xY w)Nz--fullu   å¼€å§‹u   å…¨é‡�u   å¢žé‡�u	   çˆ¬å�–...r3   r-   u   é¡µæ— æ•°æ�®ï¼Œç»“æ�Ÿu   é¡µ: u   æ�¡ï¼ˆè¿‘3å¹´: u   æ�¡ï¼‰r   g333333Ó?g333333ã?u   æ— è¿‘3å¹´æ•°æ�®ï¼Œé€€å‡ºu   å…± u)    æ�¡è¿‘3å¹´æ•°æ�®ï¼Œå¼€å§‹çˆ¬è¯¦æƒ…é¡µ...)Úmax_workersr`   u   è¯¦æƒ…é¡µè¿›åº¦: r7   u   è¯¦æƒ…é¡µå®Œæˆ�ï¼Œå…± u    æ�¡r2   u   å…¥åº“å®Œæˆ�: æ–°å¢ž u	   , è·³è¿‡ u   æ— æ•°æ�®å…¥åº“)ÚsysÚargvr   ÚrangeÚ	MAX_PAGESr^   ÚTHREE_YEARS_STRÚlenÚextendrf   rg   rh   ri   r   ÚNUM_THREADSÚ	enumerateÚsubmitrr   r   ÚresultrO   r€   )Úis_fullÚpages_to_crawlÚ	all_itemsrP   rX   ÚuÚtÚdÚfilteredÚdetail_resultsÚexecutorÚiÚfuturesÚdoneÚtotalÚfÚrÚvalidrS   rZ   r\   ro   r~   r   s                           r   Úmainrž   œ   s}  € Øœ#Ÿ(™(Ð"€GÜˆ&™W‘¨(Ð3°9Ð=Ô>á07”U˜1œi¨!™mÔ,¸a¸S€Nð €IØ!ò -ˆÜ" 7Ó+ˆÙÜ�#�g�YÐ3Ð4Ô5Ùà-5×NÐN¡' ! Q¨¸¼oÓ9M�Q˜˜1’IÐNˆÒNÜˆc�'�˜%¤ H£˜¨o¼cÀ(»m¸_ÈFÐSÔTØ×Ñ˜Ô"äˆx‹=˜AÒÙä�
‰
”6—>‘> # sÓ+Õ,ð-ñ ÜÐ'Ô(Øäˆ$Œs�9‹~ÐÐGÐHÔIð €NÜ	¬Ô	4ð 	8¸ÜQZÐ[dÓQe×fÑfÁÀÁIÀQÈÈ1�8—?‘?¤<°°A°qÓ9¸1Ñ<ÐfˆÓfØœ˜W›ˆeˆÜ˜gÓ&ò 	8ˆAØ�A‰IˆDØ—‘“
ˆAÙØ×%Ñ% aÔ(Ø�b‰y˜AŠ~ ¨£ÜÐ'¨ v¨Q¨u¨gÐ6Õ7ñ	8÷	8ô Ð
 ¤ ^Ó!4Ð 5°TÐ:Ô;à€EØ%3ò EÑ!ˆˆU�D˜'Ø�‰�c˜5 $±7©ÀÐCÕDðEñ Ü& uÓ-Ñˆ�'ÜÐ# H :¨Y°w°iÐ@ÕAäÐÕùôO Oùõ$ g÷	8ð 	8ús1   Á)I	
Á<I	
Ä2IÅ'IÅ*AIÇ IÉIÉI!Ú__main__)&Ú__doc__rƒ   r8   rt   ÚosrH   rf   rh   r   r   Úconcurrent.futuresr   r   Úurllib.requestr>   Úurllib.parser   ÚenvironrG   rv   r   ry   r<   r=   r;   rA   r†   rŠ   ÚnowÚTHREE_YEARS_AGOÚstrftimer‡   r   r^   rr   r€   rž   Ú__name__© r    r   ú<module>r«      sÚ   ðñ÷ 0× /× /Ó /ß (ß ?Û Ý "à
�*‰*�.‰.˜Ð&7Ó
8€ØW€	Ø	)€Ø(€ØD€ð ØØØØ#Ø'ñ€ð QØIñ€ð
 €	Ø€Ø�(—,‘,“.¡9°'Ô#:Ñ:€Ø!×*Ñ*¨:Ó6€ò.ò-ò`,ò>ò45ðp ˆzÒÙ…Fð r    