Ë
    ¸¬uj÷$  ã                   óÊ  — 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mZ dZ	dZ
dZdZdZd	Zej                  j!                  e«      Z ej&                  d
d«      ZeZddddœZdZ ej0                  «       Zej4                  j7                  e«       dZdZe eej>                  «      k  r‘ej>                  e   Z e jC                  d«      r e"e jG                  dd«      d   «      Zn:e dk(  r5edz    eej>                  «      k  r e"ej>                  edz      «      Zedz  Zedz  Ze eej>                  «      k  rŒ‘eekD  reZd„ Z$d„ Z%d„ Z&d„ Z'd„ Z(d„ Z)d„ Z*e+dk(  r e*«        yy)uÛ  
ä¸´æ²‚æ²‚æ²³æ–°åŒº â€” é€šçŸ¥å…¬å‘Š çˆ¬è™«
site: www.leda.gov.cn (å±±ä¸œä¸´æ²‚æ²‚æ²³æ–°åŒº, VSB9 å�¯è§†åŒ–å»ºç«™ç³»ç»Ÿ)
æ �ç›®: /xwzx/tzgg.htm (é€šçŸ¥å…¬å‘Š, å…±1224æ�¡62é¡µ, 20æ�¡/é¡µ)
åˆ—è¡¨: ul.listNewsList > li#line_u9_N > a > spanæ ‡é¢˜ + fontæ—¥æœŸ (YYYY-MM-DD)
åˆ†é¡µ: å��å�‘åˆ†é¡µ! ç¬¬Né¡µ = tzgg/{62-N+1}.htm (ç¬¬2é¡µ=tzgg/61.htm, å°¾é¡µ=tzgg/1.htm)
è¯¦æƒ…: /info/2297/{id}.htm, meta ArticleTitle/PubDate + div.v_news_content æ­£æ–‡(è¡¨æ ¼ä¿�ç•™)
2026-08-01 æ–°å»º
é    N)Úurljoinu   ä¸´æ²‚æ²‚æ²³æ–°åŒº-é€šçŸ¥å…¬å‘Šu   å±±ä¸œzwww.leda.gov.cnzhttp://www.leda.gov.cnz$http://www.leda.gov.cn/xwzx/tzgg.htmé>   Ú	SEARCH_DBz/root/search.dbzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languageé   é   z--pages=ú=z--pagesc                 ó²   — 	 t         j                  | t        ¬«      }|j                  dk7  ry |j                  j                  dd¬«      S # t        $ r Y y w xY w)N©ÚtimeoutéÈ   z	utf-8-sigÚreplace)Úerrors)ÚsessionÚgetÚTIMEOUTÚstatus_codeÚcontentÚdecodeÚ	Exception)ÚurlÚresps     ú$/root/gov_crawler/crawl_leda_tzgg.pyÚfetchr   7   sV   € ðÜ�{‰{˜3¬ˆ{Ó0ˆØ×Ñ˜sÒ"ØØ�|‰|×"Ñ" ;°yÐ"ÓAÐAøÜò Ùðús   ‚*A
 ­A
 Á
	AÁAc                 ó†   — t        j                  dd| xs d«      } t        j                  dd| «      } | j                  «       S )u8   æ ‡é¢˜æ¸…æ´—: strip å®žä½“å‰�ç¼€ + çœ�ç•¥å�·æˆªæ–­å�Žç¼€u   ^[\s\xa0Â·\u00b7]+Ú z\s*\.{3,}\s*$)ÚreÚsubÚstrip)Útitles    r   Úclean_titler!   A   s8   € ä�F‰FÐ(¨"¨eªk°rÓ:€EÜ�F‰FÐ# R¨Ó/€EØ�;‰;‹=Ðó    c                 ó:   — | dk  rt         S t        | z
  dz   }d|z  S )uE   VSB9 å��å�‘åˆ†é¡µ: ç¬¬Né¡µ = tzgg/{TOTAL-N+1}.htm; ç¬¬1é¡µ = tzgg.htmr   z'http://www.leda.gov.cn/xwzx/tzgg/%d.htm)ÚLIST_URLÚTOTAL_PAGES)ÚnÚidxs     r   Úpage_urlr(   H   s'   € àˆA‚vÜˆÜ
