Ë
    P¦~jF*  ã                   óN  — 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mZ dZdZdZd	Zd
Z ej&                  «        e	d¬«      z
  j)                  d«      Zej,                  j/                  dd«      ZddiZd„ Zd„ Zd!d„Zd„ Zd„ Zd„ Zd"d„Z e!dk(  rƒejD                  dd Z#dZ$dZ%ddjM                  e#«      v r7 e' ejP                  ddjM                  e#«      «      jS                  d«      «      Z$de#v re#e#jU                  d«      dz      Z% e e$e%¬ «       yy)#u?  
æ˜Œé‚‘å¸‚äººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š (changyi.gov.cn/CYDT/TZGG)
CMS: JPAAS (è¯¦æƒ… tYYYYMMDD_ID.html, ?page=N åˆ†é¡µ)
åˆ—è¡¨: a[href=.../YYYYMM/tYYYYMMDD_ID.html]
åˆ†é¡µ: ?page=2 ...
è¯¦æƒ…: æ­£æ–‡ div.art-con (å†…å�« TRS_Editor), æ ‡é¢˜ .art-title
ç”¨æ³•: python3 crawl_changyi_tzgg.py [--pages=N] [--json out.jsonl]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinu"   æ˜Œé‚‘å¸‚äººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Šzhttp://www.changyi.gov.cnz$http://www.changyi.gov.cn/CYDT/TZGG/zwww.changyi.gov.cnu   å±±ä¸œiG  )Údaysz%Y-%m-%dÚDB_PATHz/root/search.dbz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú'/root/gov_crawler/crawl_changyi_tzgg.pyÚlogr      s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 ó´   — t        j                  dd| xs d«      } t        j                  dd| «      } t        j                  dd| «      j                  «       } | S )Nz&nbsp;|&#160;|\u200b|\ufeffÚ z\s+ú u   \.\.\.|â€¦$)ÚreÚsubÚstrip)Úts    r   Úclean_titler      sK   € Ü
�‰Ð-¨r°1²7¸Ó;€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰ˆ~˜r 1Ó%×+Ñ+Ó-€AØ€Hr   c                 ó`   — t        j                  | t        |¬«      }d|_        |j                  S )N)ÚheadersÚtimeoutúutf-8)ÚrequestsÚgetÚHEADERSÚencodingÚtext)Úurlr   Úrs      r   Úfetchr%   %   s$   € Ü�‰�S¤'°7Ô;€AØ€A„JØ�6‰6€Mr   c                 ó,  — t        | d«      }g }|j                  dd¬«      D ]¯  }|j                  dd«      }d|vsd|vrŒt        |j	                  d¬	«      «      }|sŒ<d}t        j                  d
|«      }|r7|j                  d«      › d|j                  d«      › d|j                  d«      › �}|j                  |t        t        |«      |dœ«       Œ± t        «       }g }	|D ]/  }
|
d   |vsŒ|j                  |
d   «       |	j                  |
«       Œ1 |	S )Núhtml.parserÚaT©Úhrefr*   r   z/t20z.html©r   z(20\d{2})(\d{2})(\d{2})é   ú-é   é   )Útitler#   Úpub_dater#   )r   Úfind_allr   r   Úget_textr   ÚsearchÚgroupÚappendr   ÚLIST_URLÚsetÚadd)ÚhtmlÚsoupÚitemsr(   r*   r0   r1   ÚmÚseenÚuniqÚits              r   Ú
parse_listrA   +   s  € Ü˜˜}Ó-€DØ€EØ�]‰]˜3 Tˆ]Ó*ò ]ˆØ�u‰u�V˜RÓ ˆØ˜Ñ °Ñ!4ØÜ˜AŸJ™J¨T˜JÓ2Ó3ˆÙØØˆÜ�I‰IÐ0°$Ó7ˆÙØŸ'™' !›*˜ Q q§w¡w¨q£z l°!°A·G±G¸A³J°<Ð@ˆHØ�‰˜u¬W´X¸tÓ-DÐRZÑ[Õ\ð]ô ‹5€DØ€DØò ˆØˆe‰9˜DÒ Ø�H‰H�R˜‘YÔØ�K‰K˜�Oðð €Kr   c                 óÊ  — ddddœ}t        | d«      }|j                  dddi¬«      }|r"|j                  d«      rt        |d   «      |d	<   |d	   s3|j                  d
d¬«      }|rt        |j	                  d¬«      «      |d	<   |d	   s1|j                  d	«      }|rt        |j	                  d¬«      «      |d	<   |j                  dddi¬«      }|r|j                  d«      r|d   d d |d<   |d   s/t        j                  d| d d «      }|r|j                  d«      |d<   |j                  dd¬«      }|s|j                  dd„ ¬«      }|rt        t        |«      «      |d<   |S )Nr   ©r0   Úpublish_dateÚcontentr'   ÚmetaÚnameÚArticleTitle)ÚattrsrE   r0   Úh4z	art-title)Úclass_Tr+   ÚPubDateé
   rD   z20\d{2}-\d{2}-\d{2}i@  r   Údivzart-conc                 ó   — | xr d| xs dv S )NÚ
TRS_Editorr   © )Úcs    r   ú<lambda>zparse_detail.<locals>.<lambda>Z   s   € ¸Ò8W¸lÈqÊwÐTVÐ>W€ r   )
r   Úfindr   r   r3   r   r4   r5   Úextract_clean_textÚstr)	r:   Úresultr;   Ú
meta_titlerJ   Ú	title_tagÚ	meta_dater=   Úcontent_divs	            r   Úparse_detailr\   C   sn  € Ø¨2¸"Ñ=€FÜ˜˜}Ó-€DØ—‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ü% j°Ñ&;Ó<ˆˆw‰Ø�'Š?Ø�Y‰Y�t KˆYÓ0ˆÙÜ)¨"¯+©+¸D¨+Ó*AÓBˆF�7‰OØ�'Š?Ø—I‘I˜gÓ&ˆ	ÙÜ)¨)×*<Ñ*<À4Ð*<Ó*HÓIˆF�7‰OØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø!*¨9Ñ!5°c°rÐ!:ˆˆ~ÑØ�.Ò!Ü�I‰IÐ,¨d°5°D¨kÓ:ˆÙØ%&§W¡W¨Q£ZˆF�>Ñ"Ø—)‘)˜E¨)�)Ó4€KÙØ—i‘i Ñ.W�iÓXˆÙÜ.¬s°;Ó/?Ó@ˆˆyÑØ€Mr   c           	      óÎ  ‡— | syt        | d«      }|j                  ddg«      D ]  }|j                  «        Œ |j                  d«      D ]9  }|j                  dd«      Št	        ˆfd„dD «       «      sŒ*|j                  «        Œ; |j                  d	d
¬«      D ]Ë  }|j                  dd«      j                  «       }|j                  d
¬«      xs5 t        j                  j                  |j                  d«      d   «      xs d}|r|j                  d«      r|j                  «        Œ�t        t        |«      }|j                  d	|d¬«      }||_        |j#                  |«       ŒÍ |j                  g d¢«      D ]  }|j                  «        Œ g }	|j                  d«      D ]É  }
|
j%                  d	d
¬«      }|sŒ|
j'                  d«      rŒ+|j                  dd«      j                  «       }|j                  d
¬«      xs5 t        j                  j                  |j                  d«      d   «      xs d}|sŒ—|j                  d«      rŒ©|	j)                  |t        t        |«      f«       ŒË |j                  d«      D ]8  }
|
j%                  d	d
¬«      sŒ|
j'                  d«      rŒ)|
j                  «        Œ: |j                  ddg«      D ]9  }|j                  d
¬«      rŒ|j%                  g d¢«      rŒ*|j                  «        Œ; ddlm} g }|j                  ddg«      D �]J  }|j.                  dk(  r|j)                  t1        |«      «       Œ.|j.                  dk(  sŒ>|j'                  d«      rŒPg }|j2                  D ]²  }t5        |dd«      }|dk(  rB|j                  dd«      Št	        ˆfd„dD «       «      rŒ<|j)                  t1        |«      «       ŒW|dv r|j)                  t1        |«      «       Œv|r|j)                  t1        |«      «       Œ“|j)                   |t1        |«      «      «       Œ´ dj7                  |«      j                  «       }|s�Œ6|j)                  d |› d!�«       �ŒM t9        «       }|	D ]7  \  }}||f}||v rŒ|j;                  |«       |j)                  d"|› d#|› d$�«       Œ9 |j                  dd%g«      D �]o  }|j'                  d«      r|j.                  dk(  rŒ%|j%                  g d&¢«      rŒ9dj7                  d'„ |j2                  D «       «      j                  «       }|r)t=        |«      d(k\  r|j)                  d  ||«      › d!�«       |j                  d	d
¬«      D ]Æ  }|j                  dd«      j                  «       }|j                  d
¬«      xs5 t        j                  j                  |j                  d«      d   «      xs d}|sŒo|j                  d«      rŒ�|t        t        |«      f}||v rŒ˜|j;                  |«       |j)                  d"|d)   › d#|d   › d$�«       ŒÈ �Œr |rd*j7                  |«      S  || «      j                  «       S )+uÛ   è¾“å‡ºçº¯ HTMLï¼šæ®µè�½ <p>ã€�é“¾æŽ¥ <a href target=_blank>ã€�è¡¨æ ¼ä¿�ç•™ã€�å›¾ç‰‡ <img>ã€�é™„ä»¶ç‹¬ç«‹æˆ�æ®µã€‚
    ç¦�æ­¢æ··å�ˆæ ¼å¼�ï¼ˆçº¯æ–‡æœ¬ + åŽŸå§‹ HTML ä¼šè§¦å�‘ search_app HTML åˆ†æ”¯å¯¼è‡´æ�¢è¡ŒæŠ˜å� ï¼‰ã€‚r   r'   ÚscriptÚstyleÚimgÚsrcc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©NrQ   ©Ú.0ÚkÚsrc0s     €r   ú	<genexpr>z%extract_clean_text.<locals>.<genexpr>k   s   øè ø€ Òa˜Qˆq�DŒyÑaùs   ƒ)z
un-collectÚcollectÚshareÚfaviconÚqrcodeÚewmr(   Tr)   r*   r+   ú?r   u   é™„ä»¶)zjavascript:ú#Ú_blank)r*   Útarget)ÚspanÚbÚstrongÚfontÚemÚiÚuÚsÚliÚtablerN   Úp)r`   r{   r(   )ÚescaperG   Nc              3   óB   •K  — | ]  }|‰j                  «       v –— Œ y ­wrc   )Úlowerrd   s     €r   rh   z%extract_clean_text.<locals>.<genexpr>—   s   øè ø€ Ò[°˜1 §
¡
£Ô,Ñ[ùs   ƒ)z.gifÚicon16ÚfileÚattach)r(   r{   Úbrz<p>z</p>z<p><a href="z" target="_blank">z</a></p>Útd)r|   r{   Úulc              3   óT   K  — | ]   }t        |t        «      sŒt        |«      –— Œ" y ­wrc   )Ú
isinstancerV   )re   rR   s     r   rh   z%extract_clean_text.<locals>.<genexpr>±   s   è ø€ ÒL A¼ÀAÄsÕ9Kœ˜QŸÑLùs   ‚(˜(r.   r,   z

)r   r2   Ú	decomposer   Úanyr   r3   ÚosÚpathÚbasenameÚsplitÚ
startswithÚunwrapr   ÚBASE_URLÚnew_tagÚstringÚreplace_withrT   Úfind_parentr6   r:   r}   rG   rV   ÚcontentsÚgetattrÚjoinr8   r9   Úlen)Úcontent_htmlr;   Útagr`   Úa_tagr*   r"   Úfull_urlÚnew_aÚattach_linksrz   Úa_inr}   ÚpartsÚelÚinnerrR   rG   r   Úseen_ar#   ÚkeyrN   Údirectrg   s                           @r   rU   rU   `   sš  ø€ ñ ØÜ˜ }Ó5€DØ�}‰}˜h¨Ð0Ó1ò ˆØ�‰�ðð �}‰}˜UÓ#ò ˆØ�w‰w�u˜bÓ!ˆÜÓaÐ"`ÔaÕaØ�M‰M�Oðð
 —‘˜s¨�Ó.ò 	"ˆØ�y‰y˜ Ó$×*Ñ*Ó,ˆØ�~‰~ Dˆ~Ó)Ò]¬R¯W©W×-=Ñ-=¸d¿j¹jÈ»oÈaÑ>PÓ-QÒ]ÐU]ˆÙ�t—‘Ð';Ô<Ø�L‰LŒNØÜœ8 TÓ*ˆØ—‘˜S x¸�ÓAˆØˆŒØ×Ñ˜5Õ!ð	"ð �}‰}ÒQÓRò ˆØ�
