Ë
    ^-Œj@   ã                   ó  — 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 ddlZddlmZ dZdZej$                  Zd„ Zee_        ej*                  j-                  d	d
«       d„ Z eej0                  dd «      Z ede› �«        ej6                  dd«      ZdZdZdZdZ dZ!ddl	m
Z
  e	jD                  «        e
d¬«      z
  jG                  d«      Z$ddiZ%d„ Z&d„ Z'd„ Z(d„ Z)d„ Z*d „ Z+d!„ Z,d"„ Z-d#„ Z.e/d$k(  r e.«        yy)%u  
æœ�é˜³åŽ¿äººæ°‘æ”¿åºœ - çŽ¯ä¿�è¡Œæ”¿è®¸å�¯(æ ¹æ �ç›®) çˆ¬è™«
URL: https://www.cyx.gov.cn/cyxzf/zwgk/zwgkbzhgfhzl/gkly/sthj/xzxk/glist.html
CMS: æœ�é˜³æ”¿åºœç«™ç¾¤ (å�Œ crawl_cyx.py jsxm å­�æ �ç›®)
åˆ—è¡¨: ul.main-list01 > li > a[href=/html/CYXZF/...] + span[æ—¥æœŸ], 19æ�¡/é¡µ
åˆ†é¡µ: glistN.html (ç¬¬2é¡µ=glist2.html, å…±2é¡µ)
è¯¦æƒ…: meta ArticleTitle + div.main-info-info æ­£æ–‡, æ—¥æœŸ span.time

ç”¨æ³•:
  python3 crawl_cyx_xzxk.py --pages=1     # å¢žé‡�: å‰�1é¡µ
  python3 crawl_cyx_xzxk.py --pages=5     # é¦–æ‰¹å‰�5é¡µ
é    N)ÚdatetimeÚ	timedelta)Úurljoin)ÚBeautifulSoupz
42.4.4.248zwww.cyx.gov.cnc                 ó>   — | t         k(  rt        } t        | g|¢­i |¤ŽS )N)Ú	_CYX_HOSTÚ_CYX_IPÚ_orig_getaddrinfo)ÚhostÚargsÚkwargss      ú#/root/gov_crawler/crawl_cyx_xzxk.pyÚ_patched_getaddrinfor      s$   € ØŒyÒÜˆÜ˜TÐ3 DÒ3¨FÑ3Ð3ó    ÚREQUESTS_CA_BUNDLEÚ c                 óL  — d| v ryt        | «      D ]‘  \  }}|dk(  r:|dz   t        | «      k  r)| |dz      j                  «       rt        | |dz      «      c S |j	                  d«      rt        |j                  d«      d   «      c S |j                  «       sŒ†t        |«      c S  y)Nz--fulli'  z--pagesé   z--pages=ú=)Ú	enumerateÚlenÚisdigitÚintÚ
startswithÚsplit)ÚargvÚiÚas      r   Úparse_pagesr   #   s™   € Ø�4ÑØÜ˜$“ò ‰ˆˆ1Ø�	Š>˜a !™e¤c¨$£iÒ/°D¸¸1¹±I×4EÑ4EÔ4GÜ�t˜A˜a™C‘y“>Ò!Ø�<‰<˜
Ô#Ü�q—w‘w˜s“| A‘Ó'Ò'Ø�9‰9�;Ü�q“6ŠMðð r   r   z[cyx-xzxk] max_pages=Ú	SEARCH_DBz/mnt/data/search.dbzhttps://www.cyx.gov.cnz-/cyxzf/zwgk/zwgkbzhgfhzl/gkly/sthj/xzxk/glistu   æœ�é˜³åŽ¿-çŽ¯ä¿�è¡Œæ”¿è®¸å�¯u   çŽ¯ä¿�è¡Œæ”¿è®¸å�¯u   è¾½å®�)r   iG  )Údaysz%Y-%m-%dz
User-AgentzkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36c                  óª   — t        j                  t        d¬«      } | j                  d«       | j                  d«       t         j                  | _        | S )Né   )ÚtimeoutzPRAGMA journal_mode=WALzPRAGMA busy_timeout=30000)Úsqlite3ÚconnectÚDB_PATHÚexecuteÚRowÚrow_factory)Úconns    r   Úget_connr,   @   s=   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ü—{‘{€DÔØ€Kr   c                 óÜ   — | s| S | j                  dd«      j                  dd«      j                  dd«      j                  dd«      } t        j                  dd| «      } | j                  «       S )Nz&middot;r   z&nbsp;z&ensp;z&emsp;z[\u200b\u200c\u200d\ufeff])ÚreplaceÚreÚsubÚstrip)Úts    r   Úclean_titler3   G   sb   € ÙØˆØ	�	‰	�*˜bÓ!×)Ñ)¨(°BÓ7×?Ñ?ÀÈ"ÓM×UÑUÐV^Ð`bÓc€AÜ
�‰Ð,¨b°!Ó4€AØ�7‰7‹9Ðr   c                 óH   — | j                  d|f«      j                  «       d uS )Nz'SELECT id FROM gov_raw WHERE page_url=?)r(   Úfetchone)r+   Úpage_urls     r   Úis_dupr7   N   s%   € Ø�<‰<ÐAÀHÀ;ÓO×XÑXÓZÐbfÐfÐfr   c                 óÜ  — |rd|v rt        |j                  dd«      «      nd}d}|rt        |d«      j                  d¬«      d d }	 | j	                  dt
        |||||t        |d	t        d
