Ë
    [–zjy&  ã                   ód  — 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
 ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ dZedz   ZdZdZd	Zd
ZeedœZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z e!dk(  r e «        yy)uÑ  
é•‡æ±Ÿç»�æµŽæŠ€æœ¯å¼€å�‘åŒº - é¡¹ç›®çŽ¯è¯„ï¼ˆå®¡æ‰¹ï¼‰çˆ¬è™«
æ �ç›®: https://www.zjna.gov.cn/zjna/fdzdgknr/xxgk.shtml -> å…¬å…±ç›‘ç®¡ > ç”Ÿæ€�çŽ¯å¢ƒ > é¡¹ç›®çŽ¯è¯„ï¼ˆå®¡æ‰¹ï¼‰
åˆ—è¡¨: https://www.zjna.gov.cn/zjna/xxgkxmhpjgys/xxgk_list.shtml
  æ³¨æ„�: å¿…é¡» https://www.zjna.gov.cn (å¸¦www+https), è£¸åŸŸå�� 502
  é�™æ€�åˆ†é¡µ: xxgk_list_N.shtml (createPageHTML 36é¡µ 706æ�¡, 20æ�¡/é¡µ)
è¯¦æƒ…: /zjna/xxgkxmhpjgys/YYYYMM/UUID.shtml
  æ ‡é¢˜: <meta name="ArticleTitle"> (å®Œæ•´)
  æ­£æ–‡: div#zoomcon (UCAP CMS, <UCAPCONTENT> åŒ…è£¹), ä¿�ç•™ <p>/<table> HTML
  é™„ä»¶: æ­£æ–‡è¡¨æ ¼å†…åµŒ <a href="ç›¸å¯¹è·¯å¾„/files/*.pdf">é™„ä»¶å��</a> (urljoin ç»�å¯¹åŒ–)
ç”¨æ³•: python3 crawl_zjna_xmhpjgys.py [--pages=N] [--limit=N]
é    N)Úurljoin)Úpush_to_searchdbzhttps://www.zjna.gov.cnz"/zjna/xxgkxmhpjgys/xxgk_list.shtmlu4   é•‡æ±Ÿç»�æµŽæŠ€æœ¯å¼€å�‘åŒº-é¡¹ç›®çŽ¯è¯„ï¼ˆå®¡æ‰¹ï¼‰u   é¡¹ç›®çŽ¯è¯„ï¼ˆå®¡æ‰¹ï¼‰é$   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36)z
User-AgentÚRefererz
2020-01-01c                  ó   — d\  } }t         j                  dd  D ]`  }|j                  d«      rt        |j	                  d«      d   «      } Œ2|j                  d«      sŒDt        |j	                  d«      d   «      }Œb | |fS )N)r   r   é   z--pages=ú=z--limit=)ÚsysÚargvÚ
startswithÚintÚsplit)ÚpagesÚlimitÚas      ú(/root/gov_crawler/crawl_zjna_xmhpjgys.pyÚ
parse_argsr   "   st   € Ø�L€Eˆ5Ü�X‰X�a�bˆ\ò )ˆØ�<‰<˜
Ô#Ü˜Ÿ™ › Q™Ó(‰EØ�\‰\˜*Õ%Ü˜Ÿ™ › Q™Ó(‰Eð	)ð
 �%ˆ<Ðó    c                 ó  — t        j                  | xs d«      } t        j                  d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*z^&middot;?\s*&nbsp;?\s*)Úhtml_modÚunescapeÚreÚsubÚstrip)Úts    r   Úclean_titler   ,   sm   € Ü×Ñ˜!š'˜rÓ"€AÜ
�‰Ð0°"°aÓ8€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰Ð" B¨Ó*€AÜ
�‰Ð)¨2¨qÓ1€AØ�7‰7‹9Ðr   c                 ó  — |dk(  rt         }nt        › d|› d�}	 | j                  |d¬«      }|j                  dk7  ryd|_        |j
                  |fS # t        $ r+}t        d	|› d
|› �t        j                  ¬«       Y d}~yd}~ww xY w)u6   é�™æ€�åˆ†é¡µ: xxgk_list.shtml (p1) / xxgk_list_N.shtmlr   z/zjna/xxgkxmhpjgys/xxgk_list_ú.shtmlé   ©ÚtimeoutéÈ   )NNúutf-8z  [WARN] fetch_list pz	 failed: ©ÚfileN)
ÚLIST_URLÚBASE_URLÚgetÚstatus_codeÚencodingÚtextÚ	ExceptionÚprintr
   Ústderr)ÚsessionÚpageÚurlÚrÚes        r   Ú
fetch_listr6   5   s‹   € àˆq‚yÜ‰ä�
Ð7¸°v¸VÐDˆðØ�K‰K˜ RˆKÓ(ˆØ�=‰=˜CÒØØˆŒ
Ø�v‰v�sˆ{ÐøÜò ÜÐ% d V¨9°Q°CÐ8¼s¿z¹zÕJÜûðús   š"A ½A Á	BÁ!BÂBc                 óÄ  — g }t        j                  d| t         j                  «      D ]µ  }|j                  d«      |j                  d«      |j                  d«      j	                  «       }}}|j                  d«      sŒVt        t        |«      }t        |«      }t        j                  d|«      }|r|j                  d«      nd}|r|sŒ¡|j                  |||dœ«       Œ· |S )	u7   è§£æž� ul.pageList.newsList > li > a[title] + span.timezl<li>\s*<a href=\"([^\"]+)\"[^>]*title=\"([^\"]*)\"[^>]*>.*?</a>\s*<span class=\"time\">\s*([^<]+?)\s*</span>r   é   é   r    ú(\d{4}-\d{2}-\d{2})r   )r3   ÚtitleÚdate)r   ÚfinditerÚSÚgroupr   Úendswithr   r)   r   ÚsearchÚappend)Ú	html_textÚitemsÚmÚhrefr;   r<   r3   s          r   Ú
parse_listrG   F   sÛ   € à€Eä�[‰[ð  Ið  KTô  VX÷  VZñ  VZó  [ò 
AˆØŸG™G A›J¨¯©°«
°A·G±G¸A³J×4DÑ4DÓ4F�TˆeˆØ�}‰}˜XÔ&ØÜ”h Ó%ˆÜ˜EÓ"ˆÜ�y‰yÐ/°Ó6ˆÙ $ˆt�z‰z˜!Œ}¨"ˆÙ™DØØ�‰˜S¨5¸$Ñ?Õ@ð
Að €Lr   c                 óÜ  ‡— t        j                  dd| «      } ˆfd„}t        j                  d|| «      } t        j                  dˆfd„| «      } t        j                  dd| «      } t        j                  dd| «      } t        j                  d	d
| «      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd„ | «      } t        j                  dd„ | «      } t        j                  dd| t         j                  ¬«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } | j                  «       S )u6   æ­£æ–‡æ¸…æ´—: ä¿�ç•™ <p>/<table> HTML, é™„ä»¶ç»�å¯¹åŒ–z</?UCAPCONTENT>r   c                 ó°   •— | j                  d«      }|j                  d«      r| j                  d«      S t        ‰|«      }d|› d| j                  d«      › �S )Nr   )zhttp://zhttps://zjavascript:zmailto:ztel:r   z	<a href="ú"r8   )r?   r   r   )rE   rF   Úabs_urlÚpage_urls      €r   Ú_abszclean_content.<locals>._abs]   sR   ø€ Ø�w‰w�q‹zˆØ�?‰?ÐTÔUØ—7‘7˜1“:ÐÜ˜( DÓ)ˆØ˜7˜) 1 Q§W¡W¨Q£Z LÐ1Ð1r   z<a\s+href="([^"]+)"([^>]*)>z<img\s+src=\"([^\"]+)\"c                 óB   •— dt        ‰| j                  d«      «      › d�S )Nz
<img src="r   rJ   )r   r?   )rE   rL   s    €r   ú<lambda>zclean_content.<locals>.<lambda>d   s'   ø€ ¸jÌÐQYÐ[\×[bÑ[bÐcdÓ[eÓIfÐHgÐghÐ<i€ r   z<script[\s\S]*?</script>z<style[\s\S]*?</style>z<p[^>]*>z<p>z</?o:p>z<o:p[\s\S]*?</o:p>z1<(table|tbody|thead|tr|td|th|div|span|br)([^>]*)>c                 ó,   — d| j                  d«      › d�S )Nú<r   ú>©r?   ©rE   s    r   rO   zclean_content.<locals>.<lambda>n   s   € ÐXYÐZ[×ZaÑZaÐbcÓZdÐYeÐefÐVg€ r   z+</(table|tbody|thead|tr|td|th|div|span|br)>c                 ó,   — d| j                  d«      › d�S )Nz</r   rR   rS   rT   s    r   rO   zclean_content.<locals>.<lambda>o   s   € ÐRTÐUV×U\ÑU\Ð]^ÓU_ÐT`Ð`aÐPb€ r   z)</?(?:font|b|strong|em|u|sup|sub)\b[^>]*>)Úflagsz[\u3000\xa0]r   z<p>\s*(?:&nbsp;)?\s*</p>z\r\nú
)r   r   ÚIr   )Úraw_htmlrL   rM   s    ` r   Úclean_contentrZ   X   s.  ø€ ô �v‰vÐ(¨"¨hÓ7€Hô2ô �v‰vÐ4°d¸HÓE€HÜ�v‰vÐ0Ó2iÐksÓt€Hä�v‰vÐ1°2°xÓ@€HÜ�v‰vÐ/°°XÓ>€Hä�v‰v�k 5¨(Ó3€Hä�v‰v�j " hÓ/€HÜ�v‰vÐ+¨R°Ó:€Hä�v‰vÐJÑLgÐiqÓr€HÜ�v‰vÐDÑFbÐdlÓm€Hä�v‰vÐBÀBÈÔXZ×X\ÑX\Ô]€Hä�v‰v�o s¨HÓ5€Hä�v‰vÐ1°2°xÓ@€Hä�v‰v�g˜t XÓ.€HØ�>‰>ÓÐr   c                 óÆ  — 	 | j                  |d¬«      }|j                  dk7  ryd|_        |j                  }t        j                  d	|«      }|rt        |j                  d
«      «      nd}|s4t        j                  d|«      }|rt        |j                  d
«      «      nd}d}t        j                  d|«      }|r:t        j                  d|j                  d
«      «      }|r|j                  d
«      nd}d}	t        j                  d|t        j                  «      }|rt        |j                  d
«      |«      }	|	sBt        j                  d|t        j                  «      }|rt        |j                  d
«      |«      }	g }
ddlm}  |d|	› d�d«      }|j!                  dd¬«      D ]{  }|d   }|j#                  d¬«      }t        j                  d|t        j$                  «      sd|j'                  «       v sŒR|
j)                  |xs |j+                  d«      d   |dœ«       Œ} |||	|
|d œS # t        $ r+}t        d|› d|› �t        j                  ¬«       Y d}~yd}~ww xY w)!u)   æŠ“è¯¦æƒ…é¡µ: æ ‡é¢˜/æ—¥æœŸ/æ­£æ–‡/é™„ä»¶r!   r"   r$   Nr%   z  [WARN] fetch_detail failed z: r&   z!ArticleTitle"\s+content="([^"]*)"r   r   z<title>([^<]*)</title>zPubDate"\s+content="([^"]*)"r:   z/<div[^>]*id="zoomcon"[^>]*>(.*?)</div>\s*</div>zD<div[^>]*class="article-content[^"]*"[^>]*>(.*?)<div class="article-r   )ÚBeautifulSoupz<div>z</div>zhtml.parserr   T)rF   rF   )r   ú.\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|7z)(\?|$)Údownloadú/éÿÿÿÿ)Únamer3   )r;   Úpub_dateÚcontentÚattachmentsr3   )r*   r+   r,   r-   r.   r/   r
   r0   r   rA   r   r?   r>   rZ   Úbs4r\   Úfind_allÚget_textrX   ÚlowerrB   r   )r1   r3   r4   rC   r5   rE   r;   rb   ÚpmÚbodyrd   Ú_BSÚ_soupr   ÚahrefÚatexts                   r   Úfetch_detailro   {   s-  € ðØ�K‰K˜ RˆKÓ(ˆØ�=‰=˜CÒØØˆŒ
Ø—F‘Fˆ	ô 	�	‰	Ð6¸	ÓB€AÙ'(ŒK˜Ÿ™ ›
Ô#¨b€EÙÜ�I‰IÐ/°Ó;ˆÙ+,”˜AŸG™G A›JÔ'°"ˆð €HÜ
�	‰	Ð1°9Ó=€AÙÜ�Y‰YÐ-¨q¯w©w°q«zÓ:ˆÙ"$�2—8‘8˜A”;¨"ˆð €DÜ
�	‰	ÐDÀiÔQS×QUÑQUÓV€AÙÜ˜QŸW™W Q›Z¨Ó-ˆÙÜ�I‰IÐ]Ð_hÔjl×jnÑjnÓoˆÙÜ  §¡¨£¨SÓ1ˆDð €KÝ(Ù�%˜�v˜VÐ$ mÓ4€EØ�^‰^˜C dˆ^Ó+ò VˆØ�&‘	ˆØ—
‘
 �
Ó&ˆÜ�9‰9ÐFÈÌrÏtÉtÔTÐXbÐfk×fqÑfqÓfsÒXsØ×Ñ¨Ò(E°·±¸SÓ1AÀ"Ñ1EÈeÑTÕUð	Vð ØØØ"Øñð øôM ò ÜÐ-¨c¨U°"°Q°CÐ8¼s¿z¹zÕJÜûðús   ‚"H, ¥H, È,	I È5!IÉI c                  óø  — t        «       \  } }| sd} | t        kD  rt        } t        j                  «       }|j                  j                  t        «       g }t        «       }t        d| dz   «      D ]Õ  }t        ||«      \  }}|st        d|› d�«        n³t        |«      }|st        d|› d�«        n•|D �	cg c]  }	|	d   |vsŒ|	‘Œ }
}	|j                  d„ |D «       «       |j                  |
«       t        d|› dt        |
«      › d	t        |«      › d
�«       |rt        |«      |k\  r|d | } nt        j                  d«       Œ× t        dt        |«      › d�«       g }t!        |d«      D �]E  \  }	}t#        ||d   «      }|r|d   s$t        d|	› dt        |«      › d|d   d d › �«       ŒA|d   xs |d   }|d   xs |d   }|d   }|d   }d}|r8g }|D ]   }|j%                  d|d   › d|d   › d�«       Œ" dj'                  |«      }|r0t)        d„ t+        j,                  d|«      D «       «      }|s|dz   |z   }|j%                  t.        ||||d   |d   |rt1        j2                  |d¬ «      nd!dd"œ«       |	d#z  d$k(  rt        d|	› dt        |«      › d%�«       t        j                  d&«       �ŒH t        d't        |«      › d(�«       t5        |t6        «       t        d)t        |«      › d*�«       y c c}	w )+Né   r   z[PAGE z] fetch failed, stoppingz] 0 items, stoppingr3   c              3   ó&   K  — | ]	  }|d    –— Œ y­w)r3   N© )Ú.0Úis     r   ú	<genexpr>zmain.<locals>.<genexpr>È   s   è ø€ Ò, �A�e•HÑ,ùs   ‚z] +z items (total ú)g      ð?u   
åˆ—è¡¨å…± u    æ�¡, å¼€å§‹æŠ“è¯¦æƒ…...rc   z  [r_   u   ] SKIP ç©ºæ­£æ–‡: r;   é(   rb   r<   rd   r   z<p><a href="z">ra   z</a></p>rW   c              3   ó„   K  — | ]8  }t        j                  d |j                  d«      t         j                  «      –— Œ: y­w)r]   r   N)r   rA   r?   rX   )rt   Ú_ms     r   rv   zmain.<locals>.<genexpr>å   s6   è ø€ ò àô —	‘	ÐKÈRÏXÉXÐVWË[ÔZ\×Z^ÑZ^×_ñùs   ‚>A z<a\s+href="([^"]+)"F)Úensure_asciiz[])Ú	site_namer;   rb   rc   Ú
source_urlr3   rd   Úindustryé
   r   u   ] å·²å¤„ç�†...gš™™™™™é?u   