˜‰/˜AÑ
€CØ4°sÑ:Ð:r"   c           
      óâ  — g }t        j                  d| t         j                  «      }|s|S |j                  d«      dz   }t        j                  d|t         j                  «      D �]†  }|j                  d«      }t        j                  d|t         j                  «      }|sŒ=|j                  d«      j                  «       }|j                  d«      }t        j                  d|t         j                  «      }	|	r/t        t        j                  dd	|	j                  d«      «      «      nd	}
t        j                  d
|t         j                  «      }|r4t        j                  dd	|j                  d«      «      j                  «       nd	}t        j                  d|«      }|s|r|j                  d«      }|
s�ŒQ|j                  d«      st        t        |«      }|j                  |
||dœ«       �Œ‰ |S )u>   è§£æž�åˆ—è¡¨: ul.listNewsList > li#line_u9_N > a > span + fontz6<ul[^>]*class="[^"]*listNewsList[^"]*"[^>]*>(.*?)</ul>r   z</ul>z<li[^>]*>(.*?)(?=<li\b|</ul>)z$<a[^>]+href="([^"]+)"[^>]*>(.*?)</a>é   z<span[^>]*>(.*?)</span>ú<[^>]+>r   z<font[^>]*>(.*?)</font>ú(\d{4}-\d{2}-\d{2})Úhttp)r    r   Údate)r   ÚsearchÚDOTALLÚgroupÚfinditerr   r!   r   Ú
startswithr   r$   Úappend)ÚhtmlÚitemsÚmÚul_segÚliÚsegÚaÚhrefÚinnerÚtmr    Údmr.   Údm2s                 r   Ú
parse_listrA   P   s~  € à€EÜ
�	‰	ÐKÈTÔSU×S\ÑS\Ó]€AÙØˆØ�W‰W�Q‹Z˜'Ñ!€FÜ�k‰kÐ:¸FÄBÇIÁIÓNó BˆØ�h‰h�q‹kˆÜ�I‰IÐ=¸sÄBÇIÁIÓNˆÙØØ�w‰w�q‹z×ÑÓ!ˆØ—‘˜“
ˆÜ�Y‰YÐ1°5¼"¿)¹)ÓDˆÙDF”œBŸF™F :¨r°2·8±8¸A³;Ó?Ô@ÈBˆÜ�Y‰YÐ1°5¼"¿)¹)ÓDˆÙ>@Œr�v‰v�j " b§h¡h¨q£kÓ2×8Ñ8Ô:ÀbˆÜ�i‰iÐ.°Ó6ˆÙ™Ø—9‘9˜Q“<ˆDÙÙØ�‰˜vÔ&Üœ8 TÓ*ˆDØ�‰˜u¨T¸4Ñ@ÖAð%Bð& €Lr"   c                 óL  ‡— d}d}t        j                  d| t         j                  «      }|rt        |j	                  d«      «      }t        j                  d| t         j                  «      }|rH|j	                  d«      j                  «       }t        j                  d|«      }|r|j	                  d«      }t        j                  d| t         j                  «      }|s||dddfS |j	                  d«      }g }t        j                  d|«      D ]©  }	|	j	                  d«      j                  «       }
|	j	                  d	«      j                  «       }t        j                  d
|
j                  «       «      sd|
j                  «       v sŒx|
j                  d«      st        ||
«      n|
}|j                  ||f«       Œ« g }t        «       }|D ].  \  }}||v rŒ|j                  |«       |j                  ||f«       Œ0 g }d}g Šˆfd„}t        j                  d||t         j                  ¬«      }‰rdnd}t        j                  d|«      }|D �]  }t        j                  dˆfd„|«      }t        j                  d|«      r |j                  |j                  «       «       ŒTt        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }|j                  «       }|sŒñ|j                  |«       �Œ dj!                  |«      }t        j                  dd|«      }d}|rdj!                  d„ |D «       «      }|||j                  «       ||fS )uT   æ��å�–æ­£æ–‡: div.v_news_content; è¿”å›ž (title, date, content, has_table, att_html)r   z/<meta\s+name="ArticleTitle"\s+content="([^"]*)"r   z*<meta\s+name="PubDate"\s+content="([^"]*)"r,   zD<div[^>]*class="[^"]*v_news_content[^"]*"[^>]*>(.*?)</div>\s*(?:<|$)r   z+<a[^>]+href="([^"]+)"[^>]*>([^<]{1,80})</a>r*   z,\.(pdf|docx?|xlsx?|zip|rar|wps|et|dps)(\?|$)Úuploadr-   c                 óh   •— ‰j                  | j                  d«      «       dt        ‰«      dz
  › d�S )Nr   z TBLr   ú )r4   r1   Úlen©r7   Útbl_phs    €r   Ú_tbl_phz extract_content.<locals>._tbl_ph’   s.   ø€ Ø�‰�a—g‘g˜a“jÔ!Øœ˜V› Q™˜ tÐ,Ð,r"   z<table[^>]*>.*?</table>)Úflagsz*(?=<\s*p[^>]*>|<\s*div[^>]*>|<\s*tr[^>]*>)z\x00TBL(\d+)\x00c                 ó>   •— ‰t        | j                  d«      «         S )Nr   )Úintr1   rG   s    €r   ú<lambda>z!extract_content.<locals>.<lambda>™   s   ø€ °F¼3¸q¿w¹wÀq»z»?Ñ4K€ r"   z<tablez	<br\s*/?>ú