|xs dv rdndf«      }|j                  dkD  r	 | j	                  d|t
        |f«       yy# t        $ r}t        d|› �«       Y d }~yd }~ww xY w# t        $ r}t        d|› �«       Y d }~yd }~ww xY w)Nú-r   r   úhtml.parserT©r1   éÈ   z¼INSERT OR IGNORE INTO gov_raw (site_name, title, page_url, publish_date, content, date_rank, category, summary, script_name, group_name, has_table) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)zcrawl_cyx_xzxk.pyz<tabler   zCINSERT INTO gov_search (title, site_name, summary) VALUES (?, ?, ?)z    [FTS WARN] Fz    [ERR] insert: )r   r.   r   Úget_textr(   Ú	SITE_NAMEÚCATEGORYÚ
GROUP_NAMEÚrowcountÚ	ExceptionÚprint)	r+   Útitler6   Úpublish_dateÚcontentÚ	date_rankÚplainÚcurÚes	            r   Úinsert_itemrK   Q   s  € Ù6BÀsÈlÑGZ”�L×(Ñ(¨¨bÓ1Ô2Ð`a€IØ€EÙÜ˜g }Ó5×>Ñ>ÀTÐ>ÓJÈ4ÈCÐPˆðØ�l‰lð7ô ˜˜x¨°wÀ	Ì8ÐUZØ ¤*°8ÀÂÈ2Ñ3N©aÐTUðWó	
ˆð �<‰<˜!Òð-Ø—‘ØYØœI uÐ-ôð Øøô ò -Ü˜¨ sÐ+×,Ð,Øûð-ûô ò ÜÐ" 1 #Ð&Ô'Üûðús=   ÁAC
 ÂB& Â&	CÂ/CÂ=C
 ÃCÃC
 Ã
	C+ÃC&Ã&C+c                 óX   — | j                  |t        d¬«      }d|_        |j                  S )Nr#   ©Úheadersr$   úutf-8)ÚgetÚHEADERSÚencodingÚtext)ÚsessionÚurlÚresps      r   ÚfetchrW   l   s'   € Ø�;‰;�s¤G°Rˆ;Ó8€DØ€D„MØ�9‰9Ðr   c           
      ó˜  — g }t        j                  d| t         j                  «      }|D ]�  }t        j                  d|t         j                  «      }|sŒ+|j	                  d«      }t        t        j                  dd|j	                  d«      «      «      }t        t        |«      }|j                  |||j	                  d«      f«       ŒŸ |S )u<   è§£æž�åˆ—è¡¨é¡µ: li > a[href=/html/CYXZF/...] + span[æ—¥æœŸ]z<li>(.*?)</li>zG<a[^>]*href="([^"]+)"[^>]*>(.*?)</a>\s*<span>(\d{4}-\d{2}-\d{2})</span>r   z<[^>]+>r   é   é   )
r/   ÚfindallÚDOTALLÚsearchÚgroupr3   r0   r   ÚBASEÚappend)Ú	html_textÚitemsÚlisÚliÚmÚhrefrD   rU   s           r   Ú
parse_listrg   q   s¥   € à€EÜ
�*‰*Ð&¨	´2·9±9Ó
=€CØò 3ˆÜ�I‰IÐ`ÐbdÔfh×foÑfoÓpˆÚØ—7‘7˜1“:ˆDÜ¤§¡ z°2°q·w±w¸q³zÓ BÓCˆEÜœ$ Ó%ˆCØ�L‰L˜%  a§g¡g¨a£jÐ1Õ2ð3ð €Lr   c                 óþ  — t        t        | «      d«      }|j                  g d¢«      D ]  }|j                  «        Œ |j                  dt	        j
                  dt        j                  «      i¬«      D ]  }|j                  «        Œ |j                  d«      D ]L  }|j                  d«      }|rt        t        |«      |d<   |j                  d«      }|sŒ=|j                  «        ŒN g }|j                  g d	¢«      D ]˜  }|j                  }|d
