Ë
    ™ÑwjÃ  ã                   óF  — 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mZ ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ  ej                   «        ed¬«      z
  j#                  d«      ZdZd	Zd
ddœZdZdZeez   dz   Zd„ Zd„ Zd„ Zd„ Zdd„Zedk(  rW ej>                  «       Z e jC                  de"d¬«       e jG                  «       Z$ ee$jJ                  «      Z& e'de› de&› d�«       yy)u˜  crawl_qzftz_tzgg.py - é’¦å·žæ¸¯ç‰‡åŒº-é€šçŸ¥å…¬å‘Š (ä¸­å›½ï¼ˆå¹¿è¥¿ï¼‰è‡ªç”±è´¸æ˜“è¯•éªŒåŒºé’¦å·žæ¸¯ç‰‡åŒºç®¡ç�†å§”å‘˜ä¼š)

ç«™ç‚¹: http://qzftz.gxzf.gov.cn/zwdt/tzgg/
CMS: TRS (UTF-8, æœ�åŠ¡ç«¯æ¸²æŸ“)
åˆ—è¡¨: <li><a href='./t27876447.shtml' target="_blank" title=""><span>æ ‡é¢˜</span></a><span class="time">2026-07-10</span></li>
      âš ï¸� title="" ä¸ºç©º â†’ å�– span æ–‡æœ¬; æ ‡é¢˜å�¯èƒ½å�« â€‹ é›¶å®½ç©ºæ ¼ â†’ strip
åˆ†é¡µ: createPageHTML(50,0,"index","shtml") â†’ index_N.shtml 49 é¡µ (P50 404), æ¯�é¡µ 20 æ�¡
      âš ï¸� CUTOFF 3 å¹´æˆªæ–­ (2023-08 ä¹‹å‰�è‡ªåŠ¨å�œ)
è¯¦æƒ…: meta ArticleTitle + meta PubDate + div.content (å†…å�« TRS_Editor) å¹³è¡¡ div
é    N)ÚdatetimeÚ	timedelta)Úpush_to_searchdbiG  )Údaysz%Y-%m-%du   é’¦å·žæ¸¯ç‰‡åŒº-é€šçŸ¥å…¬å‘Šu   å¹¿è¥¿zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zhttp://qzftz.gxzf.gov.cn/)z
User-AgentÚRefererzhttp://qzftz.gxzf.gov.cnz
/zwdt/tzggz/index.shtmlc                 óÒ   — 	 t        j                  | dt        d¬«      }d|_        |j                  S # t
        $ r+}t        d| › d|› �t        j                  ¬«       Y d }~yd }~ww xY w)	N)é   é   F)ÚtimeoutÚheadersÚverifyzutf-8z[WARN] fetch failed: z - )ÚfileÚ )	ÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	ExceptionÚprintÚsysÚstderr)ÚurlÚrÚes      ú%/root/gov_crawler/crawl_qzftz_tzgg.pyÚfetchr      sZ   € ðÜ�L‰L˜ g´wÀuÔMˆØˆŒ
Ø�v‰vˆøÜò ÜÐ% c U¨#¨a¨SÐ1¼¿
¹
ÕCÜûðús   ‚/2 ²	A&»!A!Á!A&c                 óô  — g }t        j                  d| «      D ]Ü  }|j                  d«      |j                  d«      |j                  d«      j                  «       }}}|j	                  dd«      j                  «       }t        j
                  dd|«      }t        |«      dk  rŒŠt        t        z   d	z   |z   }t        j                  d
