Ë
    �4„jo%  ã                   ó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dlmZ dZdZd	Z ej&                  «        e	d
¬«      z
  j)                  d«      Zej,                  j/                  dd«      ZddddddddddddœZddiZd„ Zd„ Zd„ Zd „ Zd/d!„Zd0d#„Z e!d$k(  röejD                  d%d Z#d"Z$dZ%dZ&d&d'jO                  e#«      v r7 e( ejR                  d(d'jO                  e#«      «      jU                  d%«      «      Z$d)d'jO                  e#«      v r] ejR                  d*d'jO                  e#«      «      jU                  d%«      Z+e+d+k7  re+jY                  d,«      n e-ej]                  «       «      Z&d-e#v re#e#j_                  d-«      d%z      Z% e e&e$e%¬.«       yy)1um  
ä»ªå¾�å¸‚ä¹¡é•‡äººæ°‘æ”¿åºœ - é€šçŸ¥å…¬å‘Š Ã—11 (yizheng.gov.cn/zfxxgk/yqxzbmxxgkml/yqxz/<é•‡>/fdzdgknr/tzgg/)
CMS: ç¿°Web/unitbuild JS æ¸²æŸ“ (Playwright å¿…é¡»)
åˆ—è¡¨: Playwright æ¸²æŸ“ + ç‚¹å‡»ç¿»é¡µ (å…±~22é¡µ/é•‡, æ–°è§„å�ªæŠ“å‰�5é¡µ)
åˆ—è¡¨é¡¹: a href=".../tzgg/art/2026/art_{md5}.html"
è¯¦æƒ…: requests + bt-content/article-content/content
ç”¨æ³•:
  python3 crawl_yizheng_xz_tzgg.py                  # å…¨éƒ¨11ä¹¡é•‡
  python3 crawl_yizheng_xz_tzgg.py --col=xjz        # å�•ä¹¡é•‡
  python3 crawl_yizheng_xz_tzgg.py --col=all --pages=5
  python3 crawl_yizheng_xz_tzgg.py --json out.jsonl # JSONLæ¨¡å¼�(ä¸�å†™DB)
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoin)Úsync_playwrightzhttps://www.yizheng.gov.cnzwww.yizheng.gov.cnu   æ±Ÿè‹�iG  )Údaysz%Y-%m-%dÚDB_PATHz/root/search.dbu	   æ–°é›†é•‡u	   é©¬é›†é•‡u	   é™ˆé›†é•‡u	   åˆ˜é›†é•‡u	   å¤§ä»ªé•‡u	   æœˆå¡˜é•‡u	   æ–°åŸŽé•‡u	   é�’å±±é•‡u   æž£æž—æ¹¾æ—…æ¸¸åº¦å�‡åŒºu   ç»�æµŽå¼€å�‘åŒºu	   çœŸå·žé•‡)ÚxjzÚmjzÚcjzÚljzÚdyzÚytzÚxczÚqszÚzlwlydjqÚjjkfqÚzzzú
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        | d¬«       y )NT)Úflush)Úprint)Úmsgs    ú*/root/gov_crawler/crawl_yizheng_xz_tzgg.pyÚlogr   #   s   € Ü	ˆ#�TÖó    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         › d| › d�}g }t        «       }t        «       5 }|j                  j	                  ddg¬«      }|j                  t        d   ¬«      }|j                  «       }	 |j                  |dd	¬
«       	 |j                  dd¬«       t        d|dz   «      D ]è  }	|j                  d«      }
d}|
D ]c  }|d   j                  d«      r|d   nt         |d   z   }||vsŒ-|j                  |«       |j                  t!        |d   «      |ddœ«       |dz  }Œe t#        d|	› dt%        |
«      › d|› dt%        |«      › �«       |	|k  sŒ­|j                  d«      }|s n)	 |j'                  d«       	 |j)                  ddd¬«       Œê |j+                  «        	 ddd«       |S # t        $ r Y �Œ!w xY w# t        $ r Y Œ8w xY w# t        $ r Y  ŒFw xY w# t        $ r}t#        d |› �«       Y d}~Œfd}~ww xY w# |j+                  «        w xY w# 1 sw Y   |S xY w)!uA   Playwright æ¸²æŸ“åˆ—è¡¨ + ç‚¹å‡»ç¿»é¡µ, è¿”å›ž [{title,url,date}]z/zfxxgk/yqxzbmxxgkml/yqxz/z/fdzdgknr/tzgg/index.htmlTz--no-sandbox)ÚheadlessÚargsr   )Ú
user_agentÚnetworkidlei@œ  )Ú
wait_untilÚtimeoutza[href*="/fdzdgknr/tzgg/art/"]i˜:  )r+   é   aæ  () => {
                    const out = [];
                    document.querySelectorAll('a').forEach(a => {
                        const href = a.getAttribute('href') || '';
                        if (!href.includes('/fdzdgknr/tzgg/art/')) return;
                        const t = (a.getAttribute('title') || a.textContent || '').trim();
                        if (t.length >= 6) out.push({t: t, h: href});
                    });
                    return out;
                }r   ÚhÚhttpr#   r   )ÚtitleÚurlÚdatez  [Pz] z links, z new, total uP  () => {
                        const links = Array.from(document.querySelectorAll('.page a, .pagination a, a'));
                        const next = links.find(a => (a.textContent||'').trim() === 'ä¸‹ä¸€é¡µ');
                        if (next) { next.click(); return true; }
                        return false;
                    }i¸  a^  (cnt) => {
                                let n = 0;
                                document.querySelectorAll('a').forEach(a => {
                                    if ((a.getAttribute('href')||'').includes('/fdzdgknr/tzgg/art/')) n++;
                                });
                                return n > 0;
                            }Né@  )Úargr+   z  Playwright ERR: )ÚBASEÚsetr   ÚchromiumÚlaunchÚnew_contextÚHEADERSÚnew_pageÚgotoÚwait_for_selectorÚ	ExceptionÚrangeÚevaluateÚ
