Ë
    ¸¬ujl  ã                   óD  — d Z ddlZddlZddlZddlZddlmZmZmZ ddlZddl	Z	ddlZ e	j                  e	j                  j                  «       dZdZdZ ej                   dd«      Z ej$                  ej&                  «       ed	¬
«      z
  j)                  d«      ZddiZd„ Zd„ Zd„ Zd„ Zdd„Zedk(  rkdej:                  v Z ede› derdnd› �«        ej                  «       Z  ee¬«      \  Z!Z" ed ej                  «       e z
  d›d�«        ede!› de"› �«       yy) u.  
æ¶ªåŸŽåŒº-çŽ¯è¯„å®¡æ‰¹ (www.myfc.gov.cn)
==============================
æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�°
åˆ—è¡¨: /fcqrmzf/c122189/zwgkly.shtml
è¯¦æƒ…: /fcqrmzf/c122189/YYYYMM/hash.shtml
æ­£æ–‡: div.content

ç”¨æ³•:
    python3 crawl_myfc.py          # å…¨é‡�
    python3 crawl_myfc.py --test   # æµ‹è¯• 5 æ�¡
é    N)ÚdatetimeÚtimezoneÚ	timedeltau   æ¶ªåŸŽåŒº-çŽ¯è¯„å®¡æ‰¹zhttps://www.myfc.gov.cnz4https://www.myfc.gov.cn/fcqrmzf/c122189/zwgkly.shtmlÚ	SEARCH_DBz/root/search.dbiG  )Údaysz%Y-%m-%dz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 ó¬   — 	 t        j                  | t        dd¬«      }d|_        |j                  S # t
        $ r}t        d|› �«       Y d }~y d }~ww xY w)Né   F)ÚheadersÚtimeoutÚverifyzutf-8u     âš  fetch fail: )ÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	ExceptionÚprint)ÚurlÚrÚes      ú/root/gov_crawler/crawl_myfc.pyÚfetchr      sN   € ðÜ�L‰L˜¤g°rÀ%ÔHˆØˆŒ