|«      }|r|j                  d«      nd}|j                  |||dœ«       ŒÞ |S )u=   åˆ—è¡¨æ�¡ç›®: ./t{sid}.shtml + span æ ‡é¢˜ + span.time æ—¥æœŸzk<li>\s*<a href='\./(t\d+\.shtml)'[^>]*>\s*<span>([^<]+)</span>\s*</a>\s*<span class=\"time\">([^<]+)</span>é   é   é   õ   â€‹r   õ   ^\s*(?:&middot;|&nbsp;|Â·|\s)+é   ú/ú(\d{4}-\d{2}-\d{2}))r   Úpub_dateÚtitle)ÚreÚfinditerÚgroupÚstripÚreplaceÚsubÚlenÚBASEÚLIST_DIRÚsearchÚappend)	ÚhtmlÚitemsÚmÚhrefr(   Ú	date_textr   ÚmdÚpds	            r   Úextract_itemsr;   (   sæ   € à€EÜ�[‰[ð  Hð  JNó  Oò 
CˆØ!"§¡¨£¨Q¯W©W°Q«Z¸¿¹À»×9IÑ9IÓ9K�Yˆeˆà—‘˜h¨Ó+×1Ñ1Ó3ˆÜ—‘Ð8¸"¸eÓDˆÜˆu‹:˜Š>ØÜ”X‰o Ñ# dÑ*ˆÜ�Y‰YÐ-¨yÓ9ˆÙˆR�X‰X�aŒ[ BˆØ�‰˜S¨b¸5ÑAÕBð
Cð €Ló    c                 óà  — t        j                  || t         j                  «      }|sy| j                  d|j	                  «       «      }|dk(  ry|dz   }d}t        j
                  d| |d t         j                  «      D ]j  }|j                  d«      j                  d«      s |j                  d«      j                  d	«      r|dz  }ŒI|dz  }|dk(  sŒT| |||j	                  «       z    c S  | |d S )
u&   å¹³è¡¡ div åŒ¹é…� (å¤§å°�å†™ä¸�æ•�æ„Ÿ)r   ú>éÿÿÿÿr   z<div[\s>]|</div>Nr   z<divz<DIV)r)   r2   ÚIÚfindÚstartr*   r+   Ú
startswith)r4   Úopen_tag_rer6   ÚgtÚiÚdepthÚmms          r   Úextract_balanced_divrI   9   sÛ   € ä
�	‰	�+˜t¤R§T¡TÓ*€AÙØØ	�‰�3˜Ÿ™›	Ó	"€BØ	ˆR‚xØØ
ˆQ‰€AØ€EÜ�k‰kÐ-¨t°A°B¨x¼¿¹Ó>ò .ˆØ�8‰8�A‹;×!Ñ! &Ô)¨R¯X©X°a«[×-CÑ-CÀFÔ-KØ�Q‰J‰Eà�Q‰JˆEØ˜‹zØ˜A˜a "§(¡(£*™nÐ-Ò-ð.ð ��ˆ8€Or<   c                 ó\  ‡ ‡— t        ‰ «      }|syd}t        j                  d|«      }|r|j                  d«      j	                  «       }|s‚t        j                  d|t        j
                  «      }|r[t        j                  dd|j                  d«      «      j	                  «       }t        j                  d|«      d   j	                  «       }|j                  d	d«      j	                  «       }t        j                  d
