Ë
    ¸¬ujó  ã                   óD  — 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mZmZ ddl	m
Z
mZ ddlZej                  j                  dd«      ZdZdZd	Zd
diZdZdZ ej.                  «        ed¬«      z
  Zej3                  d«      Zd„ Zd„ Zd„ Zd„ Zd„ Ze dk(  r e«        yy)u;  
crawl_hetang.py â€” æ ªæ´²å¸‚è�·å¡˜åŒºäººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Š
CMS: ZZCMSï¼ˆæ ªæ´²CMSï¼‰
åˆ—è¡¨: é�™æ€�HTMLåˆ†é¡µ /c11731/pages/{N}.html
è¯¦æƒ…: div.page_name æ ‡é¢˜, div.page_time span æ—¥æœŸ, div.page_text#page æ­£æ–‡
æ€»: ~100+é¡µ, 15æ�¡/é¡µ (è¿‘3å¹´ ~91é¡µ ~1365æ�¡)

è¿�è¡Œ: python3 crawl_hetang.py [--full]
é    N)ÚdatetimeÚ	timedelta)ÚThreadPoolExecutorÚas_completedÚ	SEARCH_DBz/root/search.dbu+   æ ªæ´²å¸‚è�·å¡˜åŒºäººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šu   æ ªæ´²å¸‚è�·å¡˜åŒºäººæ°‘æ”¿åºœzhttp://www.hetang.gov.cnz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36é_   é
   iG  )Údaysz%Y-%m-%dc                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú!/root/gov_crawler/crawl_hetang.pyÚlogr       s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 ó,  — | dk(  r
t         › d�}nt         › d| › d�}t        j                  j                  |t        ¬«      }	 t        j                  j                  |d¬«      }|j                  «       j                  d¬	«      }g }t        j                  dt        j                  «      }|j                  |«      D ]®  }|j                  d«      j                  «       }	|j                  d«      j                  «       }
|j                  d«      j                  «       }|	j!                  d«      r|	}n'|	j!                  d«      r
t         |	z   }nt         dz   |	z   }|j#                  ||
|f«       Œ° |S # t        $ r}t        d
| › d|› �«       g cY d}~S d}~ww xY w)u3   æŠ“å�–é�™æ€�åˆ—è¡¨é¡µï¼Œè¿”å›ž [(url, title, date)]é   z/c11731/index.htmlz/c11731/pages/z.html©Úheadersé   ©ÚtimeoutÚreplace©Úerrorsõ   ç¬¬u   é¡µè¯·æ±‚å¤±è´¥: Nzb<a\s+href="([^"]*)"[^>]*title="([^"]*)"[^>]*>.*?</a>\s*<span[^>]*>\s*(\d{4}-\d{2}-\d{2})\s*</span>é   é   Úhttpú/)ÚBASE_URLÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚreadÚdecodeÚ	Exceptionr   ÚreÚcompileÚDOTALLÚfinditerÚgroupÚstripÚ
startswithÚappend)Úpage_noÚurlÚreqÚrespÚhtmlÚeÚarticlesÚpatternÚmÚhrefÚtitleÚdateÚfull_urls                r   Úfetch_list_pagerA   $   sp  € à�!‚|Ü�
Ð,Ð-‰ä�
˜.¨¨	°Ð7ˆä
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2Ð%Ó6ˆØ�y‰y‹{×!Ñ!¨Ð!Ó3ˆð €HÜ�j‰jØmÜ
�	‰	ó€Gð ×Ñ˜dÓ#ò 1ˆØ�w‰w�q‹z×ÑÓ!ˆØ—‘˜“
× Ñ Ó"ˆØ�w‰w�q‹z×ÑÓ!ˆà�?‰?˜6Ô"Ø‰HØ�_‰_˜SÔ!Ü $‘‰Hä #‘~¨Ñ,ˆHà�‰˜ 5¨$Ð/Õ0ð1ð €Oøô1 ò Üˆc�'�Ð+¨A¨3Ð/Ô0Ø�	ûðús   ÁAE- Å-	FÅ6FÆFÆF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#                  «       }nkt        j                  d|t        j                  «      }	|	rD|	j!                  d«      j#                  «       }
t        j$                  dd|
«      j#                  «       }d
}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   g333333Ã?g333333Ó?r   r   r   r   u   è¯¦æƒ…é¡µå¤±è´¥ éÎÿÿÿNú: z)<div\s+class="page_name"[^>]*>(.*?)</div>r   z<title>(.*?)</title>z-.*$Ú zM<div\s+class="page_text"\s+id="page"[^>]*>(.*?)</div>\s*(?:<!--|<script|<div)z\s+ú )r$   r%   r&   r'   ÚtimeÚsleepÚrandomÚuniformr(   r)   r*   r+   r   r,   Úsearchr.   r0   r1   Úsub)r5   Ú
list_titler?   r6   r7   r8   r9   Ú
full_titleÚmtÚmt2ÚtÚcontentÚmcÚbodys                 r   Úfetch_detailrU   J   s‡  € ä
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CÜ‡J�JŒv�~‰~˜d CÓ(Ô)ð-Ü�~‰~×%Ñ% c°2Ð%Ó6ˆØ�y‰y‹{×!Ñ!¨Ð!Ó3ˆð €JÜ	�‰Ð?ÀÄrÇyÁyÓ	Q€BÙ	Ø—X‘X˜a“[×&Ñ&Ó(‰
ô �i‰iÐ/°´r·y±yÓAˆÙØ—	‘	˜!“×"Ñ"Ó$ˆAÜŸ™ ¨¨QÓ/×5Ñ5Ó7ˆJð €GÜ	�‰ØXØŒb�i‰ió
€Bñ 
Ø�x‰x˜‹{× Ñ Ó"ˆÜ—&‘&˜  dÓ+ˆà�˜T 7Ð+Ð+øô5 ò -ÜÐ˜s 3 4˜y˜k¨¨A¨3Ð/Ô0Ø�Z  tÐ,Õ,ûð-ús   ÁAF* Æ*	GÆ3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 (?, ?, ?, ?, ?, ?)rE   r   u   å…¥åº“å¤±è´¥: rC   rD   )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuter   ÚSOURCEÚrowcountr+   r   ÚcommitÚclose)
r:   ÚconnrZ   ÚinsertedÚskippedr5   r>   r?   rR   r9   s
             r   Ú
save_to_dbrc   n   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	   çˆ¬å�–...r   r   u   é¡µæ— æ•°æ�®ï¼Œç»“æ�Ÿu   é¡µ: u   æ�¡ï¼ˆè¿‘3å¹´: u   æ�¡ï¼‰r   gš™™™™™É?gš™™™™™Ù?u   æ— è¿‘3å¹´æ•°æ�®ï¼Œé€€å‡ºu   å…± u)    æ�¡è¿‘3å¹´æ•°æ�®ï¼Œå¼€å§‹çˆ¬è¯¦æƒ…é¡µ...)Úmax_workersé   u   è¯¦æƒ…é¡µè¿›åº¦: r"   u   è¯¦æƒ…é¡µå®Œæˆ�ï¼Œå…± u    æ�¡rE   u   å…¥åº“å®Œæˆ�: æ–°å¢ž u	   , è·³è¿‡ u   æ— æ•°æ�®å…¥åº“)ÚsysÚargvr   ÚrangeÚ	MAX_PAGESrA   ÚTHREE_YEARS_STRÚlenÚextendrG   rH   rI   rJ   r   ÚNUM_THREADSÚ	enumerateÚsubmitrU   r   Úresultr3   rc   )Úis_fullÚpages_to_crawlÚ	all_itemsr4   r:   ÚurQ   ÚdÚfilteredÚdetail_resultsÚexecutorÚiÚfuturesÚdoneÚtotalÚfÚrr5   r>   r?   rR   Úvalidra   rb   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__rg   rW   Úosr,   rG   rI   r   r   Úconcurrent.futuresr   r   Úurllib.requestr$   ÚenvironÚgetrY   r   r\   r#   r'   rj   rn   ÚnowÚTHREE_YEARS_AGOÚstrftimerk   r   rA   rU   rc   r�   Ú__name__© r   r   ú<module>rŽ      s´   ðñ÷ *× )× )ß (ß ?Û à
�*‰*�.‰.˜Ð&7Ó
8€Ø9€	Ø	)€Ø%€ð ÐPð€ð €	Ø€Ø�(—,‘,“.¡9°'Ô#:Ñ:€Ø!×*Ñ*¨:Ó6€ò.ò#òL!,òHò42ðj ˆzÒÙ…Fð r   