Ø�v‰vˆøÜò ÜÐ" 1 #Ð&Ô'Üûðús   ‚/2 ²	A»AÁAc                 ó*  — g }| j                  d«      }|dk  r| j                  d«      }|dk  r|S | j                  d|«      }|dk  r|S | || }t        j                  d|«      }t        j                  d|«      }t        ||«      D ]‰  \  }}|j	                  «       }|r|sŒ|j                  d«      s	t        |z   }t        j                  d|«      }	|	r&|	j                  d	«      › d
|	j                  d«      › d�nd}
|j                  |||
dœ«       Œ‹ |S )u,   æ��å�–åˆ—è¡¨æ�¡ç›® (url, title, approx_date)zclass="article-list"r   zclass='article-list'z</ul>zhref="([^"]+)"ztitle='([^']+)'Úhttpz/(\d{4})(\d{2})/é   ú-é   z-01Ú )Útitler   Úpub_date)
ÚfindÚreÚfindallÚzipÚstripÚ
startswithÚBASE_URLÚsearchÚgroupÚappend)ÚhtmlÚitemsÚstartÚendÚsectionÚhrefsÚtitlesÚhrefr   ÚymÚapprox_dates              r   Ú
parse_listr5   &   s  € à€Eà�I‰IÐ,Ó-€EØˆq‚yØ—	‘	Ð0Ó1ˆØˆq‚yØˆØ
�)‰)�G˜UÓ
#€CØ
ˆQ‚wØˆØ�5˜ˆo€Gô �J‰JÐ(¨'Ó2€EÜ�Z‰ZÐ*¨GÓ4€Fä˜5 &Ó)ò 	M‰ˆˆeØ—‘“ˆÙ™DØØ�‰˜vÔ&Ü˜d‘?ˆDä�Y‰YÐ*¨DÓ1ˆÙ;=˜Ÿ™ !›˜ Q r§x¡x°£{ m°3Ñ7À2ˆØ�‰˜u¨T¸{ÑKÕLð	Mð €Ló    c                 óz  — t        | «      }|sddddœS d}t        j                  d|t        j                  «      }|r|j	                  d«      j                  «       }d}t        j                  d|t        j                  «      }|r|j	                  d«      dd }|s)t        j                  d|«      }|r|j	                  d«      }d}t        j                  d	|t        j                  «      }|r|j	                  d«      }|rt        |«      d
k  r8t        j                  d|t        j                  «      }|r|j	                  d«      }|rt        |«      d
k  r8t        j                  d|t        j                  «      }|r|j	                  d«      }|r§t        j                  dd|t        j                  t        j                  z  ¬«      }t        j                  dd|t        j                  t        j                  z  ¬«      }t        j                  dd|t        j                  ¬«      }|j                  «       }|||dœS )u+   èŽ·å�–è¯¦æƒ…é¡µçš„ title, content, pub_dater   )r   Úcontentr    z3<meta[^>]*name="ArticleTitle"[^>]*content="([^"]*)"r   z-<meta[^>]*name="PubDate"[^>]*content="([^"]+)Né
   u(   å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}-\d{2}-\d{2})z[id="zoom"[^>]*class="j-fontContent content"[^>]*>(.*?)</div>\s*</div>\s*<div class="others"é2   z.class="j-fontContent content"[^>]*>(.*?)</div>z#class="TRS_Editor"[^>]*>(.*?)</div>z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z<link[^>]*>)	r   r"   r(   ÚIr)   r%   ÚDOTALLÚlenÚsub)r   r+   r   Úmr    r8   s         r   Úfetch_detailrA   D   sÏ  € ä�‹:€DÙØ¨¸Ñ;Ð;ð €EÜ
�	‰	ÐHÈ$ÔPR×PTÑPTÓU€AÙØ—‘˜“
× Ñ Ó"ˆð €HÜ
�	‰	ÐBÀDÌ"Ï$É$ÓO€AÙØ—7‘7˜1“:˜c˜r�?ˆÙÜ�I‰IÐAÀ4ÓHˆÙØ—w‘w˜q“zˆHð €Gä
�	‰	ÐpÐrvÔxz÷  yBñ  yBó  	C€AÙØ—'‘'˜!“*ˆÙ”c˜'“l RÒ'Ü�I‰IÐGÈÌrÏyÉyÓYˆÙØ—g‘g˜a“jˆGÙ”c˜'“l RÒ'Ü�I‰IÐ<¸dÄBÇIÁIÓNˆÙØ—g‘g˜a“jˆGáÜ—&‘&Ð5°r¸7Ì"Ï)É)ÔTV×TXÑTXÉ.ÔYˆÜ—&‘&Ð3°R¸ÌÏ	É	ÔRT×RVÑRVÉÔWˆÜ—&‘&˜¨¨W¼B¿D¹DÔAˆØ—-‘-“/ˆà w¸HÑEÐEr6   c                 ó   — | st        d«       yddl}|j                  t        «      }|j	                  d«       |j	                  d«       d\  }}| D ]†  }	 |j	                  dt
        |j                  d«      xs d	dd
 |j                  dd	«      |j                  dd	«      |j                  d«      xs d	dd d	df«       |j                  dkD  r|dz  }n|dz  }Œˆ |j	                  dt
        f«       |j                  «        |j                  «        t        d|› d|› d�«       ||fS # t        $ r}|dz  }t        d|› �«       Y d}~Œ÷d}~ww xY w)u   æ‰¹é‡�å†™å…¥ search.dbu     â�­ æ— æ•°æ�®©r   r   r   NzPRAGMA journal_mode=WALzPRAGMA synchronous=NORMALzwINSERT OR IGNORE INTO gov_raw (site_name, title, page_url, content, publish_date, summary, tags) VALUES (?,?,?,?,?,?,?)r   r   iô  r   r8   r    r9   u   çŽ¯è¯„å®¡æ‰¹r   u       âš  DB error: z·INSERT INTO gov_search(rowid, title, site_name, summary) SELECT r.id, r.title, r.site_name, r.summary FROM gov_raw r WHERE r.id NOT IN (SELECT rowid FROM gov_search) AND r.site_name=?u     ðŸ’¾ å…¥åº“: æ–°å¢žu   , è·³è¿‡u   , FTSå·²å�Œæ­¥)r   Úsqlite3Úconnectr   ÚexecuteÚ	SITE_NAMEr   Útotal_changesr   ÚcommitÚclose)r,   rD   ÚdbÚokÚfailÚitr   s          r   Úto_dbrO   q   sf  € áÜÐÔ ØÛØ	�‰œÓ	#€BØ‡J�JÐ(Ô)Ø‡J�JÐ*Ô+Ø�H€BˆØò ,ˆð	,Ø�J‰Jð)ô Ø—V‘V˜G“_Ò*¨¨D¨SÐ1Ø—F‘F˜5 "Ó%Ø—F‘F˜9 bÓ)Ø—V‘V˜JÓ'Ò-¨2¨s°Ð3ØØ"ðô	ð ×Ñ !Ò#Ø�a‘‘à˜‘	�øð',ð0 ‡J�Jð	\ô 