d|«      }d}t        j                  d|«      }|r8t        j                  d|j                  d«      «      }|r|j                  d«      }d}t        |d«      }|j	                  «       r|j	                  «       }|j	                  «       s,t        |d«      }|j	                  «       r|j	                  «       }t        j                  dd|t        j
                  t        j                  z  ¬«      }t        j                  dd|t        j
                  t        j                  z  ¬«      }ddlmŠ t        j                  dˆ ˆfd„|«      }t        j                  dˆ ˆfd„|«      }t        j                  dd|«      }t        j                  dd|«      }|||j	                  «       fS )N)r   r   r   r   z/<meta\s+name="ArticleTitle"\s+content="([^"]+)"r   z<title>\s*([^<]+?)\s*</title>z\s+z\s*-\s*r   r"   r#   z*<meta\s+name="PubDate"\s+content="([^"]+)"r&   z(<div[^>]*class="[^"]*content[^"]*"[^>]*>z+<div[^>]*class="[^"]*TRS_Editor[^"]*"[^>]*>z<script.*?</script>)Úflagsz<style.*?</style>)Úurljoinz,href="(?!https?://|//|#|javascript:)([^"]+)"c                 ó<   •— d ‰‰| j                  d«      «      › d�S )Nzhref="r   ú"©r+   ©rH   r   rL   s    €€r   ú<lambda>zfetch_detail.<locals>.<lambda>r   s    ø€  &©°°b·h±h¸q³kÓ)BÐ(CÀ1Ð E€ r<   zsrc="(?!https?://|//)([^"]+)"c                 ó<   •— d ‰‰| j                  d«      «      › d�S )Nzsrc="r   rN   rO   rP   s    €€r   rQ   zfetch_detail.<locals>.<lambda>t   s    ø€  %©°°R·X±X¸a³[Ó(AÐ'BÀ!Ð D€ r<   z%^(<p[^>]*>(\s*(<br\s*/?>)?\s*)?</p>)+z%(<p[^>]*>(\s*(<br\s*/?>)?\s*)?</p>)+$)r   r)   r2   r+   r,   ÚDOTALLr.   Úsplitr-   rI   r@   Úurllib.parserL   )	r   r4   r(   r6   r8   r9   ÚcontentÚcrL   s	   `       @r   Úfetch_detailrX   M   s  ù€ Ü�‹:€DÙØà€EÜ
