Ë
    Jæwjð  ã                   óR  — 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 ddl	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jB                  «       Z"e"jG                  de$d¬«       e"jK                  «       Z& ee&jN                  «      Z( e)de› de(› d�«       yy)u‡  crawl_npq_hjpj.py - å�—ç¥¨åŒº-é¡¹ç›®çŽ¯å¢ƒè¯„ä»· (è¾½å®�è‘«èŠ¦å²›å¸‚å�—ç¥¨åŒºäººæ°‘æ”¿åºœ)

ç«™ç‚¹: https://www.npq.gov.cn/xxgk/zfxxgk/fdzdgknr/zwgkbzh/qubenji/zdjsxmly/xmspqzxx/xmhjpj/
CMS: TRS (UTF-8, æœ�åŠ¡ç«¯æ¸²æŸ“) â€” å�Œç«™ crawl_npq.py é€šçŸ¥å…¬å‘Šæ �ç›®ä¸�å�Œ
åˆ—è¡¨: <li><a href="./YYYYMM/tYYYYMMDD_ID.html" title="æ ‡é¢˜">æ ‡é¢˜</a><span class="time">æ—¥æœŸ</span></li>
      é“¾æŽ¥: ./YYYYMM/tYYYYMMDD_ID.html (ç›¸å¯¹è·¯å¾„ â†’ urljoin ç»�å¯¹åŒ–)
åˆ†é¡µ: createPageHTML(17) â†’ index_N.html 17 é¡µÃ—20 æ�¡ (CUTOFF 3å¹´è‡ªåŠ¨å�œ, P10 å·² 2013)
è¯¦æƒ…: meta ArticleTitle + meta PubDate + div.content æ­£æ–‡(å¹³è¡¡ div, å�«è¡¨æ ¼+é™„ä»¶)
é    N)ÚdatetimeÚ	timedelta)Úurljoin)Ú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https://www.npq.gov.cn/)z
User-AgentÚRefererzhttps://www.npq.gov.cnz>/xxgk/zfxxgk/fdzdgknr/zwgkbzh/qubenji/zdjsxmly/xmspqzxx/xmhjpjú/c                 óÒ   — 	 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_npq_hjpj.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| t         j                  «      D �]  }|j                  d«      |j                  d«      |j                  d«      |j                  d«      j	                  «       f\  }}}}|xs t        j
                  dd|«      j	                  «       }|j                  dd«      j	                  «       }t        j
                  d	d|«      }t        |«      dk  rŒÈt        ||«      }	t        j                  d
|«      }
|
r|
j                  d«      nd}|j                  |	||dœ«       �Œ |S )uJ   åˆ—è¡¨æ�¡ç›®: ./YYYYMM/tYYYYMMDD_ID.html + title å±žæ€§ + span.time æ—¥æœŸzl<a[^>]+href="([^"]*t\d{8}_\d+\.html)"[^>]*title="([^"]*)"[^>]*>(.*?)</a>\s*<span class="time">([^<]+)</span>é   é   é   é   ú<[^>]+>r   õ   â€‹õ   ^\s*(?:&middot;|&nbsp;|Â·|\s)+ú(\d{4}-\d{2}-\d{2}))r   Úpub_dateÚtitle)ÚreÚfinditerÚDOTALLÚgroupÚstripÚsubÚreplaceÚlenr   ÚsearchÚappend)ÚhtmlÚpage_urlÚitemsÚmÚhrefÚ
title_attrÚ
title_htmlÚ	date_textr*   r   ÚmdÚpds               r   Úextract_itemsr?   (   s,  € à€EÜ�[‰[ð  Ið  KOô  QS÷  QZñ  QZó  [ó 
CˆØ23·'±'¸!³*¸a¿g¹gÀa»jÈ!Ï'É'ÐRSË*ÐVW×V]ÑV]Ð^_ÓV`×VfÑVfÓVhÐ2hÑ/ˆˆj˜* iØÒAœrŸv™v j°"°jÓA×HÑHÓJˆØ—‘˜h¨Ó+×1Ñ1Ó3ˆÜ—‘Ð8¸"¸eÓDˆÜˆu‹:˜Š>ØÜ�h Ó%ˆÜ�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+   r3   ÚIÚfindÚstartr,   r.   Ú
startswith)r5   Úopen_tag_rer8   ÚgtÚiÚdepthÚmms          r   Úextract_balanced_divrM   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                 óJ  ‡ — 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  ¬«      }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[_-]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>z,href="(?!https?://|//|#|javascript:)([^"]+)"c                 óB   •— dt        ‰| j                  d«      «      › d�S )Nzhref="r!   ú"©r   r.   ©rL   r   s    €r   ú<lambda>zfetch_detail.<locals>.<lambda>q   s    ø€  &¬°°b·h±h¸q³kÓ)BÐ(CÀ1Ð E€ r@   zsrc="(?!https?://|//)([^"]+)"c                 óB   •— dt        ‰| j                  d«      «      › d�S )Nzsrc="r!   rQ   rR   rS   s    €r   rT   zfetch_detail.<locals>.<lambda>s   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+   r3   r.   r/   r-   r0   Úsplitr1   rM   rD   )r   r5   r*   r8   r<   r=   ÚcontentÚcs   `       r   Úfetch_detailrY   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˜W eÓ,¨QÑ/×5Ñ5Ó7ˆ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.htmlz  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>r%   r   r"   z*\.(pdf|doc|docx|xls|xlsx|zip|rar|caj|wps)$Údownloadu   é™„ä»¶)r*   r   F)Úensure_asciiz[])	r*   r   Ú
source_urlr)   Ú	site_namerW   ÚsummaryÚattachmentsÚ
group_namez	  Total: rW   Únpq_hjpj)ÚsetÚrangeÚLIST_URLÚBASEÚCOL_DIRr   r   r?   r2   ÚCUTOFFÚaddrY   r+   r,   r-   r.   r0   r/   r3   rD   Úlowerr4   Ú	SITE_NAMEÚjsonÚdumpsÚ
GROUP_NAMEr   )Ú	max_pagesÚrecordsÚseenÚpgr   r5   r7   Úitr*   r<   rW   r>   ÚattsÚamÚhÚtr   Úvalids                     r   Úrunr{   z   s�  € Ø€GÜ‹5€DÜ�IÓó &ˆØ š'�h¤t¬g¡~¸'À"ÀqÁ&ÀÈÐ8OÑ'OˆÜ�S‹zˆÙÜ�G˜B ™F˜8Ð#6Ð7Ô8ÚÜ˜d CÓ(ˆÙÜ�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Ü(ñ	ö ò'	ð&ôN 
ˆ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] r[   r\   )r   )*Ú__doc__r   Úosr   r+   Úargparsern   r   r   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   ÚnowÚstrftimerj   rm   rp   r   rh   ri   rg   r   r?   rM   rY   r{   Ú__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Ø(ñ€ð  €Ø
J€Ø�'‰>˜CÑ€òòò"ò(*-óZ.ðb ˆzÒØ	 ˆ×	 Ñ	 Ó	"€BØ‡O�O�I C°€OÔ3Ø�=‰=‹?€DÙˆD�J‰J‹€AÙ	ˆI�i�[  1 # VÐ
,Õ-ð r@   