k(  rŒ|dk(  r|j                  d«      rŒ,|j                  d¬«      }|sŒA|dk(  r|j                  t        |«      «       Œa|dv sŒf|dk(  r|j                  ddg«      rŒ|j                  t        |«      «       Œš dj                  |«      }	|	j!                  d«      }
g }|
D ]  }|r	||d   k7  sŒ|j                  |«       Œ  dj                  |«      j#                  «       S )Nr:   )ÚscriptÚstyleÚnoscriptrj   zdisplay\s*:\s*none©Úattrsr   rf   Úimg)ÚpÚtableÚdivrd   Úh1Úh2Úh3Úh4Útrro   rp   Tr;   )ro   rq   rd   rr   rs   rt   ru   rq   z

éÿÿÿÿ)r   ÚstrÚfind_allÚ	decomposer/   ÚcompileÚIrP   r   r_   ÚfindÚnameÚfind_parentr=   r`   Újoinr   r1   )ÚnodeÚsoupÚtagr   rf   rn   ÚpartsÚelrS   rF   ÚsegsÚdedupedÚss                r   Úextract_contentr‰   ~   sÊ  € Üœ˜T› MÓ2€DØ�}‰}Ò<Ó=ò ˆØ�‰�ðà�}‰} G¬R¯Z©ZÐ8MÌrÏtÉtÓ-TÐ#Uˆ}ÓVò ˆØ�‰�ðà�]‰]˜3Óò ˆØ�u‰u�V‹}ˆÙÜ¤ dÓ+ˆAˆf‰IØ�f‰f�U‹mˆÚØ�M‰M�Oðð €EØ�m‰mÒOÓPò "ˆØ�g‰gˆØ�$Š;ØØ�#Š:˜"Ÿ.™.¨Ô1ØØ�{‰{ ˆ{Ó&ˆÙØØ�'Š>Ø�L‰Lœ˜R›Õ!ØÐ>Ò>Ø�eŠ| §¡¨¨g¨Ô 7ØØ�L‰Lœ˜R›Õ!ð"ð �k‰k˜%Ó €GØ�=‰=˜Ó €DØ€GØò ˆÙ˜!˜w r™{Ó*Ø�N‰N˜1Õðð �;‰;�wÓ×%Ñ%Ó'Ð'r   c                 ó6  — t        | d«      }d}|j                  dddi¬«      }|r|j                  d«      rt        |d   «      }d}t	        j
                  d| «      }|r|j                  d	«      }d}|j                  d
d¬«      }|rt        |«      }|s|}|||fS )Nr:   r   Úmetar~   ÚArticleTitlerl   rF   z(\d{4}-\d{2}-\d{2})r   rq   zmain-info-info)Úclass_)r   r}   rP   r3   r/   r]   r^   r‰   )	ra   Úfallback_titler‚   rD   r‹   Úpub_datere   rF   rq   s	            r   Úparse_detailr�   £   s¦   € Ü˜ MÓ2€DØ€EØ�9‰9�V F¨NÐ#;ˆ9Ó<€DÙ�—‘˜Ô#Ü˜D ™OÓ,ˆØ€HÜ
�	‰	Ð(¨)Ó4€AÙØ—7‘7˜1“:ˆØ€GØ
�)‰)�EÐ"2ˆ)Ó
3€CÙ
Ü! #Ó&ˆÙØˆØ�'˜8Ð#Ð#r   c                  ó²  — t        «       } t        j                  «       }g }t        dt        dz   «      D ]…  }|dk(  rt
        › t        › d�}nt
        › t        › |› d�}	 t        ||«      }t        |«      }t        d|› dt        |«      › d�«       |s n(|j                  |«       t        j                  d«       Œ‡ t        d	t        |«      › d
�«       dx}x}	}
t        |d«      D ]Ð  \  }\  }}}	 |r
|t         k  rŒt#        | |«      r|	dz  }	Œ)|j%                  |t&        d¬«      }d|_        t+        |j,                  |«      \  }}}|s|}t/        | ||||«      r|dz  }n|	dz  }	| j1                  «        t        j                  d«       |dz  dk(  sŒ®t        d|› dt        |«      › d|› d|	› d|
› �
«       ŒÒ | j3                  «        t        d|› d|	› d|
› d�«       t        d|› �«       y # t        $ r1}t        d|› d|› �«       t        j                  d«       Y d }~�Œ}d }~ww xY w# t        $ r#}|
dz  }
t        d|d d › d|› �«       Y d }~Œëd }~ww xY w)Nr   z.htmlz[cyx-xzxk] page z: z itemsz  [WARN] page rZ   gš™™™™™Ù?z[cyx-xzxk] collected z list itemsr   r#   rM   rO   z  [ERR] é(   g333333Ó?é
   z  [ú/z] new=z dup=z err=z[cyx-xzxk] DONE: +z new, z dup, z erru   æ–°å¢ž: )r,   ÚrequestsÚSessionÚrangeÚ	MAX_PAGESr_   Ú	LIST_PATHrW   rg   rC   r   ÚextendrB   ÚtimeÚsleepr   ÚDATE_CUTOFFr7   rP   rQ   rR   r�   rS   rK   ÚcommitÚclose)r+   rT   Ú	all_itemsÚpagerU   ra   rb   rJ   Ú	new_countÚ	dup_countÚ	err_countÚidxrD   Údate_strrV   Úd_titlerF   r�   s                     r   Úmainr¨   µ   s}  € Ü‹:€DÜ×ÑÓ €GØ€IÜ�aœ Q™Ó'ò ˆØ�1Š9Ü�Fœ9˜+ UÐ+‰Cä�Fœ9˜+ d V¨5Ð1ˆCð		Ü˜g sÓ+ˆIÜ˜yÓ)ˆEÜÐ$ T F¨"¬S°«Z¨L¸Ð?Ô@ÙÙØ×Ñ˜UÔ#ô 	�
‰
�3�ðô" 
Ð!¤# i£.Ð!1°Ð
=Ô>Ø()Ð)€IÐ)�	˜IÜ'0°¸AÓ'>ò aÑ#ˆÑ#ˆe�S˜(ð	0Ù˜H¤{Ò2ØÜ�d˜CÔ Ø˜Q‘�	ØØ—;‘;˜s¬G¸R�;Ó@ˆDØ#ˆDŒMÜ)5°d·i±iÀÓ)GÑ&ˆG�W˜hÙØ#�Ü˜4 ¨#¨x¸ÔAØ˜Q‘‘	à˜Q‘�	ð 	�‰ŒÜ�
‰
�3ŒØ�‰8�q‹=Ü�C˜�u˜Aœc )›nÐ-¨V°I°;¸eÀIÀ;ÈeÐT]ÐS^Ð_Õ`ð-að0 	‡J�J„LÜ	Ð˜y˜k¨°	¨{¸&ÀÀÈ4Ð
PÔQÜ	ˆH�Y�KÐ
 Õ!øôC ò 	Ü�N 4 &¨¨1¨#Ð.Ô/Ü�J‰J�q�MŠMûð	ûô. ò 	0Ø˜‰NˆIÜ�H˜U 3 B˜Z˜L¨¨1¨#Ð.×/Ñ/ûð	0úsC   Á4G-ÂG-Ã1H*Ã=H*ÄAH*Ç-	H'Ç6&H"È"H'È*	IÈ3IÉIÚ__main__)0Ú__doc__Úosr/   Úsysr%   r›   ÚhtmlÚhtml_modÚsocketr   r   Úurllib.parser   r•   Úbs4r   r	   r   Úgetaddrinfor
   r   ÚenvironÚ
setdefaultr   r   r˜   rC   Úgetenvr'   r_   r™   r>   r?   r@   ÚnowÚstrftimer�   rQ   r,   r3   r7   rK   rW   rg   r‰   r�   r¨   Ú__name__© r   r   ú<module>rº      s/  ðñ÷ <× ;× ;Ó ;ß (Ý  Û Ý ð €Ø€	Ø×&Ñ&Ð ò4ð
 *€Ô Ø ‡
�
× Ñ Ð*¨BÔ /ò
ñ ˜Ÿ™  ˜Ó%€	Ù Ð˜i˜[Ð)Ô *à
ˆ"�)‰)�KÐ!6Ó
7€Ø€Ø;€	Ø*€	Ø€Ø€
Ý àˆx�|‰|‹~¡	¨uÔ 5Ñ5×?Ñ?À
ÓK€ð Ðð€òòògòò6ò
ò#(òJ$ò$1"ðf ˆzÒÙ…Fð r   