Ë
    ¸¬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mZmZ ddlmZmZ ej"                  j%                  dd«      ZdZdZd	Zd
diZdZdZdZdZ ej8                  «        ed¬«      z
  j;                  d«      Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$e%dk(  r e$«        yy)uo  
ä¸œè‡³åŽ¿äººæ°‘æ”¿åºœ - è¯¦ç»†è§„åˆ’ï¼ˆåŸŽé•‡å¼€å�‘è¾¹ç•Œå†…ï¼‰çˆ¬è™«
CMS: åŸºå±‚æ”¿åŠ¡å…¬å¼€å¹³å�°
åˆ—è¡¨: é�™æ€�åˆ†é¡µ page_N.html
è¯¦æƒ…: requests + <div class="m-dttexts" id="zoom"> + <h1 class="u-lgtit">
WAF: æ— 

è¿�è¡Œ: python3 crawl_dongzhi.py [--full]
  --full: å…¨é‡�çˆ¬å�– (æ‰€æœ‰6é¡µï¼Œå�«æ—¥æœŸè¿‡æ»¤)
  ä¸�åŠ : ä»…çˆ¬ç¬¬1é¡µ (å¢žé‡�æ¨¡å¼�ï¼Œæ—¥è·‘ç”¨)
é    N)ÚThreadPoolExecutorÚas_completed)ÚdatetimeÚ	timedeltaÚ	SEARCH_DBz/root/search.dbu=   ä¸œè‡³åŽ¿äººæ°‘æ”¿åºœ-è¯¦ç»†è§„åˆ’ï¼ˆåŸŽé•‡å¼€å�‘è¾¹ç•Œå†…ï¼‰u!   ä¸œè‡³åŽ¿è‡ªç„¶èµ„æº�å’Œè§„åˆ’å±€zhttps://www.dongzhi.gov.cnz
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  )Údaysz%Y-%m-%dc                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú"/root/gov_crawler/crawl_dongzhi.pyÚlogr   %   s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 ó2  — t         › d| › d�}t        j                  j                  |t        ¬«      }	 t        j                  j                  |d¬«      }|j                  «       j                  «       S # t        $ r}t        d| › d|› �«       Y d }~y d }~ww xY w)Nz(/Jczwgk/opennessList/263/132007002/page_z.html©Úheadersé   ©Útimeoutu
   åˆ—è¡¨é¡µ u    è¯·æ±‚å¤±è´¥: )
ÚBASE_URLÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚreadÚdecodeÚ	Exceptionr   )Úpage_noÚurlÚreqÚrespÚes        r   Ú
fetch_listr)   )   s‰   € ÜˆJÐ>¸w¸iÀuÐ
M€CÜ
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2Ð%Ó6ˆØ�y‰y‹{×!Ñ!Ó#Ð#øÜò Üˆj˜˜	 °°Ð4Ô5Üûðús   ³>A2 Á2	BÁ;BÂBc                 ó,  — g }t        j                  dt         j                  «      }|j                  | «      D ]Ù  }t        j                  d|«      }t        j                  d|«      }|st        j                  d|«      }|r|sŒL|j                  d«      }|j                  d«      }t        j                  |j                  d«      j                  «       «      }|t        k  rŒª|j                  d«      r|nt        |z   }	|j                  |	||f«       ŒÛ |S )Nz<li>(.*?)</li>z%<span[^>]*>(\d{4}-\d{2}-\d{2})</span>z#<a href="([^"]+)"\s+title="([^"]*)"z"<a href="([^"]+)"[^>]*>([^<]+)</a>é   é   Úhttp)ÚreÚcompileÚDOTALLÚfindallÚsearchÚgroupÚhtmlmodÚunescapeÚstripÚTHREE_YEARS_AGOÚ
startswithr   Úappend)
Ú	html_textÚitemsÚpatternÚliÚdate_mÚa_mÚdateÚurl_pathÚtitleÚfull_urls
             r   Ú
parse_listrD   4   sí   € Ø€Eä�j‰jÐ*¬B¯I©IÓ6€GØ�o‰o˜iÓ(ò .ˆÜ—‘ÐCÀRÓHˆÜ�i‰iÐ>ÀÓCˆÙÜ—)‘)ÐAÀ2ÓFˆCÙ™SØØ�|‰|˜A‹ˆØ—9‘9˜Q“<ˆÜ× Ñ  §¡¨1£×!3Ñ!3Ó!5Ó6ˆð ”/Ò!Øà'×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                  «       «      }t        }	t        j                  d|«      }|r2t        j                  |j                  d«      j                  «       «      }	d }
t        j                  d|t        j                  «      }|r |j                  d«      j                  «       }
nFt        j                  d|t        j                  «      }|r|j                  d«      j                  «       }
|
r%t        j                   d	d
|
«      j                  «       }
| |||
|	fS # t        $ r}| ||d t        fcY d }~S d }~ww xY w)Nr   r   r   z1<meta[^>]*ArticleTitle["\s][^>]*content="([^"]*)"r+   z2<meta[^>]*ContentSource["\s][^>]*content="([^"]*)"zC<div class="m-dttexts[^"]*"[^>]*id="zoom"[^>]*>(.*?)</div>\s*</div>z6<div[^>]*class="[^"]*TRS_Editor[^"]*"[^>]*>(.*?)</div>z\s+ú )r   r   r   r   r    r!   r"   r#   ÚSOURCEr.   r2   r4   r5   r3   r6   r0   Úsub)r%   rB   r@   r&   r'   Úhtmlr(   Úfinal_titleÚmÚsourceÚcontents              r   Úfetch_detailrN   L   sˆ  € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€Cð0Ü�~‰~×%Ñ% c°2Ð%Ó6ˆØ�y‰y‹{×!Ñ!Ó#ˆð
 €KÜ
