Ë
    d-Œ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 eej                   dd «      Z ede› �«        ej&                  d	d
«      ZdZdZdZdZe› d�ZdZ ej6                  «        e	d¬«      z
  j9                  d«      ZdZdddœZ ej@                  ejB                  dd¬«        ejD                  e#«      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.yanting.gov.cn/yanting/c118277/list.shtml
CMS: è‡ªå®šä¹‰ AJAX APIé©±åŠ¨ (å�Œ crawl_yanting.py c118536)
API: /common/search/{channelId}?page=N&_pageSize=20&_isAgg=true&_isJson=true&_template=index
åˆ—è¡¨JSON: {data: {total, results: [{title, url, publishedTimeStr}]}}
è¯¦æƒ…: <h1>æ ‡é¢˜, <div class="article-content">æ­£æ–‡

ç”¨æ³•:
  python3 crawl_yanting_jkq.py --pages=1     # å¢žé‡�: å‰�1é¡µ
  python3 crawl_yanting_jkq.py --pages=5     # é¦–æ‰¹å‰�5é¡µ
é    N)ÚdatetimeÚ	timedelta)Úurljoin)ÚBeautifulSoupc                 ó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      ú&/root/gov_crawler/crawl_yanting_jkq.pyÚ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   z[yanting-jkq] max_pages=Ú	SEARCH_DBz/mnt/data/search.dbzhttps://www.yanting.gov.cnu   ç›�äº­åŽ¿-ç»�å¼€åŒºå»ºè®¾u   ç»�å¼€åŒºå»ºè®¾u   å››å·�z//common/search/2769e005b69c4a48a96321df48ac10f6é   iG  )Údaysz%Y-%m-%dg333333Ó?zkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36zapplication/json)ú
User-AgentÚAcceptz'[%(asctime)s] %(levelname)s %(message)sz%H:%M:%S)ÚlevelÚformatÚdatefmtc                  óª   — 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(   7   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;Ú z&nbsp;z&ensp;z&emsp;z[\u200b\u200c\u200d\ufeff])ÚreplaceÚreÚsubÚstrip)Úts    r   Úclean_titler0   >   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_dupr4   E   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©r.   éÈ   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_yanting_jkq.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'   Útitler3   Úpublish_dateÚcontentÚ	date_rankÚplainÚcurÚes	            r   Úinsert_itemrH   H   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Ø#¤Z°hÀ7Â=ÈbÑ6Q±ÐWXðZó	
ˆð �<‰<˜!Òð-Ø—‘ØYØœI uÐ-ôð Øøô ò -Ü˜¨ sÐ+×,Ð,Øûð-ûô ò ÜÐ" 1 #Ð&Ô'Üûðús=   ÁAC
 ÂB& Â&	CÂ/CÂ=C
 ÃCÃC
 Ã
	C+ÃC&Ã&C+c                 óÒ   — 	 t        j                  | dt        ¬«      }d|_        |j	                  «       S # t
        $ r(}t        j                  d| d d › d|› �«       Y d }~y d }~ww xY w)Né   ©r    Úheadersúutf-8u   JSONè¯·æ±‚å¤±è´¥ é<   ú: )ÚrequestsÚgetÚHEADERSÚencodingÚjsonr?   ÚlogÚerror©ÚurlÚrrG   s      r   Ú
fetch_jsonrZ   c   s^   € ðÜ�L‰L˜ b´'Ô:ˆØˆŒ
Ø�v‰v‹xˆøÜò Ü�	‰	Ð% c¨#¨2 h Z¨r°!°Ð5Ô6Üûðús   ‚25 µ	A&¾A!Á!A&c                 óÔ   — 	 t        j                  | ddt        d   i¬«      }d|_        |j                  S # t
        $ r(}t        j                  d| d d › d|› �«       Y d }~y d }~ww xY w)NrJ   r   rK   rM   u   è¯·æ±‚å¤±è´¥ rN   rO   )rP   rQ   rR   rS   Útextr?   rU   rV   rW   s      r   Úfetchr]   l   se   € ðÜ�L‰L˜ b°<ÄÈÑAVÐ2WÔXˆØˆŒ