æœ‰æ•ˆ u    æ�¡, å…¥åº“...u   å®Œæˆ�! æ–°å¢ž/æ›´æ–° u    æ�¡)r   Ú	MAX_PAGESÚrequestsÚSessionÚheadersÚupdateÚHEADERSÚsetÚranger6   r/   rG   ÚextendÚlenÚtimeÚsleepÚ	enumeratero   rB   ÚjoinÚanyr   r=   Ú	SITE_NAMEÚjsonÚdumpsr   ÚCATEGORY)r   r   r1   Ú	all_itemsÚseenÚpgrC   Úlist_urlrD   ru   Ú	new_itemsÚvalidÚitemÚdr;   rb   rc   ÚattÚatt_htmlÚpartsÚ_aÚhas_att_links                         r   Úmainr    ²   s3  € Ü“<�L€Eˆ5ÙØˆØŒyÒÜˆä×ÑÓ €GØ‡O�O×Ñœ7Ô#à€IÜ‹5€DÜ�A�u˜q‘yÓ!ò ˆÜ(¨°"Ó5Ñˆ	�8ÙÜ�F˜2˜$Ð6Ð7Ô8ÙÜ˜9Ó%ˆÙÜ�F˜2˜$Ð1Ð2Ô3ÙØ %Ö>˜1¨¨5©¸Ò)=’QÐ>ˆ	Ð>Ø�‰Ñ, eÔ,Ô,Ø×Ñ˜Ô#Ü��r�d˜#œc )›nÐ-¨^¼CÀ	»NÐ;KÈ1ÐMÔNÙ”S˜“^ uÒ,Ø! & 5Ð)ˆIÙÜ�
‰
�3�ð!ô$ 
ˆLœ˜Y›Ð(Ð(@Ð
AÔBà€EÜ˜Y¨Ó*ó $‰ˆˆ4Ü˜ $ u¡+Ó.ˆÙ˜˜)šÜ�C˜�s˜!œC 	›NÐ+Ð+=¸dÀ7¹mÈCÈRÐ>PÐ=QÐRÔSØà�'‘
Ò+˜d 7™mˆØ�Z‘=Ò0 D¨¡LˆØ�I‘,ˆØ�ÑˆàˆÙØˆEØò O�Ø—‘˜|¨B¨u©I¨;°b¸¸F¹¸ÀHÐMÕNðOà—y‘y Ó'ˆHÙÜñ äŸ+™+Ð&<¸gÓFôó ˆLñ  Ø! D™.¨8Ñ3�Ø�‰Ü"ØØ ØØ˜u™+Ø˜‘;ÙBEœ4Ÿ:™: c¸Õ>È4Øñ	
ô 		ð ˆr‰6�QŠ;Ü�C˜�s˜!œC 	›NÐ+¨>Ð:Ô;Ü�
‰
�3ŽðI$ôL 
ˆI”c˜%“j�\ Ð
1Ô2Ü�UœHÔ%Ü	Ð"¤3 u£: ,¨dÐ
3Õ4ùòi ?s   Â6K7ÃK7Ú__main__)"Ú__doc__Úosr
   r   rŠ   r�   Úhtmlr   r�   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r)   r(   r�   r’   r€   ÚUAr…   ÚCUTOFFr   r   r6   rG   rZ   ro   r    Ú__name__rs   r   r   ú<module>r¯      s¸   ðñ÷ 1× 0× 0Û Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à$€ØÐ:Ñ:€ØB€	Ø%€Ø€	àv€Ø¨Ñ
1€à	€òòòò"ò$ òF4ònI5ðX ˆzÒÙ…Fð r   