Ë
    pB­jÑ(  ã                   óX  — 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dl
Z
ddlmZ ej                  j                  dej                  j                  ej                  j!                  e«      «      «       ddlmZ dZedz   Zedz   Zd	Zd
ZdZdZdZdZdZdZg d¢Z e
j@                  «       Z!e!jD                  jG                  eddœ«       	 e
jH                  jJ                  jM                  «        d„ Z(d„ Z)d„ Z*d„ Z+dd„Z,d„ Z-d„ Z.d„ Z/d d„Z0d„ Z1e2dk(  r e1«        yy# e'$ r Y Œ5w xY w)!u  
å†…è’™å�¤è‡ªæ²»åŒºå�‘å±•å’Œæ”¹é�©å§”å‘˜ä¼šã€Œæ³•å®šä¸»åŠ¨å…¬å¼€å†…å®¹ã€�çˆ¬è™«
æ �ç›®: https://fgw.nmg.gov.cn/zfxxgk/fdzdgknr/?gk=3
åˆ—è¡¨: **JSON æŽ¥å�£**ï¼ˆé¡µé�¢æ˜¯çº¯ JS æ¸²æŸ“ï¼Œé�™æ€� HTML é‡Œæ²¡æœ‰ä»»ä½•æ�¡ç›®ï¼‰
  GET https://fgw.nmg.gov.cn/nmsearch/openSearch/getZwgkListForDept
      ?siteId=67&publisher=&pageNum=<N>&pageSize=100&themecat=&cdesc=
      &sort=time&suitability=1&position=1&keywords=
  â†’ {"state":"200","data":{"data":[â€¦],"total":2524,"pageSize":100,"pageNum":N}}
  âš ï¸� æŽ¥å�£æ�¥è‡ªé¡µé�¢å†…è�” JSï¼ˆvar contextPath / siteId=67ï¼‰ï¼›`publisher` ä¼ ç©ºå�³å…¨é‡�
     ï¼ˆå®žæµ‹ publisher="" / "è‡ªæ²»åŒºç›‘ç‹±ç®¡ç�†å±€" / "å†…è’™å�¤è‡ªæ²»åŒºå�‘å±•å’Œæ”¹é�©å§”å‘˜ä¼š" ä¸‰ç§�å�–å€¼ total å�‡ä¸º 2524ï¼Œ
      è¯´æ˜Žè¯¥å�‚æ•°åœ¨æ­¤æ �ç›®ä¸�ç”Ÿæ•ˆï¼Œä¸�è¦�æ‹¿ JS é‡Œé‚£ä¸ªç¤ºä¾‹å€¼ `è‡ªæ²»åŒºç›‘ç‹±ç®¡ç�†å±€` å½“è¿‡æ»¤æ�¡ä»¶ï¼‰
æ�¡ç›®å­—æ®µ: title / docpuburl(è¯¦æƒ…URL) / docpubtime(å�‘å¸ƒæ—¥æœŸ) / scrq(æˆ�æ–‡æ—¥æœŸ) / docno(å�‘æ–‡å­—å�·)
          publisher(å�‘å¸ƒæœºæž„) / chnldesc / cdesc(ä¸»é¢˜åˆ†ç±») / wenzhongtype(æ–‡ç§�)
  âš ï¸� **zc_doccontent æ˜¯å¹³é“ºçº¯æ–‡æœ¬ï¼ˆå®žæµ‹ 848 å­— / 0 ä¸ª <p>ï¼‰â†’ ç›´æŽ¥ç”¨ä¼šæ‹�å¹³**ï¼Œ
     å¿…é¡»æŠ“ docpuburl è¯¦æƒ…é¡µå�– div.trs_editor_view çš„åˆ†æ®µæ­£æ–‡
è¯¦æƒ…: /zfxxgk/fdzdgknr/bmwj/YYYYMM/tYYYYMMDD_ID.html
      meta ArticleTitle(å�•å¼•å�·) / PubDate æ ¼å¼� `2026å¹´08æœˆ31æ—¥ 10:24` / ContentSource
      æ­£æ–‡ div.trs_editor_view.TRS_UEDITORï¼ˆå®žæµ‹ 31 ä¸ª <p> + 2 ä¸ª <table>ï¼‰
ç”¨æ³•:
  python3 crawl_nmg_zfxxgk.py --pages=1
  python3 crawl_nmg_zfxxgk.py --pages=5
é    N)Úurljoin)ÚBeautifulSoup)Úpush_to_searchdbzhttps://fgw.nmg.gov.cnz'/nmsearch/openSearch/getZwgkListForDeptz/zfxxgk/fdzdgknr/?gk=3éC   éd   u4   å†…è’™å�¤è‡ªæ²»åŒºå�‘æ”¹å§”-æ³•å®šä¸»åŠ¨å…¬å¼€å†…å®¹u   æ”¿åºœä¿¡æ�¯å…¬å¼€u	   å†…è’™å�¤z
2023-09-18zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36é-   )zdiv.trs_editor_view.TRS_UEDITORzdiv.trs_editor_viewz
div.d_bodyzdiv#zoomzdiv.contentzzh-CN,zh;q=0.9)z
User-AgentzAccept-Languagec                  ó–  — d} t         j                  dd  D ]°  }|j                  d«      rt        |j	                  d«      d   «      } Œ2|dk(  sŒ8t        t         j                  «      t         j                  j                  |«      dz   kD  sŒut        t         j                  t         j                  j                  |«      dz      «      } Œ² | S )Nr   é   z--pages=ú=z--pages)ÚsysÚargvÚ
startswithÚintÚsplitÚlenÚindex)ÚpagesÚas     úcrawl_nmg_zfxxgk.pyÚ
parse_argsr   E   s–   € Ø€EÜ�X‰X�a�bˆ\ò 9ˆØ�<‰<˜
Ô#Ü˜Ÿ™ › Q™Ó(‰EØ�)‹^¤¤C§H¡H£´·±·±¸qÓ0AÀAÑ0EÓ EÜœŸ™¤§¡§¡°Ó!2°QÑ!6Ñ7Ó8‰Eð	9ð
 €Ló    c                 óÞ   — t        j                  | xs d«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } | j	                  «       S )NÚ z[\u200b\u200e\u200f\ufeff\xa0]z\s+ú u   ^[â€¢Â·\-â€”]\s*)Úhtml_modÚunescapeÚreÚsubÚstrip)Úts    r   Úclean_titler!   O   sZ   € Ü×Ñ˜!š'˜rÓ"€AÜ