�	‰	ÐFÈÓM€AÙÜ×&Ñ& q§w¡w¨q£z×'7Ñ'7Ó'9Ó:ˆô €FÜ
�	‰	ÐGÈÓN€AÙÜ×!Ñ! !§'¡'¨!£*×"2Ñ"2Ó"4Ó5ˆð €GÜ
�	‰	ÐXÐZ^Ô`b×`iÑ`iÓj€AÙØ—'‘'˜!“*×"Ñ"Ó$‰ô �I‰IÐOÐQUÔWY×W`ÑW`ÓaˆÙØ—g‘g˜a“j×&Ñ&Ó(ˆGáÜ—&‘&˜  gÓ.×4Ñ4Ó6ˆà�˜d G¨VÐ4Ð4øô; ò 0Ø�U˜D $¬Ð/Õ/ûð0ús   §?F? Æ?	GÇ
GÇGÇG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 (?, ?, ?, ?, ?, ?)Ú r+   u   å…¥åº“å¤±è´¥: é2   z... )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuter   Úrowcountr#   r   ÚcommitÚclose)ÚarticlesÚconnrU   ÚinsertedÚskippedr%   rB   r@   rM   rL   r(   s              r   Ú
save_to_dbr^   q   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t        › d�«       g }| rt	        dt
        dz   «      ndg}|D ]†  }t        j                  t        j                  t        Ž «       t        |«      }|€Œ:t        |«      }|st        d|› d	�«       | rŒY 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 ]F  }|dz  }	 |j+                  |j-                  «       «       |dz  dk(  s||k(  sŒ6t        d|› d|› �«       ŒH 	 d d d «       t3        |«      \  }}t        d|› d|› �«       y c c}}
}	}w # t.        $ r+ ||   }||   \  }	}
}|j+                  |	|
|d t0        f«       Y Œ…w xY w# 1 sw Y   ŒhxY w)Nz--fullu   å¼€å§‹u   å…¨é‡�u   å¢žé‡�u   çˆ¬å�– (3å¹´æˆªç‚¹: z)...r+   u   ç¬¬ u    é¡µ: 0 æ�¡ (å…¨éƒ¨è¶…å‡º3å¹´)u    é¡µ: u    æ�¡u
   å…±èŽ·å�– u     æ�¡åˆ—è¡¨æ•°æ�® (3å¹´è¿‡æ»¤å�Ž)u   æ²¡æœ‰æ•°æ�®ï¼Œé€€å‡ºu   å¼€å§‹å¤šçº¿ç¨‹çˆ¬å�–è¯¦æƒ… (u
   çº¿ç¨‹)...)Úmax_workersr   r	   u   è¯¦æƒ…è¿›åº¦: ú/u   å…¥åº“å®Œæˆ�: æ–°å¢ž u	   , è·³è¿‡ )ÚsysÚargvr   r7   ÚrangeÚ	MAX_PAGESÚtimeÚsleepÚrandomÚuniformÚREQUEST_DELAYr)   rD   ÚlenÚextendÚNUM_THREADSr   Ú	enumerateÚsubmitrN   r   r9   Úresultr#   rG   r^   )Úis_fullÚ	all_itemsÚpages_to_crawlr$   r:   r;   ÚresultsÚexecutorÚir%   ÚtÚdÚfuturesÚdoneÚtotalÚfÚidxr\   r]   s                      r   Úmainr~   ‹   sE  € Øœ#Ÿ(™(Ð"€GÜˆ&™W‘¨(Ð3Ð3GÌÐGXÐX\Ð]Ô^ð €IÙ07”U˜1œi¨!™mÔ,¸a¸S€Nà!ò  ˆÜ�
‰
”6—>‘>¤=Ð1Ô2Ü˜wÓ'ˆ	ØÐØÜ˜9Ó%ˆÙÜ�$�w�iÐ=Ð>Ô?ÙØáÜˆd�7�)˜6¤# e£* ¨TÐ2Ô3Ø×Ñ˜Õð ô ˆ*”S˜“^Ð$Ð$DÐEÔFáÜÐ#Ô$Øô Ð
'¬ }°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ð:Ø—‘˜qŸx™x›zÔ*ð
 �b‰y˜AŠ~ ¨£Ü�n T F¨!¨E¨7Ð3Õ4ñ		5÷	5ô  # 7Ó+Ñ€HˆgÜÐ
 ˜z¨°7°)Ð<Õ=ùõ! køô ò :Ø˜a‘j�Ø% c™N‘	��Q˜Ø—‘  Q¨¨4´Ð8Ö9ð:ú÷5ð 5úsH   ÄH#Ä.'G$Å%H#Å;G,ÆH#Æ(H#Ç$H#Ç,1H ÈH#ÈH È H#È#H,Ú__main__)&Ú__doc__rb   r.   rf   rh   rR   ÚosÚurllib.requestr   Úurllib.errorrI   r4   Úconcurrent.futuresr   r   r   r   ÚenvironÚgetrT   r   rG   r   r   re   Ú	PAGE_SIZErm   rj   ÚnowÚstrftimer7   r   r)   rD   rN   r^   r~   Ú__name__© r   r   ú<module>rŒ      sÄ   ðñ
÷ H× G× G× GÛ ß ?ß (à
�*‰*�.‰.˜Ð&7Ó
8€ØK€	Ø	,€à'€àð  Dð€ð €	Ø€	Ø€Ø€ð  �8—<‘<“>¡I°5Ô$9Ñ9×CÑCÀJÓO€ò.òòò0"5òJò41>ðh ˆzÒÙ…Fð r   