Ø�v‰vˆøÜò Ü�	‰	�M # c r ( ¨2¨a¨SÐ1Ô2Üûðús   ‚36 ¶	A'¿A"Á"A'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 )uQ   æ��å�–æ­£æ–‡: ä¿�ç•™è¡¨æ ¼HTMLã€�é™„ä»¶é“¾æŽ¥ç»�å¯¹åŒ–ã€�æ®µè�½åˆ†éš”ã€�åŽ»é‡�å¤�r7   )ÚscriptÚstyleÚnoscriptr`   zdisplay\s*:\s*none)Úattrsr   ÚhrefÚimg)ÚpÚtableÚdivÚliÚh1Úh2Úh3Úh4Útrre   rf   Tr8   )re   rg   rh   ri   rj   rk   rl   rg   z

éÿÿÿÿ)r   ÚstrÚfind_allÚ	decomposer,   ÚcompileÚIrQ   r   ÚBASE_URLÚfindÚnameÚfind_parentr:   ÚappendÚjoinr   r.   )ÚnodeÚsoupÚtagr   rc   rd   ÚpartsÚelr\   rC   ÚsegsÚdedupedÚss                r   Úextract_contentr‚   u   sÊ  € äœ˜T› MÓ2€DØ�}‰}Ò<Ó=ò ˆØ�‰�ðà�}‰} G¬R¯Z©ZÐ8MÌrÏtÉtÓ-TÐ#Uˆ}ÓVò ˆØ�‰�ðà�]‰]˜3Óò ˆØ�u‰u�V‹}ˆÙÜ¤¨$Ó/ˆ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                 ó  — t        | d«      }|j                  d«      }|rt        |j                  d¬«      «      nd}t	        j
                  d| «      }|r|j                  d«      nd}d}|j                  d«      }|rt        |«      }|||fS )	Nr7   ri   Tr8   r*   z(\d{4}-\d{2}-\d{2})r   z.article-content)	r   ru   r0   r:   r,   ÚsearchÚgroupÚ
select_oner‚   )	Úhtmlr3   r{   ri   rA   ÚmÚpub_daterC   Úcontent_divs	            r   Úparse_detailr‹   ›   s„   € Ü˜˜}Ó-€DØ	�‰�4‹€BÙ46ŒK˜Ÿ™¨$˜Ó/Ô0¸B€EÜ
�	‰	Ð(¨$Ó/€AÙˆq�w‰w�qŒz B€HØ€GØ—/‘/Ð"4Ó5€KÙÜ! +Ó.ˆØ�(˜GÐ#Ð#r   c                  óä  — t        «       } dx}x}}t        t        › dt        › d�«      }|r|j	                  d«      s!t
        j                  d«       t        d«       y |d   j	                  dd«      }|t        z   dz
  t        z  }t        |t        «      }t
        j                  d	|› d
|› d|› d�«       g }|d   j	                  dg «      D ][  }	|j                  |	j	                  dd«      t        t        |	j	                  dd«      «      |	j	                  d«      xs dd d dœ«       Œ] t        d|dz   «      D ]¾  }
t        j                   t"        «       t        t        › dt        › d|
› �«      }|r|j	                  d«      s nu|d   j	                  dg «      D ][  }	|j                  |	j	                  dd«      t        t        |	j	                  dd«      «      |	j	                  d«      xs dd d dœ«       Œ] ŒÀ t
        j                  dt%        |«      › d�«       t'        |«      D �]
  \  }}	|	d   r2|	d   t(        k  r&t
        j                  d|	d   d d › d|	d   › d�«       Œ>t+        | |	d   «      r|dz  }ŒSt
        j                  d|dz   › dt%        |«      › d |	d   d d! › d"�«       t-        |	d   «      }|r^t/        ||	d   «      \  }}}|xs |	d   |	d<   |xs |	d   |	d<   t1        | |	d   |	d   |	d   |«      r|dz  }n|dz  }| j3                  «        t        j                   t"        «       �Œ | j5                  «        t
        j                  d#|› d$|› d%|› �«       t        d&|› �«       y )'Nr   z$?_isAgg=true&_isJson=true&_pageSize=z&_template=index&page=1Údatau   APIè¯·æ±‚å¤±è´¥u	   æ–°å¢ž: 0Útotalr   u   å…± u    æ�¡, u
    é¡µ, çˆ¬ u    é¡µÚresultsrA   r*   rX   ÚpublishedTimeStré
   )rA   r3   rB   é   z&_template=index&page=u
   å…±æ”¶é›† u    æ�¡rB   u     è·³è¿‡(æ—¥æœŸè¿‡æ—§): é(   z (ú)r3   u
     è¯¦æƒ… [ú/z]: é2   z...u   å®Œæˆ�: saved=z
, skipped=z, err=u   æ–°å¢ž: )r(   rZ   ÚAPI_URLÚ	PAGE_SIZErQ   rU   rV   r@   ÚminÚ	MAX_PAGESÚinforx   r   rt   ÚrangeÚtimeÚsleepÚREQUEST_DELAYr   r
   ÚDATE_CUTOFFr4   r]   r‹   rH   ÚcommitÚclose)r'   Útotal_savedÚtotal_skippedÚ	total_errÚdata1Útotal_recordsÚtotal_pagesÚpagesÚall_articlesÚitemÚpager�   r   r‡   rA   r‰   rC   s                    r   Úmainr­   §   sˆ  € Ü‹:€DØ./Ð/€KÐ/�- )äœ'˜Ð"FÄyÀkÐQhÐiÓj€EÙ˜Ÿ	™	 &Ô)Ü�	‰	Ð#Ô$ÜˆkÔØà˜&‘M×%Ñ% g¨qÓ1€MØ ¤9Ñ,¨qÑ0´YÑ>€KÜ�œYÓ'€EÜ‡H�Hˆt�M�? &¨¨°ZÀ¸wÀdÐKÔLà€LØ�f‘×!Ñ! )¨RÓ0ò ˆØ×ÑØ—X‘X˜g rÓ*Ü¤¨$¯(©(°5¸"Ó*=Ó>Ø!ŸX™XÐ&8Ó9Ò?¸RÀÀ"ÐEñ