startswithÚaddÚappendr$   r   ÚlenÚwait_for_timeoutÚwait_for_functionÚclose)Ú	town_codeÚ	max_pagesÚtown_urlÚitemsÚseenÚpÚbrowserÚctxÚpageÚpgÚdataÚpg_newÚitr0   ÚclickedÚes                   r   Úfetch_list_playwrightrV   ,   sW  € ä�Ð1°)°Ð<UÐV€HØ€EÜ‹5€DÜ	Ó	ð :˜aØ—*‘*×#Ñ#¨T¸Ð8HÐ#ÓIˆØ×!Ñ!¬W°\Ñ-BÐ!ÓCˆØ�|‰|‹~ˆð6	Ø�I‰I�h¨=À%ˆIÔHðØ×&Ñ&Ð'GÐQVÐ&ÔWô ˜A˜y¨1™}Ó-ò +�Ø—}‘}ð 	&ó 	�ð �Øò $�BØ%'¨¡W×%7Ñ%7¸Ô%?˜"˜Sš'ÄTÈBÈsÉGÁ^�CØ $’ØŸ™ œØŸ™¬{¸2¸c¹7Ó/CÈCÐY[Ñ%\Ô]Ø !™™ð$ô �d˜2˜$˜b¤ T£ ¨8°F°8¸<ÌÈEË
À|ÐTÔUà˜	“>Ø"Ÿm™mð -ó �Gñ #Ùðà×-Ñ-¨dÔ3ð	!Ø ×2Ñ2ð 4!ð '+°Dð 3ô :øðC+ð^ �M‰M�O÷u:ðv €Løôe ò ÚðûôT  )ò !Ù ð!ûä$ò Úðûäò 	*ÜÐ$ Q CÐ(×)Ñ)ûð	*ûð �M‰M�Oú÷u:ðv €Lús¶   £AHÁ,GÂF)ÂAGÃ(A'GÅGÅ&GÅ8F9ÆGÆHÆ)	F6Æ2GÆ5F6Æ6GÆ9	GÇGÇGÇGÇ	GÇGÇGÇGÇ	G9Ç!G4Ç/G<Ç4G9Ç9G<Ç<HÈHÈHc                 óz  — 	 t        j                  | t        d¬«      }d|_        |j                  }t        |d«      }ddddœ}|j                  d«      }|rt        |j                  d¬	«      «      |d<   t        j                  d
|d d «      }|r|j                  d«      |d<   d }dD ]  }|j                  d|¬«      }|sŒ n |s(|j                  dd¬«      xs |j                  dd¬«      }|r7 |ddg«      D ]  }	|	j                  «        Œ t        t        |«      | «      |d<   |S # t
        $ r	 ddddœcY S w xY w)Né   )Úheadersr+   úutf-8r   )r/   Úpublish_dateÚcontentÚlxmlr/   T©r"   z(\d{4}-\d{2}-\d{2})r2   r,   r[   )z