�‰Ð0°"°aÓ8€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰Ð" B¨Ó*€AØ�7‰7‹9Ðr   c                 óò   — t        | xs d«      } t        j                  d| «      }|rPdt        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d«      «      fz  S y)Nr   u)   (\d{4})[-/å¹´.](\d{1,2})[-/æœˆ.](\d{1,2})z%04d-%02d-%02dr
   é   é   )Ústrr   Úsearchr   Úgroup)ÚsÚms     r   Ú	norm_dater*   W   s]   € ÜˆAŠG�‹€AÜ
�	‰	Ð>ÀÓB€AÙØ¤3 q§w¡w¨q£z£?´C¸¿¹À»
³OÄSÈÏÉÐQRËÃ_Ð"UÑUÐUØr   c                 óª  — t         d| t        dddddddœ
}t        d«      D �]@  }	 t        j	                  t
        |dt        it        d¬«      }|j                  d	k7  r.t        d
|j                  z  t        j                  ¬«       g dfc S |j                  r|j                  j                  «       dv rd|_        |j                  «       }t        |j	                  d«      «      dk7  r3t        d|j	                  d«      z  t        j                  ¬«       g dfc S |j	                  d«      xs i }|j	                  d«      xs g t!        |j	                  d«      xs d«      fc S  g dfS # t"        $ r`}|dk(  r5t        dt        |«      dd z  t        j                  ¬«       g dfcY d}~c S t%        j&                  d|dz   z  «       Y d}~�Œ¬d}~ww xY w)u0   è°ƒ JSON æŽ¥å�£å�–ä¸€é¡µï¼›è¿”å›ž (items, total)r   Útimer
   )