ˆô	ð ‡I�I„KØ‡H�H„JÜ	Ð! "  X¨d¨V°>Ð
BÔCØˆtˆ8€Oøô ò 	,Ø�A‰IˆDÜÐ& q cÐ*×+Ñ+ûð	,ús   ÁBD'Ä'	EÄ0EÅEc                 óÌ  — t        t        «      }|st        d«       yt        |«      }|st        d«       y|D �cg c]  }|d   r|d   t        k\  sŒ|‘Œ }}t        dt        |«      › dt        |«      › d�«       | r|dd	 }t        d
t        |«      › d�«       |syg }t        |d«      D ]   \  }}t        |d   «      }|d   xs |d   |d   |d   |d   xs |j                  dd«      dœ}	|j                  |	«       t        d|› dt        |«      › d|d   › d|	d   dd › dt        |d   «      › d�«       t        j                  d«       Œ¢ t        |«      \  }
}|
|fS c c}w )u   å…¨é‡�çˆ¬å�–u     â�Œ æ— æ³•èŽ·å�–åˆ—è¡¨é¡µrC   u     â�Œ åˆ—è¡¨é¡µè§£æž�å¤±è´¥r    u     ðŸ“„ åˆ—è¡¨: u   æ�¡, è¿‘3å¹´: u   æ�¡Né   u"     ðŸ§ª æµ‹è¯•æ¨¡å¼�: å�ªå¤„ç�†å‰� u    æ�¡r   r   r   r8   r   )r   r   r8   r    z  [ú/ú] ú é(   z... (zB)g      à?)r   ÚLIST_URLr   r5   ÚCUTOFFr>   Ú	enumeraterA   r   r*   ÚtimeÚsleeprO   )Útestr+   r,   rN   Ú	all_itemsÚresultsÚiÚitemÚdetailÚentryrL   rM   s               r   Úcrawlrb   ž   s˜  € ä”‹?€DÙÜÐ+Ô,Øä�tÓ€EÙÜÐ+Ô,Øð $ÖV˜¨2¨jª>¸RÀ
¹^ÌvÓ=U’ÐV€IÐVÜ	ˆOœC ›J˜< ~´c¸)³nÐ5EÀSÐ
IÔJáØ˜b˜q�Mˆ	ÜÐ2´3°y³>Ð2BÀ$ÐGÔHáØð €GÜ˜Y¨Ó*ò 
‰ˆˆ4Ü˜d 5™kÓ*ˆà˜G‘_Ò5¨¨W©Ø˜‘;Ø˜iÑ(Ø˜zÑ*ÒF¨d¯h©h°zÀ2Ó.Fñ	
ˆð 	�‰�uÔÜ��A�3�aœ˜I›Ð' r¨&°Ñ*<Ð)=¸Q¸uÀW¹~ÈcÈrÐ?RÐ>SÐSXÔY\Ð]cÐdmÑ]nÓYoÐXpÐprÐsÔtÜ�
‰
�3�ð
ô �W‹~�H€BˆØˆtˆ8€Oùò5 Ws   »E!ÁE!Ú__main__z--testu   
ðŸ“¡ [rS   u   æµ‹è¯•æ¨¡å¼�u   å…¨é‡�)r[   u     â�± è€—æ—¶: z.1fÚsu     âœ… æ–°å¢ž: u     â�Œ è·³è¿‡: )F)#Ú__doc__r"   ÚsysÚosrY   r   r   r   r   Úurllib3Údisable_warningsÚ
exceptionsÚInsecureRequestWarningrG   r'   rV   Úgetenvr   ÚnowÚutcÚstrftimerW   r   r   r5   rA   rO   rb   Ú__name__Úargvr[   r   Út0rL   rM   © r6   r   ú<module>rt      s<  ðñ÷ × ß 2Ñ 2ß Û 	Ø €× Ñ ˜×+Ñ+×BÑBÔ Cð &€	Ø&€ØC€ØˆB�I‰I�kÐ#4Ó5€	Øˆh�l‰l˜8Ÿ<™<Ó(©9¸%Ô+@Ñ@×JÑJÈ:ÓV€Øð  Nð  O€òòò<+FòZ+óZ'ðR ˆzÒØ�s—x‘xÐ€DÙ	ˆH�Y�K˜r±D¡.¸hÐ!GÐ
HÔIØ	ˆ�‰‹€BÙ˜$Ô�H€BˆÙ	ˆN˜9˜4Ÿ9™9›; r™>¨#Ð.¨aÐ
0Ô1Ù	ˆN˜2˜$˜n¨T¨FÐ
3Õ4ð r6   