‰
�ðð €LØ�m‰m˜DÓ!ò EˆØ�w‰w�s ˆwÓ&ˆÚ˜Ÿ™ wÕ/Ø—8‘8˜F BÓ'×-Ñ-Ó/ˆDØ—=‘= t�=Ó,Ò`´·±×0@Ñ0@ÀÇÁÈCÃÐQRÑASÓ0TÒ`ÐX`ˆDÚ˜DŸO™OÐ,@ÕAØ×#Ñ# T¬7´8¸TÓ+BÐ$CÕDðEð �m‰m˜DÓ!ò ˆØ�7‰7�3˜Tˆ7Õ"¨2¯>©>¸'Õ+BØ�L‰L�Nðð �}‰}˜e S˜\Ó*ò ˆØ�|‰| $ˆ|Õ'°·±Ò9NÕ0OØ�M‰M�Oðõ Ø€EØ�m‰m˜W c˜NÓ+ó ,ˆØ�7‰7�gÒØ�L‰Lœ˜R›Õ!Ø�W‰W˜‹^ B§N¡N°7Õ$;àˆEØ—[‘[ò 1�Ü˜q &¨$Ó/�Ø˜5’=ØŸ5™5 ¨Ó+�DÜÓ[Ð6ZÔ[Ô[Ø Ø—L‘L¤ Q£Õ(ØÐ1Ñ1Ø—L‘L¤ Q£Õ(ÙØ—L‘L¤ Q£Õ(à—L‘L¡¬¨A«£Õ0ð1ð —‘˜“×$Ñ$Ó&ˆAÛØ—‘˜s 1 # T˜]Ö+ð+,ô. ‹U€FØ!ò K‰	ˆˆcØ�SˆkˆØ�&‰=ØØ�
‰
�3ŒØ�‰�| C 5Ð(:¸4¸&ÀÐIÕJðKð �}‰}˜e T˜]Ó+ó XˆØ�?‰?˜7Ô#¨¯©°EÒ(9ØØ�8‰8Ò(Ô)ØØ—‘ÑL¨¯©ÔLÓL×RÑRÓTˆÙ”c˜&“k QÒ&Ø�L‰L˜3™v f›~Ð.¨dÐ3Ô4à—L‘L ¨4�LÓ0ò 	XˆDØ—8‘8˜F BÓ'×-Ñ-Ó/ˆDØ—=‘= t�=Ó,Ò`´·±×0@Ñ0@ÀÇÁÈCÃÐQRÑASÓ0TÒ`ÐX`ˆDÚ˜DŸO™OÐ,@ÕAØœW¤X¨tÓ4Ð5�Ø˜&‘=ØØ—
‘
˜3”Ø—‘˜|¨C°©F¨8Ð3EÀcÈ!ÁfÀXÈXÐVÕWò	XðXñ$ "'ˆ6�;‰;�uÓÐH©F°<Ó,@×,FÑ,FÓ,HÐHr   r,   c                 óª  — t        d| › dt        › �«       g }t        «       }t        d| dz   «      D ]¬  }|dk(  rt        n
t        › d|› �}	 t        |«      }t        |«      }d}	|D ]4  }
|
d   |vsŒ|j                  |
d   «       |j                  |
«       |	dz  }	Œ6 t        d|› d	t        |«      › d
|	› dt        |«      › �«       |s nt        j                  d«       Œ® g }t        |d«      D ]ž  \  }}
|
d   r|
d   t        k  rŒ	 t        |
d   «      }t        |«      }|j                  |d   xs |
d   |
d   |d   xs |
d   |d   t        ddœ«       |dz  dk(  rt        d|› dt        |«      › �«       t        j                  d«       Œ  |rct!        |dd¬«      5 }|D ]+  }|j#                  t%        j&                  |d¬«      d z   «       Œ- 	 d d d «       t        d!t        |«      › d"|› �«       y t)        j*                  t,        «      }|j/                  d#«       |j1                  «       }dx}}|D ]W  }	 |j/                  d$|d%   |d&   |d&   |d   |d   |d   |d   xs dd d' |d(   d)f	«       |j2                  dkD  r|dz  }n|dz  }ŒY |j5                  «        |j7                  «        t        d+|› d,|› d-�«       y # t        $ r}t        d|› d|› �«       Y d }~ �Œd }~ww xY w# t        $ r(}t        d|
d   dd  › d|› �«       ddddœ}Y d }~�Œöd }~ww xY w# 1 sw Y   �ŒOxY w# t        $ r}t        d*|› �«       |dz  }Y d }~�Œd }~ww xY w).NzCrawl pages=z cutoff=r,   z?page=ÚPz ERR: r   r#   z: z items (z new), total gš™™™™™é?r1   z	  detail iØÿÿÿr   rC   r0   rD   rE   u   é€šçŸ¥å…¬å‘Š)r0   Úpage_urlrD   rE   Ú	site_nameÚcolumnrM   z  ú/gš™™™™™Ù?Úwr   )r!   F)Úensure_asciiú
zJSONL: z
 items -> zPRAGMA busy_timeout=10000z˜INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, content, summary, category, script_name) VALUES (?,?,?,?,?,?,?,?,?)r©   r¨   iô  rª   zcrawl_changyi_tzgg.pyz