r+   z&nbsp;|&ensp;|&emsp;ú z&[a-z]+;z[ \t\u3000]+z\n+ú

z\n{3,}c              3   ó4   K  — | ]  \  }}d |›d|›d�–— Œ y­w)z<p><a href="z" target="_blank">z</a></p>N© )Ú.0Úhr&   s      r   ú	<genexpr>z"extract_content.<locals>.<genexpr>ª   s    è ø€ ò ZÙFJÀaÉºAºqÔAñZùs   ‚)r   r/   ÚIr!   r1   r   r0   r2   Úlowerr3   r   r4   ÚsetÚaddr   ÚsplitÚjoin)r5   r(   r    r.   r7   Údr?   r:   Úattsr;   r<   ÚnameÚabs_hrefÚ
atts_dedupÚseen_hrT   r&   ÚpartsÚ	has_tablerI   Úseg2ÚblocksÚblkÚtxtr   Úatt_htmlrH   s                             @r   Úextract_contentri   m   s#  ø€ à€EØ€DÜ
�	‰	ÐDÀdÌBÏDÉDÓQ€AÙÜ˜AŸG™G A›JÓ'ˆÜ
�	‰	Ð?ÀÄrÇtÁtÓL€AÙØ�G‰G�A‹J×ÑÓˆÜ�Y‰YÐ-¨qÓ1ˆÙØ—8‘8˜A“;ˆDä
�	‰	ÐYÐ[_Ôac×ajÑajÓk€AÙØ�d˜B  2Ð%Ð%Ø
�'‰'�!‹*€Cà€DÜ�[‰[ÐGÈÓMò *ˆØ�w‰w�q‹z×ÑÓ!ˆØ�w‰w�q‹z×ÑÓ!ˆÜ�9‰9ÐDÀdÇjÁjÃlÔSÐW_Ðcg×cmÑcmÓcoÒWoØ6:·o±oÀfÔ6M”w˜x¨Ô.ÐSWˆHØ�K‰K˜ 4Ð(Õ)ð*ð €JÜ‹U€FØò "‰ˆˆ1Ø�‰;ØØ�
‰
�1ŒØ×Ñ˜1˜a˜&Õ!ð	"ð €EØ€IØ€Fô-ô �6‰6Ð,¨g°sÄ"Ç)Á)ÔL€DÙ‘ €IÜ�X‰XÐCÀTÓJ€FØó ˆÜ�f‰fÐ(Ó*KÈSÓQˆÜ�9‰9�Y Ô$Ø�L‰L˜Ÿ™›Ô%ØÜ�f‰f�\ 4¨Ó-ˆÜ�f‰f�Z  SÓ)ˆÜ�f‰fÐ,¨c°3Ó7ˆÜ�f‰f�[ " cÓ*ˆÜ�f‰f�_ c¨3Ó/ˆÜ�f‰f�V˜T 3Ó'ˆØ�i‰i‹kˆÚØ�L‰L˜Öðð �k‰k˜%Ó €GÜ�f‰f�Y ¨Ó0€GØ€HÙØ—9‘9ñ ZØNXôZó Zˆà�$˜Ÿ™›¨°HÐ<Ð<r"   c                 ó®  — | j                  d|d   |d   f«      j                  «       }|ry| j                  d|d   |d   |d   |d   |d	   |d   |d
   |d   |d   f	«       | j                  dkD  re| j                  d|d   f«      j                  «       d   }t        j                  dd|d   xs d«      dd }| j                  d||d   |d   |f«       yy)u0   å…¥åº“ gov_raw + gov_search; è¿”å›ž 'new'/'skip'z6SELECT 1 FROM gov_raw WHERE page_url=? AND site_name=?r   Ú	site_nameÚskipzšINSERT OR IGNORE INTO gov_raw(page_url, source_url, title, content, publish_date, site_name, group_name, script_name, has_table) VALUES(?,?,?,?,?,?,?,?,?)Ú