bt-contentz
bt-articlezarticle-contentr\   zpage-contentztheme-showcaseÚdiv)Úclass_Úzoom)ÚidzUCAP-CONTENTÚscriptÚstyler\   )ÚrequestsÚgetr9   ÚencodingÚtextr=   r   Úfindr$   Úget_textr    ÚsearchÚgroupÚ	decomposeÚextract_clean_textÚstr)
r0   ÚrÚhtmlÚsoupÚresultÚttagÚmÚcontent_divÚclsÚtags
             r   Úparse_detailry   n   sO  € ð@Ü�L‰L˜¤g°rÔ:ˆØˆŒ
Ø�v‰vˆô ˜˜vÓ&€DØ¨2¸"Ñ=€FØ�9‰9�WÓ€DÙÜ% d§m¡m¸$ mÓ&?Ó@ˆˆw‰Ü
�	‰	Ð(¨$¨u°¨+Ó6€AÙØ!"§¡¨£ˆˆ~ÑØ€KØkò ˆØ—i‘i ¨c�iÓ2ˆÚÙðñ Ø—i‘i ¨&�iÓ1ÒX°T·Y±Y¸uÈ°YÓ5XˆÙÙ ¨'Ð2Ó3ò 	ˆCØ�M‰M�Oð	ä.¬s°;Ó/?ÀÓEˆˆyÑØ€Møô+ ò @Ø¨R¸BÑ?Ò?ð@ús   ‚/D( Ä(D:Ä9D:c                 ó°  — | syt        | d«      }|j                  dd¬«      D ]V  }|j                  dd«      }|j                  d¬«      xs d}t	        |xs t
        |«      }|j                  d	|› d
|› d�«       ŒX |j                  g d¢«      D ]  }|j                  «        Œ g }|j                  ddg«      D ]y  }	|	j                  dk(  r|j                  t        |	«      «       Œ-|	j                  dk(  sŒ=|	j                  d«      rŒO|	j                  dd¬«      }
|
sŒe|j                  d|
› d�«       Œ{ |rdj                  |«      S | j                  «       S )Nr   zhtml.parserÚaT)Úhrefr|   r^   u   é™„ä»¶z<p><a href="z">z</a></p>)ÚspanÚbÚstrongÚfontÚemÚiÚuÚsÚtablerL   )Ú	separatorr"   z<p>z</p>z

)r   Úfind_allrf   rj   r   r4   Úreplace_withÚunwrapÚnamerB   ro   Úfind_parentÚjoinr"   )Úcontent_htmlÚpage_urlrr   Úa_tagr|   rh   Úfull_urlrx   ÚpartsÚelr#   s              r   rn   rn   Š   sF  € ÙØÜ˜ }Ó5€DØ—‘˜s¨�Ó.ò FˆØ�y‰y˜ Ó$ˆØ�~‰~ Dˆ~Ó)Ò5¨XˆÜ˜8Ò+¤t¨TÓ2ˆØ×Ñ˜\¨(¨°2°d°V¸8ÐDÕEð	Fð
 �}‰}ÒQÓRò ˆØ�
‰
�ðà€EØ�m‰m˜W c˜NÓ+ò ,ˆØ�7‰7�gÒØ�L‰Lœ˜R›Õ!Ø�W‰W˜‹^ B§N¡N°7Õ$;Ø—‘ b°�Ó5ˆAÚØ—‘˜s 1 # T˜]Õ+ð,ñ "'ˆ6�;‰;�uÓÐ@¨L×,>Ñ,>Ó,@Ð@r   é   c                 ó(  — | €t        t        j                  «       «      } g }| D ]î  }t        j                  ||«      }d|› d�}t	        d|› d�«       t        ||«      }t	        dt        |«      › d�«       t        |d«      D ]Ž  \  }}	t        |	d   «      }
|
d	   r|
d	   t        k  rŒ&|j                  |
d
   xs |	d
   |	d   |
d	   xs |	d   |
d   |ddœ«       |dz  dk(  rt	        d|› dt        |«      › �«       t        j                  d«       Œ� Œð t	        dt        |«      › 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«       |j+                  «       }dx}}|D ]W  }	 |j)                  d|d    |d!   |d!   |d
   |d	   |d   |d   xs d"d d# |d$   d%f	«       |j,                  dkD  r|dz  }n|dz  }ŒY |j1                  «        |j3                  «        t	        d'|› d(|› d)�«       y # 1 sw Y   ŒñxY w# t.        $ r}t	        d&|› �«       |dz  }Y d }~Œºd }~ww xY w)*Nu	   ä»ªå¾�å¸‚u   -é€šçŸ¥å…¬å‘Šz