DB error: zResult: z new, z skipped)r   ÚCUTOFFr8   Úranger7   r%   Ú	ExceptionrA   r9   r6   r˜   ÚtimeÚsleepÚ	enumerater\   r   ÚopenÚwriteÚjsonÚdumpsÚsqlite3Úconnectr   ÚexecuteÚcursorÚrowcountÚcommitÚclose)ÚpagesÚjson_outÚ	items_allr>   r|   r#   r:   Úer<   Únewr@   ÚenrichedÚidxÚdetailÚfÚitemÚconnrR   ÚstoredÚskippeds                       r   ÚcrawlrÍ   Á   s»  € Üˆ,�u�g˜X¤f XÐ.Ô/Ø€IÜ‹5€DÜ�1�e˜a‘iÓ ò ˆØ˜qš&�h¬¨
°&¸¸Ð&<ˆð	Ü˜“:ˆDô ˜4Ó ˆØˆØò 	ˆBØ�%‰y Ò$Ø—‘˜˜E™Ô#Ø× Ñ  Ô$Ø�q‘‘ð		ô
 	ˆa�ˆs�"”S˜“Z�L ¨¨¨]¼3¸y»>Ð:JÐKÔLÙÙÜ�
‰
�3�ð#ð& €HÜ˜Y¨Ó*ò ‰ˆˆRØˆjŠ>˜b ™n¬vÒ5Øð	FÜ˜˜E™Ó#ˆDÜ! $Ó'ˆFð 	�‰Ø˜G‘_Ò3¨¨7©Ø˜5™	Ø" >Ñ2ÒD°b¸±nØ˜iÑ(Ü"Ø$ñ
ô 	ð �‰8�qŠ=Ü�"�S�E˜œ3˜y›>Ð*Ð+Ô,Ü�
‰
�3�ð'ñ* Ü�(˜C¨'Ô2ð 	E°aØ ò E�Ø—‘œŸ
™
 4°eÔ<¸tÑCÕDñE÷	Eô 	ˆg”c˜(“m�_ J¨x¨jÐ9Ô:Øä�?‰?œ7Ó#€DØ‡L�LÐ,Ô-Ø�‰‹€AØÐ€FˆWØò ˆð	Ø�I‰Ið.ð �kÑ" D¨Ñ$4°d¸:Ñ6FØ�g‘  ^Ñ 4°d¸9±oØ�y‘/Ò' R¨¨#Ð.°°X±Ð@WðYô	Zð �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3øôE ò 	Ü�!�A�3�f˜Q˜CÐ Ô!Þûð	ûô, ò 	FÜ�)˜B˜u™I c d˜OÐ,¨F°1°#Ð6Ô7Ø!°2À"ÑEŽFûð	Fú÷ 	Eñ 	Eûô. ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰LŽGûð	úsU   ÁKÄK*Æ1LÈ8AL+Ë	K'Ë
K"Ë"K'Ë*	LË3LÌLÌL(Ì+	MÌ4MÍMÚ__main__é   z--pages=r   z--pages=(\d+)z--json)rÀ   rÁ   )é   )r,   N)+Ú__doc__r   ÚsysrŠ   r·   r²   r¹   r   r   r   Úbs4r   Úurllib.parser   r   r�   r7   ÚDOMAINÚGROUPÚnowÚstrftimer¯   Úenvironr   r   r    r   r   r%   rA   r\   rU   rÍ   Ú__name__ÚargvÚargsrÀ   rÁ   r—   Úintr4   r5   ÚindexrQ   r   r   ú<module>rß      s7  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  à0€	Ø&€Ø1€Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€Øð  Kð  L€ò.òóòò0ò:^IóBJ4ðZ ˆzÒØ�8‰8�A�Bˆ<€DØ€EØ€HØ�S—X‘X˜d“^Ñ#Ù�I�B—I‘IÐ.°·±¸³Ó?×EÑEÀaÓHÓIˆØ�4ÑØ˜Ÿ
™
 8Ó,¨qÑ0Ñ1ˆÙ	� Ö)ð r   