source_urlr    r   r.   Ú
group_nameÚscript_namerc   r   z'SELECT id FROM gov_raw WHERE page_url=?r+   r   Nr   zRINSERT OR IGNORE INTO gov_search(rowid, title, site_name, summary) VALUES(?,?,?,?)Únew)ÚexecuteÚfetchoneÚrowcountr   r   )ÚcurÚitemÚexistsÚridÚsummarys        r   Ústore_recordry   ¯   s  € à�[‰[Ø@Ø	ˆe‰�d˜;Ñ'Ð(ó*ç*2©(«*ð ñ ØØ‡K�Kð	$à	ˆe‰�d˜<Ñ(¨$¨w©-¸¸i¹Ø	ˆf‰�t˜KÑ(¨$¨|Ñ*<Ø	ˆmÑ	˜d ;Ñ/ð	1ô2ð ‡|�|�aÒØ�k‰kÐCÀdÈ5ÁkÀ^ÓT×]Ñ]Ó_Ð`aÑbˆÜ—&‘&˜ R¨¨i©Ò)>¸BÓ?ÀÀÐEˆØ�‰Ø`Ø�$�w‘-  kÑ!2°GÐ<ô	>ð Ør"   c                  ó¢  — t        j                  t        d¬«      } | j                  «       }d}d}d}d}t	        «       }t        dt        dz   «      D �]E  }t        |«      }t        |«      }	|	s!|dz  }|dk\  r|dkD  rt        d|z  «        �nŒ=d}t        |	«      }
|
st        d|z  «        níd}|
D ]Ò  }|d   |v rŒ|j                  |d   «       t        |d   «      }|s|dz  }Œ5t        ||d   «      \  }}}}}|s|d   }|s|d	   }|s|s|dz  }Œb|r|r|d
z   |z   j                  «       n|}|d   |||t        t        t         t"        |dœ	}t%        ||«      }|dk(  r|dz  }|dz  }n|dz  }t'        j(                  d«       ŒÔ t        d|||fz  «       �ŒH | j+                  «        | j-                  «        t        dt        |||fz  «       y )Né<   r   r   r   u"   Page %d è¯·æ±‚å¤±è´¥, æ��å‰�å�œæ­¢u   Page %d æ— åˆ—è¡¨æ•°æ�®r   r    r.   rP   )	r   r    r   r.   rk   rn   rm   ro   rc   rp   g333333Ó?u#   Page %d: æ–°å¢ž %d, ç´¯è®¡æ–°å¢ž %du8   å®Œæˆ�: æ€»è®¡ %d | æ–°å¢ž: %d | è·³è¿‡: %d | å¤±è´¥: %d)Úsqlite3ÚconnectÚDB_PATHÚcursorrX   ÚrangeÚ
_MAX_PAGESr(   r   ÚprintrA   rY   ri   r   Ú	SITE_NAMEÚ
GROUP_NAMEÚDOMAINÚSCRIPT_NAMEry   ÚtimeÚsleepÚcommitÚclose)Úconnrt   Ún_newÚn_skipÚn_failÚfail_streakÚ	seen_urlsÚpager   r5   r6   Úpage_newÚitÚdetailr    r.   r   rc   rh   ru   Úrs                        r   Úmainr–   Æ   s  € Ü�?‰?œ7¨BÔ/€DØ
�+‰+‹-€CØ€EØ€FØ€FØ€KÜ“€IÜ�aœ a™Ó(ó 3OˆÜ�t‹nˆÜ�S‹zˆÙØ˜1ÑˆKØ˜aÒ D¨1¢HÜÐ:¸TÑAÔBÚØØˆÜ˜4Ó ˆÙÜÐ+¨dÑ2Ô3ÙØˆØò #	ˆBØ�%‰y˜IÑ%ØØ�M‰M˜"˜U™)Ô$Ü˜2˜e™9Ó%ˆFÙØ˜!‘�ØÜ8GÈÐPRÐSXÑPYÓ8ZÑ5ˆE�4˜ )¨XÙØ˜7™�ÙØ˜&‘z�Ù¡8Ø˜!‘�ØÙÙCJ˜7 VÑ+¨hÑ6×=Ñ=Ô?ÐPX�à˜%‘yØØ"ØÜ&Ü(Ü$Ü*Ø&ñ
ˆDô ˜S $Ó'ˆAØ�EŠzØ˜‘
�Ø˜A‘‘à˜!‘�Ü�J‰J�s�OðG#	ôH 	Ð3°t¸XÀuÐ6MÑMÖNðg3Oðh 	‡K�K„MØ‡J�J„LÜ	Ð
DÌ
ÐTYÐ[aÐciÐGjÑ
jÕkr"   Ú__main__),Ú__doc__r   ÚsysÚosr‡   r|   ÚrequestsÚurllib.parser   rƒ   r„   r…   ÚBASE_URLr$   r%   ÚpathÚbasenameÚ__file__r†   Úgetenvr   r~   ÚHEADERSr   ÚSessionr   ÚheadersÚupdater�   ÚirF   Úargvr;   r3   rL   rZ   r   r!   r(   rA   ri   ry   r–   Ú__name__rR   r"   r   ú<module>r©      s‘  ðñó 
Û 
Û 	Û Û Û Ý  à-€	Ø€
Ø	€Ø#€Ø1€Ø€Ø�g‰g×Ñ˜xÓ(€àˆB�I‰I�kÐ#4Ó5€	Ø
€ð DØOØ0ñ€ð
 €Ø
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ à€
ð €Ø‰#ˆc�h‰h‹-ÒØ�‰�‰€AØ‡|�|�JÔÙ˜Ÿ™  a›¨Ñ+Ó,‰
Ø	
ˆiŠ˜A ™E¡C¨¯©£MÒ1Ù˜Ÿ™ ! a¡%™Ó)ˆ
¨1°©6¨1Øˆ�F€Að ‰#ˆc�h‰h‹-Óð �ÒØ€Jòòò;òò:?=òDò.>lðB ˆzÒÙ…Fð r"   