===== z =====u
   åˆ—è¡¨å…± u    æ�¡, å¼€å§‹æŠ“è¯¦æƒ…...r,   r0   r[   r/   r1   r\   u   é€šçŸ¥å…¬å‘Š)r/   rŽ   r[   r\   Ú	site_nameÚcolumné
   r   z  ú/gš™™™™™É?u   
å…± u    æ�¡ÚwrZ   )rg   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Ž   r   iô  r–   zcrawl_yizheng_xz_tzgg.pyz
DB error: zResult: z new, z skipped)ÚlistÚTOWNSÚkeysrf   r   rV   rC   Ú	enumeratery   ÚCUTOFFrB   ÚtimeÚsleepÚopenÚwriteÚjsonÚdumpsÚsqlite3Úconnectr	   ÚexecuteÚcursorÚrowcountr=   ÚcommitrF   )ÚtownsÚpagesÚjson_outÚall_enrichedÚtcÚtnamer•   rJ   ÚidxrS   ÚdÚfÚitemÚconnÚcÚstoredÚskippedrU   s                     r   Úcrawlr»   Ÿ   sÜ  € Ø€}Ü”U—Z‘Z“\Ó"ˆØ€LØò ˆÜ—	‘	˜"˜bÓ!ˆØ ˜w mÐ4ˆ	Üˆh�y�k Ð(Ô)Ü% b¨%Ó0ˆÜˆjœ˜U›˜Ð$<Ð=Ô>Ü  ¨Ó*ò 	‰GˆC�Ü˜R ™YÓ'ˆAØ�Ò  Q ~Ñ%6¼Ò%?ØØ×ÑØ˜7™Ò2 r¨'¡{Ø˜u™IØ ! .Ñ 1Ò ?°R¸±ZØ˜Y™<Ø&Ø(ñ!ô ð �R‰x˜1Š}Ü�b˜˜˜Qœs 5›z˜lÐ+Ô,Ü�J‰J�s�Oñ	ðô* ˆ&”�\Ó"Ð# 4Ð(Ô)áÜ�(˜C¨'Ô2ð 	E°aØ$ò E�Ø—‘œŸ
™
 4°eÔ<¸tÑCÕDñE÷	Eô 	ˆg”c˜,Ó'Ð(¨
°8°*Ð=Ô>Øä�?‰?œ7Ó#€DØ‡L�LÐ,Ô-Ø�‰‹€AØÐ€FˆWØò ˆð	Ø�I‰Ið.ð �kÑ" D¨Ñ$4°d¸:Ñ6FØ�g‘  ^Ñ 4°d¸9±oØ�y‘/Ò' R¨¨#Ð.°°X±Ð@Zð\ô	]ð �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3÷9	Eð 	Eûô. ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús%   Ä=1IÇAI+ÉI(É+	JÉ4JÊJÚ__main__r,   z--pages=r   z--pages=(\d+)z--col=z--col=([\w,]+)Úallú,z--json)r­   r®   r¯   )N)Nr“   N)0Ú__doc__r    ÚsysÚosr¥   r¡   r§   re   r   r   Úbs4r   Úurllib.parser   Úplaywright.sync_apir   r4   ÚDOMAINÚGROUPÚnowÚstrftimer    Úenvironrf   r	   r�   r9   r   r$   rV   ry   rn   r»   Ú__name__Úargvr'   r®   r¯   r­   rŒ   Úintrk   rl   ÚcolÚsplitrœ   rž   Úindex© r   r   ú<module>rÑ      s¬  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  Ý /à#€Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€ð ˜{°;À{Ø˜{°;À{Ø*Ð5FÈ{ñ	€ð ð  Kð  L€òòò@òDó8Aó*84ðt ˆzÒØ�8‰8�A�Bˆ<€DØ€EØ€HØ€EØ�S—X‘X˜d“^Ñ#Ù�I�B—I‘IÐ.°·±¸³Ó?×EÑEÀaÓHÓIˆØ�3—8‘8˜D“>Ñ!Øˆb�i‰iÐ)¨3¯8©8°D«>Ó:×@Ñ@ÀÓCˆØ"%¨¢,�—	‘	˜#”±D¸¿¹»Ó4FˆØ�4ÑØ˜Ÿ
™
 8Ó,¨qÑ0Ñ1ˆÙ	�˜U¨XÖ6ð r   