�	‰	ÐDÀdÓK€AÙØ—‘˜“
× Ñ Ó"ˆÙÜ�I‰IÐ6¸¼b¿i¹iÓHˆÙÜ—F‘F˜6 2 q§w¡w¨q£zÓ2×8Ñ8Ó:ˆEÜ—H‘H˜Z¨Ó/°Ñ2×8Ñ8Ó:ˆEØ�M‰M˜( BÓ'×-Ñ-Ó/€EÜ�F‰FÐ4°b¸%Ó@€Eà€IÜ
�	‰	Ð?ÀÓF€AÙÜ�Y‰YÐ-¨q¯w©w°q«zÓ:ˆÙØŸ™ ›ˆIà€GÜ˜TÐ#NÓO€AØ‡w�w„yØ—'‘'“)ˆØ�=‰=Œ?Ü  Ð'UÓVˆØ�7‰7Œ9Ø—g‘g“iˆGÜ�f‰fÐ+¨R°ÄÇ	Á	ÌBÏDÉDÑ@PÔQ€GÜ�f‰fÐ)¨2¨w¼b¿i¹iÌ"Ï$É$Ñ>NÔO€Gå$Ü�f‰fÐDÜEÀwóP€Gä�f‰fÐ5ÜDÀgóO€Gô �f‰fÐ=¸rÀ7ÓK€GÜ�f‰fÐ=¸rÀ7ÓK€GØ�)˜WŸ]™]›_Ð,Ð,r<   r	   c                 ó  — g }t        «       }t        | «      D �]  }|dk(  rt        nt        t        z   d|dz   › d�z   }t        |«      }|st        d|dz   › d�«        �nÔt        |«      }|s6t        |«      dk  rt        d|dz   › d�«       nt        d|dz   › d	�«        �n‘t        d|dz   › d
t        |«      › d�«       |D �]j  }|d   r|d   t        k  rŒ|d   |v rŒ|j                  |d   «       t        |d   «      \  }}	}
|s|d   }|
st        d|d   › �«       Œ_|	xs |d   }g }t        j                  d|
t        j                  «      D ]—  }|j                  d«      t        j                   dd|j                  d«      «      j#                  «       }}t        j$                  d|t        j&                  «      sd|j)                  «       v sŒ€|j+                  |xs d|dœ«       Œ™ |j+                  ||d   |d   |t,        |
d|rt/        j0                  |d¬«      ndt2        dœ	«       �Œm �Œ t        dt        |«      › d�«       |D �cg c]  }|d   j#                  «       sŒ|‘Œ }}|rt5        |d«       t        |«      S c c}w )Nr   z/index_r   z.shtmlz  Page z: fetch fail (stop)iÐ  z: 404/empty (stop)z: 0 items (stop)ú: ú itemsr'   r   r(   z    SKIP empty content: z$<a[^>]*href="([^"]+)"[^>]*>(.*?)</a>z<[^>]+>r   r    z*\.(pdf|doc|docx|xls|xlsx|zip|rar|caj|wps)$Údownloadu   é™„ä»¶)r(   r   F)Úensure_asciiz[])	r(   r   Ú
source_urlr'   Ú	site_namerV   ÚsummaryÚattachmentsÚ
group_namez	  Total: rV   Ú
qzftz_tzgg)ÚsetÚrangeÚLIST_URLr0   r1   r   r   r;   r/   ÚCUTOFFÚaddrX   r)   r*   rS   r+   r.   r,   r2   r@   Úlowerr3   Ú	SITE_NAMEÚjsonÚdumpsÚ
GROUP_NAMEr   )Ú	max_pagesÚrecordsÚseenÚpgr   r4   r5   Úitr(   r8   rV   r:   ÚattsÚamÚhÚtr   Úvalids                     r   Úrunrx   {   s‹  € Ø€GÜ‹5€DÜ�IÓó 'ˆØ š'�h¤t¬h¡¸7À2ÈÁ6À(È&Ð9QÑ'QˆÜ�S‹zˆÙÜ�G˜B ™F˜8Ð#6Ð7Ô8ÚÜ˜dÓ#ˆÙä�4‹y˜4ÒÜ˜  Q¡˜xÐ'9Ð:Õ;ä˜  Q¡˜xÐ'7Ð8Ô9ÚÜ�˜˜Q™�x˜r¤# e£* ¨VÐ4Ô5Øó 	ˆBØ�*Š~ " Z¡.´6Ò"9ØØ�%‰y˜DÑ ØØ�H‰H�R˜‘YÔÜ(4°R¸±YÓ(?Ñ%ˆE�9˜gÙØ˜7™�ÙÜÐ0°°E±°Ð<Ô=ØØÒ,˜b ™nˆBàˆDÜ—k‘kÐ"IÈ7ÔTV×T]ÑT]Ó^ò D�Ø—x‘x “{¤B§F¡F¨:°r¸2¿8¹8ÀA»;Ó$G×$MÑ$MÓ$O�1�Ü—9‘9ÐJÈAÌrÏtÉtÔTÐXbÐfg×fmÑfmÓfoÒXoØ—K‘K¨!ª-¨xÀÑ BÕCðDð �N‰NØ r¨%¡yÀÀ5Á	Ø¬YÀ7ØÑVZ¬d¯j©j¸ÈEÕ.RÐ`dÜ(ñ	ö ò'	ð'ôP 
ˆI”c˜'“l�^ 6Ð
*Ô+ØÖ8�1 1 Y¡<×#5Ñ#5Õ#7ŠQÐ8€EÐ8ÙÜ˜ Ô-Üˆu‹:Ðùò 9s   ÉJÉ)JÚ__main__z--pages)ÚtypeÚdefaultz	[RESULT] rZ   r[   )r	   )(Ú__doc__r   Úosr   r)   Úargparserk   r   r   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   ÚnowÚstrftimerg   rj   rm   r   r0   r1   rf   r   r;   rI   rX   rx   Ú__name__ÚArgumentParserÚapÚadd_argumentÚintÚ
parse_argsÚargsÚpagesÚnr   © r<   r   ú<module>r‘      s  ðñ	÷ -× ,× ,ß (à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à
ˆ(�,‰,‹.™9¨'Ô2Ñ
2×	<Ñ	<¸ZÓ	H€Ø*€	Ø€
ð DØ*ñ€ð "€Ø€Ø�(‰?˜^Ñ+€òòò"ò(+-ó\/ðd ˆzÒØ	 ˆ×	 Ñ	 Ó	"€BØ‡O�O�I C°€OÔ3Ø�=‰=‹?€DÙˆD�J‰J‹€AÙ	ˆI�i�[  1 # VÐ
,Õ-ð r<   