Ë
    ¸¬ujä  ã                   ór  — 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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)"uq  
crawl_sdqixia.py â€” æ –éœžå¸‚-å»ºè®¾é¡¹ç›®çŽ¯è¯„å®¡æ‰¹
CMS: JCMS (å�Œè�§å±±)
åˆ—è¡¨: GET /api-gateway/jpaas-publish-server/front/page/build/unit
       å…³é”®å�‚æ•° paramJson={"pageNo":N,"pageSize":"15"}
è¯¦æƒ…: æ ‡é¢˜div.title>h1, æ—¥æœŸspan.time, æ­£æ–‡div.text#zoom
æ€»: 293æ�¡, 20é¡µ, 15æ�¡/é¡µ (è¿‘3å¹´ ~17é¡µ ~250æ�¡)

è¿�è¡Œ: python3 crawl_sdqixia.py [--full]
é    N)ÚdatetimeÚ	timedelta)ÚThreadPoolExecutorÚas_completed)Ú	urlencodeÚ	SEARCH_DBz/root/search.dbu"   æ –éœžå¸‚-å»ºè®¾é¡¹ç›®çŽ¯è¯„å®¡æ‰¹u   æ –éœžå¸‚æ”¿åºœzhttps://www.sdqixia.gov.cnz7/api-gateway/jpaas-publish-server/front/page/build/unitÚ156Ú40624ÚbulidstaticÚcolumnu   å†…å®¹Ú9PoOaKYCR68JNEP175LR3Únull)ÚwebIdÚpageIdÚ	parseTypeÚpageTypeÚtagIdÚtplSetIdÚeditTypez<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36z2https://www.sdqixia.gov.cn/col/col40624/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_sdqixia.pyÚlogr!   .   s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 óD  — 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g S |j#                  di «      j#                  dd«      }|sg S g }	t%        j&                  dt$        j(                  «      }
|
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)u1   è°ƒç”¨JCMSåˆ—è¡¨APIï¼Œè¿”å›ž [(url, title, date)]Ú15)ÚpageNoÚpageSizeF)Úensure_ascii)Ú	paramJsonú?©Úheadersé   ©Útimeoutõ   ç¬¬u   é¡µAPIè¯·æ±‚å¤±è´¥: NÚsuccessÚdataÚhtmlÚ zg<a\s+[^>]*href="([^"]*)"[^>]*title="([^"]*)"[^>]*>.*?</a>\s*<span[^>]*>\s*(\d{4}-\d{2}-\d{2})\s*</span>é   é   é   Ú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Úrespr1   Úer2   ÚarticlesÚpatternÚmÚhrefÚtitleÚdateÚfull_urls                   r    Úfetch_list_pager_   2   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ÔØˆ	à�8‰8�F˜BÓ×#Ñ# F¨BÓ/€DÙØˆ	ð €Hä�j‰jØrÜ
�	‰	ó€Gð ×Ñ˜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øôE ò Üˆc�'�Ð.¨q¨cÐ2Ô3Ø�	ûðús   Á.AG9 Ç9	HÈHÈ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                  «      }
|
r7|
j!                  d«      j#                  «       }t        j$                  dd|«      }	n]t        j                  d|t        j                  «      }|r6|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   r-   Úreplace)Úerrorsu   è¯¦æƒ…é¡µå¤±è´¥ éÎÿÿÿNú: z<h1[^>]*>(.*?)</h1>r4   z><div\s+class="text"\s+id="zoom">(.*?)<div\s+class="bt_content"z\s+ú z?<div\s+class="text"\s+id="zoom">(.*?)</div>\s*(?:<div|</div>|$))r?   r@   rA   rB   ÚtimeÚsleepÚrandomÚuniformrC   rE   rF   rG   r!   rI   ÚsearchrK   rM   rN   Úsub)rT   Ú
list_titler]   rU   rV   r2   rW   Ú
full_titleÚmtÚcontentÚmcÚbodyÚmc2s                r    Úfetch_detailrs   a   sƒ  € ä
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CÜ‡J�JŒv�~‰~˜c 3Ó'Ô(ð-Ü�~‰~×%Ñ% c°2Ð%Ó6ˆØ�y‰y‹{×!Ñ!¨Ð!Ó3ˆð €JÜ	�‰Ð)¨4´·±Ó	;€BÙ	Ø—X‘X˜a“[×&Ñ&Ó(ˆ
ð €GÜ	�‰ØIØŒb�i‰ió
€Bñ 
Ø�x‰x˜‹{× Ñ Ó"ˆÜ—&‘&˜  dÓ+‰ô �i‰iØNØ”"—)‘)ó
ˆñ Ø—9‘9˜Q“<×%Ñ%Ó'ˆDÜ—f‘f˜V S¨$Ó/ˆGà�˜T 7Ð+Ð+øô; ò -ÜÐ˜s 3 4˜y˜k¨¨A¨3Ð/Ô0Ø�Z  tÐ,Õ,ûð-ús   ÁAF Æ	G	Æ%GÆ>G	ÇG	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 (?, ?, ?, ?, ?, ?)r3   r4   u   å…¥åº“å¤±è´¥: rc   rd   )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuter   ÚSOURCEÚrowcountrG   r!   ÚcommitÚclose)
rX   Úconnrx   ÚinsertedÚskippedrT   r\   r]   ro   rW   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�«       |	D ����cg c]  \  }}}}||||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c c}}}}w )Nz--fullu   å¼€å§‹u   å…¨é‡�u   å¢žé‡�u	   çˆ¬å�–...r4   r/   u   é¡µæ— æ•°æ�®ï¼Œç»“æ�Ÿu   é¡µ: u   æ�¡ï¼ˆè¿‘3å¹´: u   æ�¡ï¼‰r   g333333Ó?g333333ã?u   æ— è¿‘3å¹´æ•°æ�®ï¼Œé€€å‡ºu   å…± u)    æ�¡è¿‘3å¹´æ•°æ�®ï¼Œå¼€å§‹çˆ¬è¯¦æƒ…é¡µ...)Úmax_workersr   u   è¯¦æƒ…é¡µè¿›åº¦: r8   u   è¯¦æƒ…é¡µå®Œæˆ�ï¼Œå…± u    æ�¡r3   u   å…¥åº“å®Œæˆ�: æ–°å¢ž u	   , è·³è¿‡ u   æ— æ•°æ�®å…¥åº“)ÚsysÚargvr!   ÚrangeÚ	MAX_PAGESr_   ÚTHREE_YEARS_STRÚlenÚextendrf   rg   rh   ri   r   ÚNUM_THREADSÚ	enumerateÚsubmitrs   r   ÚresultrP   r�   )Úis_fullÚpages_to_crawlÚ	all_itemsrQ   rX   ÚuÚtÚdÚfilteredÚdetail_resultsÚexecutorÚiÚfuturesÚdoneÚtotalÚfÚrrT   r\   r]   ro   Úvalidr   r€   s                           r    ÚmainrŸ   ¢   su  € Øœ#Ÿ(™(Ð"€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Ð:Ô;à]k×lÑlÑ@YÀÀUÈDÐRYˆc�5˜$©7¡¸Ò;Ðl€EÓláÜ& uÓ-Ñˆ�'ÜÐ# H :¨Y°w°iÐ@ÕAäÐÕùôI Oùõ$ g÷	8ð 	8üõ ms7   Á)I
Á<I
Ä2IÅ'IÅ*AIÇ IÇ;I
ÉIÉIÚ__main__)&Ú__doc__r„   r9   ru   ÚosrI   rf   rh   r   r   Úconcurrent.futuresr   r   Úurllib.requestr?   Úurllib.parser   ÚenvironrH   rw   r   rz   r=   r>   r<   rB   r‡   r‹   ÚnowÚTHREE_YEARS_AGOÚstrftimerˆ   r!   r_   rs   r�   rŸ   Ú__name__© r"   r    ú<module>r¬      sÞ   ðñ	÷ 0× /× /Ó /ß (ß ?Û Ý "à
�*‰*�.‰.˜Ð&7Ó
8€Ø0€	Ø	€Ø'€ØD€ð ØØØØØ'Øñ€ð QØCñ€ð
 €	Ø€Ø�(—,‘,“.¡9°'Ô#:Ñ:€Ø!×*Ñ*¨:Ó6€ò.ò,ò^$,òNò42ðj ˆzÒÙ…Fð r"   