ÚsiteIdÚ	publisherÚpageNumÚpageSizeÚthemecatÚcdescÚsortÚsuitabilityÚpositionÚkeywordsr$   ÚRefererF)ÚparamsÚheadersÚtimeoutÚverifyéÈ   z  [WARN] API HTTP %s©Úfiler   )ú
iso-8859-1úlatin-1úutf-8ÚstateÚ200z  [WARN] API state=%sÚdataÚtotalr#   z  [WARN] API failed: %sNr   g      ø?)ÚSITE_IDÚ	PAGE_SIZEÚrangeÚSESSIONÚgetÚAPI_URLÚ	LIST_PAGEÚTIMEOUTÚstatus_codeÚprintr   ÚstderrÚencodingÚlowerÚjsonr%   r   Ú	Exceptionr,   Úsleep)Úpage_numr8   ÚattemptÚrÚjÚdÚes          r   Ú
fetch_listr\   _   s“  € ô ¨°xÌYØ ¨VÀAØ 2ñ€Fô
 ˜“8ó ,ˆð	,Ü—‘œG¨F¸YÌ	Ð<RÜ$+°Eð ó ;ˆAà�}‰} Ò#ÜÐ,¨q¯}©}Ñ<Ä3Ç:Á:ÕNØ˜1�u’Ø—:’: §¡×!1Ñ!1Ó!3Ð7PÑ!PØ$�”