õ 	ðô �a˜ ™Ó#ò 
ˆÜ�
‰
”=Ô!ÜœW˜IÐ%IÌ)ÈÐTjÐkoÐjpÐqÓrˆÙ˜4Ÿ8™8 FÔ+ÙØ˜‘L×$Ñ$ Y°Ó3ò 	ˆDØ×ÑØŸ™ '¨2Ó.Ü#¤H¨d¯h©h°u¸bÓ.AÓBØ!%§¡Ð*<Ó!=Ò!CÀÀSÀbÐ Iñ!õ ñ	ð
ô ‡H�Hˆzœ#˜lÓ+Ð,¨DÐ1Ô2ä˜\Ó*ó "‰ˆˆ4Ø�Ò D¨Ñ$8¼;Ò$FÜ�H‰HÐ/°°W±¸c¸rÐ0BÐ/CÀ2ÀdÈ>ÑFZÐE[Ð[\Ð]Ô^ØÜ�$˜˜ZÑ(Ô)Ø˜QÑˆMØÜ�‰�:˜a ™c˜U !¤C¨Ó$5Ð#6°c¸$¸w¹-ÈÈÐ:LÐ9MÈSÐQÔRÜ�T˜*Ñ%Ó&ˆÙÜ'3°D¸$¸zÑ:JÓ'KÑ$ˆE�8˜WØ!Ò2 T¨'¡]ˆD�‰MØ#+Ò#C¨t°NÑ/CˆD�Ñ Ü˜4  g¡°°ZÑ0@À$À~ÑBVÐX_Ô`Ø˜qÑ ‘à Ñ"�Ø�K‰KŒMÜ�
‰
”=Ö!ð%"ð( 	‡J�J„LÜ‡H�Hˆ~˜k˜]¨*°]°OÀ6È)ÈÐUÔVÜ	ˆH�[�MÐ
"Õ#r   Ú__main__).Ú__doc__ÚsysÚosr,   r�   rT   Úloggingr!   r   r   Úurllib.parser   rP   Úbs4r   r   r   rš   r@   Úgetenvr#   rt   r;   r<   r=   r—   r˜   ÚnowÚstrftimer    rŸ   rR   ÚbasicConfigÚINFOÚ	getLoggerÚ__name__rU   r(   r0   r4   rH   rZ   r]   r‚   r‹   r­   © r   r   ú<module>r½      s1  ðñ÷ 1× 0× 0Ó 0ß (Ý  ã Ý ò
ñ ˜Ÿ™  ˜Ó%€	Ù Ð   Ð,Ô -à
ˆ"�)‰)�KÐ!6Ó
7€Ø'€Ø'€	Ø€Ø€
ØˆJÐEÐ
F€Ø€	Øˆx�|‰|‹~¡	¨uÔ 5Ñ5×?Ñ?À
ÓK€Ø€ð @Ø ñ€ð
 €× Ñ ˜'Ÿ,™,Ð/XÐblÕ mØ€g×Ñ˜Ó!€òòògòò6òò$(òL
$ò;$ðz ˆzÒÙ…Fð r   