Ø—‘“ˆAÜ�1—5‘5˜“>Ó" eÒ+ÜÐ-°·±°g³Ñ>ÄSÇZÁZÕPØ˜1�u’Ø—‘�f“Ò# ˆAØ—E‘E˜&“MÒ' R¬#¨a¯e©e°G«nÒ.AÀÓ*BÐBÒBð,ð( ˆqˆ5€Løô ò 	,Ø˜!Š|ÜÐ/´#°a³&¸¸#°,Ñ>ÄSÇZÁZÕPØ˜1�u—Ü�J‰J�s˜g¨™kÑ*×+Ò+ûð		,ús2   ¦A"E)ÂBE)ÄAE)Å)	GÅ22GÆ$GÆ,GÇGc           
      ó`  — t        d«      D ]³  }	 t        j                  | d|xs t        it        d¬«      }|j
                  dk(  rK|j                  r|j                  j                  «       dv r|j                  xs d|_        |j                  c S t        d|j
                  ›d	| d d
 ›�t        j                  ¬«        y  y # t        $ ra}|dk(  r6t        d| d d ›dt        |«      d d ›�t        j                  ¬«       Y d }~ y t        j                   d|dz   z  «       Y d }~�Œd }~ww xY w)Nr$   r7   F)r9   r:   r;   r<   )r?   r@   ÚasciiÚcp1252rA   z  [WARN] HTTP r   éZ   r=   r#   z  [WARN] GET failed éP   z: g      ð?r
   )rH   rI   rJ   rL   rM   rN   rQ   rR   Úapparent_encodingÚtextrO   r   rP   rT   r%   r,   rU   )ÚurlÚrefererrW   rX   r[   s        r   Úhttp_getrf   }   s  € Ü˜“8ò ,ˆð	,Ü—‘˜C¨)°WÒ5IÄ	Ð)JÜ$+°Eð ó ;ˆAà�}‰} Ò#Ø—z’z Q§Z¡Z×%5Ñ%5Ó%7Ð;gÑ%gØ!"×!4Ñ!4Ò!?¸�A”JØ—v‘v’Ý¨1¯=«=¸#¸c¸r¹(ÐCÌ#Ï*É*ÕUÙð,ð øô ò 	,Ø˜!Š|Ý°c¸#¸2²hÄÀAÃÀsÈÁÐLÔSV×S]ÑS]Õ^ÝÜ�J‰J�s˜g¨™kÑ*×+Ò+ûð		,ús$   �A>CÂ.CÃ	D-Ã5D(ÄD(Ä(D-c                 ó(  — dD ]�  \  }}| j                  |«      D ]t  }|j                  |«      xs dj                  «       }|r|j                  d«      rŒ:|j                  d«      r	d|z   ||<   ŒT|j                  d«      rŒft	        ||«      ||<   Œv Œ� y )N))r   Úhref)ÚimgÚsrcr   )zjavascript:zmailto:ztel:ú#zdata:ú//úhttps:Úhttp)Úfind_allrJ   r   r   r   )ÚsoupÚpage_urlÚtagÚattrr    Úvs         r   Ú
absolutizeru   �   s�   € Ø4ò /‰	ˆˆTØ—‘˜sÓ#ò 	/ˆAØ—‘�t“Ò" ×)Ñ)Ó+ˆAÙ˜Ÿ™Ð%UÔVØØ�|‰|˜DÔ!Ø" Q™,��$’Ø—\‘\ &Õ)Ü! (¨AÓ.��$’ñ	/ñ/r   c                 ó2  — | €y| j                  g d¢«      D ]  }|j                  «        Œ | j                  d«      D ]  }|j                  «        Œ t        | |«       g }| j                  g d¢d¬«      D ]M  }|j                  dk(  rt        |«      }nt        |j                  dd¬	«      «      }|sŒ=|j                  |«       ŒO |s!t        | j                  d
d¬	«      «      }|r|g}d
j                  d„ |D «       «      }t        j                  dd|«      }|S )Nr   )ÚscriptÚstyleÚiframeÚnoscriptzFdiv.article-share-group, div.article-share-more, div.favoriteContainer)ÚpÚtableÚh1Úh2Úh3Úh4T)Ú	recursiver|   r   ©r   ú
c              3   óh   K  — | ]*  }|j                  «       j                  d «      r|nd|z  –— Œ, y­w)z<tableú	<p>%s</p>N)r   r   )Ú.0r{   s     r   ú	<genexpr>z clean_content.<locals>.<genexpr>²   s-   è ø€ Ò]ÐRS˜!Ÿ'™'›)×.Ñ.¨xÔ8‘Q¸kÈA¹oÓMÑ]ùs   ‚02z
<p>\s*</p>)ro   Ú	decomposeÚselectru   Únamer%   r!   Úget_textÚappendÚjoinr   r   )	Únoderq   ÚbadÚbÚpartsÚelÚtxtr    Úbodys	            r   Úclean_contentr•   œ   s  € Ø€|ØØ�}‰}ÒFÓGò ˆØ�‰�ðà�[‰[ÐaÓbò ˆØ	�‰�ðäˆt�XÔà€EØ�m‰mÒBÈdˆmÓSò ˆØ�7‰7�gÒÜ�b“'‰Cä˜bŸk™k¨#°T˜kÓ:Ó;ˆCÚØ�L‰L˜Õðñ Ü˜Ÿ™ d°$˜Ó7Ó8ˆÙØ�CˆEà�9‰9Ñ]ÐW\Ô]Ó]€DÜ�6‰6�-  TÓ*€DØ€Kr   c                 óÐ  — g }t        «       }t        j                  d| t        j                  «      D ]±  }|j	                  d«      j                  «       }|j                  d«      rd|z   }n|j                  d«      st        ||«      }||v rŒ[|j                  |«       |j                  t        j                  j                  |j                  d«      d   «      d d |d	œ«       Œ³ |S )
Nz6href="([^"]+\.(?:pdf|docx?|xlsx?|zip|rar|wps|7z|txt))"r
   rl   rm   rn   ú?r   éx   )rŠ   rd   )Úsetr   ÚfinditerÚIr'   r   r   r   ÚaddrŒ   ÚosÚpathÚbasenamer   )Ú	html_textrq   ÚattsÚseenr)   Úus         r   Úextract_attsr¤   ·   sÇ   € Ø€DÜ‹5€DÜ�[‰[ÐRÐT]Ô_a×_cÑ_cÓdò 	QˆØ�G‰G�A‹J×ÑÓˆØ�<‰<˜ÔØ˜1‘‰AØ—‘˜fÔ%Ü˜ !Ó$ˆAØ�‰9ØØ�‰�ŒØ�‰œRŸW™W×-Ñ-¨a¯g©g°c«l¸1©oÓ>¸tÀÐDÈQÑOÕPð	Qð €Kr   c                 óä  — t        | «      }|s|ddg fS t        |d«      }|}|j                  dddi«      }|r#|j                  d«      rt	        |d   «      xs |}d}|j                  dddi«      }|r|j                  d«      rt        |d   «      }d }t        D ]9  }	|j                  |	«      }
|
sŒt        |
j                  dd	¬
«      «      dkD  sŒ7|
} n t        || «      }|||t        || «      fS )Nr   zhtml.parserÚmetarŠ   ÚArticleTitleÚcontentÚPubDater   Tr‚   é   )rf   r   ÚfindrJ   r!   r*   ÚCONTENT_SELECTORSÚ
select_oner   r‹   r•   r¤   )rd   Úfallback_titler    rp   ÚtitleÚmtÚdateÚmprŽ   ÚselÚcandr”   s               r   Úfetch_detailrµ   Ç   s  € Ü˜“€IÙØ˜r 2 rÐ)Ð)Ü˜ MÓ2€Dà€EØ	�‰�6˜F NÐ3Ó	4€BÙ	ˆb�f‰f�YÔÜ˜B˜y™MÓ*Ò3¨eˆà€DØ	�‰�6˜F IÐ.Ó	/€BÙ	ˆb�f‰f�YÔÜ˜˜I™Ó'ˆà€DÜ ò ˆØ�‰˜sÓ#ˆÚ”C˜Ÿ™ c°˜Ó6Ó7¸"Ó<ØˆDÙð	ô
 ˜˜sÓ#€DØ�$˜œl¨9°cÓ:Ð:Ð:r   c                  óª  — t        «       } | sd} g }t        «       }d}t        d| dz   «      D �]f  }t        |«      \  }}|st	        d|z  «        �nE|dk(  r(|r&t	        d|t
        |t
        z   dz
  t
        z  fz  «       d}d}|D �]ð  }|j                  d«      xs dj                  «       }	|	sŒ*|	j                  d«      rd	|	z   }	n!|	j                  d
«      st        t        |	«      }	|	|v rŒg|j                  |	«       t        |j                  d«      «      xs6 t        |j                  d«      «      xs t        |j                  d«      «      }
|
r|
t        k  r|dz  }ŒÛt        |j                  d«      xs |j                  d«      xs d«      }|s�Œt        |	|«      \  }}}}|}|r2dj!                  d„ |D «       «      }|r|dz   |z   j                  «       n|}|r1t#        t%        j&                  dd|«      j                  «       «      dk  r	d|xs |z  }|j)                  t*        |xs ||xs |
||	|	|rt-        j.                  |d¬«      ndt0        ddœ	«       |dz  }t3        j4                  d«       �Œó t	        d|||t#        |«      fz  «       �Œi t	        dt#        |«      z  «       t7        |t8        «       t	        dt#        |«      z  «       y )Né   r   r
   u)   [PAGE %d] 0 rows (æŽ¥å�£è¾¹ç•Œ), stoppingu2   [INFO] æŽ¥å�£ total=%d, pageSize=%d â†’ çº¦ %d é¡µÚ	docpuburlr   rl   rm   rn   Ú
docpubtimeÚopertimeÚscrqr¯   Úzc_doctitlerƒ   c              3   ó:   K  — | ]  }d |d   ›d|d   ›d�–— Œ y­w)z<p><a href="rd   z">rŠ   z</a></p>N© )r†   r   s     r   r‡   zmain.<locals>.<genexpr>  s   è ø€ ÒcÑYZÀÀ%ÃÈ!ÈFË)Ô TÑcùs   ‚z<[^>]*>?é
   r…   F)Úensure_asciiz[])	Ú	site_namer¯   Úpub_dater¨   Ú
source_urlrd   ÚattachmentsÚ
group_nameÚindustrygš™™™™™É?u/   [PAGE %d] +%d items (CUTOFFæˆªæ–­ %d, total %d)u   
æœ‰æ•ˆ %d æ�¡, å…¥åº“...u   å®Œæˆ�! æ–°å¢ž/æ›´æ–° %d æ�¡)r   r™   rH   r\   rO   rG   rJ   r   r   r   ÚBASE_URLrœ   r*   ÚCUTOFFr!   rµ   r�   r   r   r   rŒ   Ú	SITE_NAMErS   ÚdumpsÚGROUPr,   rU   r   ÚCATEGORY)r   Ú	all_itemsr¢   rE   ÚpgÚrowsÚn_newÚn_cutÚrowr£   r±   r¯   Úd_titleÚd_dater”   r¡   r¨   Úsegs                     r   ÚmainrÖ   á   sÑ  € Ü‹L€EÙØˆà€IÜ‹5€DØ€EÜ�A�u˜q‘yÓ!ó /fˆÜ  “n‰ˆˆeÙÜÐ=ÀÑBÔCÚØ�Š7‘uÜÐFÈ%ÔQZÐ]bÔenÑ]nÐqrÑ]rô  xAñ  ]Að  JBñ  Bô  CØˆØˆØó %	ˆCØ—‘˜Ó%Ò+¨×2Ñ2Ó4ˆAÙØØ�|‰|˜DÔ!Ø˜q‘L‘Ø—\‘\ &Ô)ÜœH aÓ(�Ø�D‰yØØ�H‰H�QŒKÜ˜SŸW™W \Ó2Ó3Òs´yÀÇÁÈÓATÓ7UÒsÔYbÐcf×cjÑcjÐkqÓcrÓYsˆDÙ˜œvšØ˜‘
�ØÜ §¡¨Ó 0Ò P°C·G±G¸MÓ4JÒ PÈbÓQˆEÙÙÜ*6°q¸%Ó*@Ñ'ˆG�V˜T 4ØˆGÙØ—i‘iÑcÐ^bÔcÓc�Ù<C˜7 T™>¨CÑ/×6Ñ6Ô8È�Ùœc¤"§&¡&¨°b¸'Ó"B×"HÑ"HÓ"JÓKÈbÒPØ%¨Ò)9°EÑ:�Ø×ÑÜ&Ø Ò) EØ"šN dØ"ØØÙGKœtŸz™z¨$¸UÕCÐQUÜ#Øñ
ô 
ð �Q‰JˆEÜ�J‰J�sŽOðK%	ôL 	Ð?À2ÀuÈeÔUXÐYbÓUcÐBdÑdÖeð_/fôb 
Ð
&¬¨Y«Ñ
7Ô8Ü�Y¤Ô)Ü	Ð
(¬3¨y«>Ñ
9Õ:r   Ú__main__)N)r   )3Ú__doc__r�   r   r   r,   rS   Úhtmlr   Úurllib.parser   ÚrequestsÚbs4r   rž   ÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   rÇ   rK   rL   rF   rG   rÉ   rÌ   rË   rÈ   ÚUArM   r¬   ÚSessionrI   r9   ÚupdateÚpackagesÚurllib3Údisable_warningsrT   r   r!   r*   r\   rf   ru   r•   r¤   rµ   rÖ   Ú__name__r¾   r   r   ú<module>ré      sF  ðñó, 
Û 	Û 
Û Û Û Ý  ã Ý à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à#€Ø
Ð>Ñ
>€ØÐ/Ñ/€	Ø
€Ø€	ØB€	Ø€Ø€Ø	€ð;€à
€òÐ ð ˆ(×
Ñ
Ó
€Ø ‡�× Ñ  bÐ=MÑNÔ Oð	Ø×Ñ×Ñ×.Ñ.Ô0ò
òòòó<ò&	/òò6ó ;ò4;;ð| ˆzÒÙ…Fð øð} ò 	Ùð	ús   Ã$D! Ä!D)Ä(D)