Ë
    á“zjâ  ã                   ó‚  — 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dZedz   ez   dz   Zd	Zd
ZdZdddedz   ddœZ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)uo  
ä¸ƒå�°æ²³å¸‚äººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Š çˆ¬è™«
æ �ç›®: https://www.qth.gov.cn/qth/c100183/list.shtml
CMS: é»‘é¾™æ±Ÿæ”¿åºœç«™ç¾¤ (UCMS) â€” /common/search/ JSON API
åˆ—è¡¨ API: /common/search/{channelId}?_isAgg=false&_isJson=true&_pageSize=N&_template=index&_rangeTimeGte=&_channelName=&page=N
  channelId: e9ff8bea997945789925c7aa8cb39f2a (c100183 å…¬ç¤ºå…¬å‘Š)
  total: 518 æ�¡, 10æ�¡/é¡µ (52é¡µ)
  API ç›´ä¾› contentHtml å®Œæ•´æ­£æ–‡ (å�« <p>) â†’ æ— éœ€æŠ“è¯¦æƒ…é¡µ
è¯¦æƒ…: /qth/c100183/YYYYMM/UUID.shtml
æ ‡é¢˜: title å­—æ®µ (å®Œæ•´)
ç”¨æ³•:
  python3 crawl_qth_gsgg.py --pages=5
  python3 crawl_qth_gsgg.py --pages=1
é    N)Úurljoin)Úpush_to_searchdbzhttps://www.qth.gov.cnÚ e9ff8bea997945789925c7aa8cb39f2az/common/search/z\?_isAgg=false&_isJson=true&_pageSize=10&_template=index&_rangeTimeGte=&_channelName=&page=%du%   ä¸ƒå�°æ²³å¸‚äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Šu   å…¬ç¤ºå…¬å‘Šé4   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36z.application/json, text/javascript, */*; q=0.01zzh-CN,zh;q=0.9z/qth/c100183/list.shtmlÚXMLHttpRequest)z
User-AgentÚAcceptzAccept-LanguageÚRefererzX-Requested-Withé   c                  ó®  — d} t         j                  dd  D ]¼  }|j                  d«      rt        |j	                  d«      d   «      } Œ2|j                  d«      sŒDt        t         j                  «      t         j                  j                  |«      dz   kD  sŒ�t        t         j                  t         j                  j                  |«      dz      «      } Œ¾ | S )Nr   é   z--pages=ú=z--pages)ÚsysÚargvÚ
startswithÚintÚsplitÚlenÚindex)ÚpagesÚas     ú#/root/gov_crawler/crawl_qth_gsgg.pyÚ
parse_argsr   *   s›   € Ø€EÜ�X‰X�a�bˆ\ò 9ˆØ�<‰<˜
Ô#Ü˜Ÿ™ › Q™Ó(‰EØ�\‰\˜)Õ$¬¬S¯X©X«¼¿¹¿¹ÈÓ9JÈQÑ9NÓ)NÜœŸ™¤§¡§¡°Ó!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#   4   sZ   € Ü×Ñ˜!š'˜rÓ"€AÜ
�‰Ð0°"°aÓ8€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰Ð" B¨Ó*€AØ�7‰7‹9Ðr   c                 ój  — t         | z  }t        d«      D ]Z  }	 t        j                  |t        t
        ¬«      }|j                  dk(  r|j                  «       c S 	 t        j                  d«       Œ\ y # t        $ r6}|dk(  r't        d| › d|› �t        j                  ¬«       Y d }~ y Y d }~ŒRd }~ww xY w)	Né   ©ÚheadersÚtimeoutéÈ   é   z  [WARN] API pz	 failed: ©Úfileg      ø?)ÚAPI_TPLÚrangeÚrequestsÚgetÚHEADERSÚTIMEOUTÚstatus_codeÚjsonÚ	ExceptionÚprintr   ÚstderrÚtimeÚsleep)ÚpageÚurlÚattemptÚrÚes        r   Ú	fetch_apir?   <   sŸ   € Ü
�D‰.€CÜ˜“8ò 	ˆð	Ü—‘˜S¬'¼7ÔCˆAØ�}‰} Ò#Ø—v‘v“x’ð $ô 	�
‰
�3�ð	ð øô ò 	Ø˜!Š|Ü˜ t f¨I°a°SÐ9ÄÇ
Á
ÕKÝô ûð	ús   ™>A3Á3	B2Á<&B-Â-B2c                 óˆ  ‡‡— t        j                  dd| «      } t        j                  dd| «      } ˆfd„Št        j                  dˆf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                  ¬«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } | j                  «       S )ul   æ­£æ–‡æ¸…æ´—: ä¿�ç•™ <p>/<table> HTML, é™„ä»¶/å›¾ç‰‡ç»�å¯¹åŒ– (ä»¥è¯¦æƒ…é¡µ URL ä¸ºåŸºå�€ä¿�ç•™æ �ç›®è·¯å¾„)z<script[\s\S]*?</script>r   z<style[\s\S]*?</style>c                 óB   •— | j                  d«      r| S t        ‰| «      S ©N)zhttp://zhttps://zjavascript:zmailto:ztel:zdata:ú#©r   r   ©ÚuÚpage_urls    €r   Ú_abs_urlzclean_content.<locals>._abs_urlP   s"   ø€ Ø�<‰<Ð_Ô`ØˆHÜ�x Ó#Ð#r   z<a\s+href="([^"]+)"c                 ó:   •— d ‰| j                  d«      «      › d�S )Nz	<a href="r   ú"©Úgroup©ÚmrH   s    €r   ú<lambda>zclean_content.<locals>.<lambda>T   s    ø€ ¸)ÁHÈQÏWÉWÐUVËZÓDXÐCYÐYZÐ8[€ r   z<img\s+src="([^"]+)"c                 ó:   •— d ‰| j                  d«      «      › d�S )Nz
<img src="r   rJ   rK   rM   s    €r   rO   zclean_content.<locals>.<lambda>U   s    ø€ ¸:ÁhÈqÏwÉwÐWXËzÓFZÐE[Ð[\Ð9]€ r   z<p[^>]*>z<p>z</?span[^>]*>z,<(table|tbody|thead|tr|td|th|div|br)([^>]*)>c                 ó,   — d| j                  d«      › d�S )Nú<r   ú>rK   ©rN   s    r   rO   zclean_content.<locals>.<lambda>[   s   € ÐSTÐUV×U\ÑU\Ð]^ÓU_ÐT`Ð`aÐQb€ r   z&</(table|tbody|thead|tr|td|th|div|br)>c                 ó,   — d| j                  d«      › d�S )Nz</r   rS   rK   rT   s    r   rO   zclean_content.<locals>.<lambda>\   s   € ÈRÐPQ×PWÑPWÐXYÓPZÈ|Ð[\ÐK]€ 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_htmlrG   rH   s    `@r   Úclean_contentrZ   K   s	  ù€ ä�v‰vÐ1°2°xÓ@€HÜ�v‰vÐ/°°XÓ>€Hô$ô �v‰vÐ,Ó.[Ð]eÓf€HÜ�v‰vÐ-Ó/]Ð_gÓh€Hä�v‰v�k 5¨(Ó3€Hä�v‰vÐ&¨¨HÓ5€Hä�v‰vÐEÑGbÐdlÓm€HÜ�v‰vÐ?ÑA]Ð_gÓh€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           	      óò  — 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 |j                  d«      d	   t        ||«      d
œ«       Œµ |rt        j                  |d¬«      S dS )uN   ä»Žæ­£æ–‡æ��å�–é™„ä»¶é“¾æŽ¥ (pdf/doc/xls/zip ç­‰), è¿”å›ž JSON æ•°ç»„å­—ç¬¦ä¸²z"<a\s+href="([^"]+)"[^>]*>(.*?)</a>r   ú<[^>]+>r   r*   z2\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|7z|txt)(\?|$)Údownloadú/éÿÿÿÿ)Únamer;   F)Úensure_asciiz[])r   ÚfinditerÚSrL   r    r!   ÚsearchrX   ÚlowerÚappendr   Ú_abs_url_outerr4   Údumps)ÚcontentrG   ÚattsÚamÚahrefÚatexts         r   Úextract_attachmentsrn   f   sÊ   € à€DÜ�k‰kÐ?ÀÌ"Ï$É$ÓOò iˆØ—x‘x “{¤B§F¡F¨:°r¸2¿8¹8ÀA»;Ó$G×$MÑ$MÓ$OˆuˆÜ�9‰9ÐJÈEÔSU×SWÑSWÔXÐ\fÐjo×juÑjuÓjwÒ\wØ�K‰K Ò!>¨%¯+©+°cÓ*:¸2Ñ*>Ä~ÐV[Ð]eÓGfÑgÕhðiñ 48Œ4�:‰:�d¨Ô/ÐA¸TÐAr   c                 ó@   — | j                  d«      r| S t        || «      S rB   rD   rE   s     r   rg   rg   p   s!   € Ø‡|�|Ð[Ô\ØˆÜ�8˜QÓÐr   c                 ór  — t        d«      D ]Ð  }	 t        j                  | t        t        ¬«      }|j
                  dk7  r yd|_        |j                  }t        j                  d|t        j                  «      }|rt        |j                  d«      | «      c S t        j                  d|t        j                  «      }|rt        |j                  d«      | «      c S  y y# t        $ r6}|d	k(  r't        d
| › d|› �t        j                   ¬«       Y d}~ yY d}~nd}~ww xY wt#        j$                  d«       �Œ-)uQ   æŠ“è¯¦æƒ…é¡µè¡¥å…¨æ­£æ–‡ (API contentHtml å¸¸æˆªæ–­, è¯¦æƒ…é¡µæ›´å®Œæ•´å�«å›¾ç‰‡)r%   r&   r)   r   zutf-8z*<div class="wenzi TRS_UEDITOR">(.*?)</div>r   z.class="[^"]*TRS_UEDITOR[^"]*"[^>]*>(.*?)</div>r*   z  [WARN] detail failed z: r+   Ng      ð?)r.   r/   r0   r1   r2   r3   ÚencodingÚtextr   rd   rc   rZ   rL   r5   r6   r   r7   r8   r9   )r;   r<   r=   Ú	html_textrN   r>   s         r   Úfetch_detailrt   v   s  € ä˜“8ò ˆð	Ü—‘˜S¬'¼7ÔCˆAØ�}‰} Ò#ÙØ ˆAŒJØŸ™ˆIÜ—	‘	ÐGÈÔTV×TXÑTXÓYˆAÙÜ$ Q§W¡W¨Q£Z°Ó5Ò5ä—	‘	ÐKÈYÔXZ×X\ÑX\Ó]ˆAÙÜ$ Q§W¡W¨Q£Z°Ó5Ò5Ùðð( øô ò 	Ø˜!Š|ÜÐ/°¨u°B°q°cÐ:ÄÇÁÕLÝô ûð	úô 	�
‰
�3Žs%   �/C ÁAC ÂAC Ã 	DÃ)&DÄDc                  ó¨  — t        «       } | sd} g }t        «       }t        d| dz   «      D �]å  }t        |«      }|st	        d|› d�«        �nÆ|j                  di «      j                  dg «      }|st	        d|› d�«        �n�|D �]K  }t        t        |j                  dd	«      «      }|r||v rŒ+|j                  |«       t        |j                  d
d	«      «      }|sŒZd	}	t        j                  d|j                  dd	«      «      }
|
r|
j                  d«      }	t        |j                  dd	«      |«      }t        t        j                  dd	|«      «      dk  rt        |j                  dd	«      |«      }t        t        j                  dd	|«      «      dk  rt!        |«      }|r|}t#        ||«      }|j%                  t&        ||	||||d	dœ«       �ŒN t	        d|› dt        |«      › dt        |«      › d�«       t)        j*                  d«       �Œè t	        dt        |«      › d�«       t-        |t.        «       t	        dt        |«      › d�«       y )Né   r   z[PAGE z] API failed, stoppingÚdataÚresultsz] 0 items, stoppingr;   r   Útitlez(\d{4}-\d{2}-\d{2})ÚpublishedTimeStrÚcontentHtmlr\   éd   ri   )Ú	site_namery   Úpub_dateri   Ú
source_urlr;   ÚattachmentsÚindustryz] +z items (total ú)gš™™™™™é?u   
æœ‰æ•ˆ u    æ�¡, å…¥åº“...u   å®Œæˆ�! æ–°å¢ž/æ›´æ–° u    æ�¡)r   Úsetr.   r?   r6   r0   r   ÚBASE_URLÚaddr#   r   rd   rL   rZ   r   r    rt   rn   rf   Ú	SITE_NAMEr8   r9   r   ÚCATEGORY)r   Ú	all_itemsÚseenÚpgrw   rx   r=   r;   ry   r~   Úpmri   Údetail_contentr€   s                 r   Úmainr�   �   s0  € Ü‹L€EÙØˆà€IÜ‹5€DÜ�A�u˜q‘yÓ!ó )ˆÜ˜‹}ˆÙÜ�F˜2˜$Ð4Ð5Ô6ÚØ—(‘(˜6 2Ó&×*Ñ*¨9°bÓ9ˆÙÜ�F˜2˜$Ð1Ð2Ô3ÚØó 	ˆAÜœ( A§E¡E¨%°Ó$4Ó5ˆCÙ˜# ™+ØØ�H‰H�SŒMÜ §¡ g¨rÓ 2Ó3ˆEÙØØˆHÜ—‘Ð1°1·5±5Ð9KÈRÓ3PÓQˆBÙØŸ8™8 A›;�Ü# A§E¡E¨-¸Ó$<¸cÓBˆGä”2—6‘6˜* b¨'Ó2Ó3°cÒ9Ü'¨¯©¨i¸Ó(<¸cÓB�Ü”2—6‘6˜* b¨'Ó2Ó3°cÒ9Ü!-¨cÓ!2�Ù!Ø,�GÜ-¨g°sÓ;ˆKØ×ÑÜ&ØØ$Ø"Ø!ØØ*Øñ	ö 	ð+	ô> 	��r�d˜#œc '›l˜^¨>¼#¸i».Ð9IÈÐKÔLÜ�
‰
�3ŽðS)ôV 
ˆI”c˜)“nÐ% _Ð
5Ô6Ü�Y¤Ô)Ü	Ð"¤3 y£>Ð"2°$Ð
7Õ8r   Ú__main__)#Ú__doc__Úosr   r   r8   r4   Úhtmlr   r/   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r„   Ú
CHANNEL_IDr-   r†   r‡   Ú	MAX_PAGESr1   r2   r   r#   r?   rZ   rn   rg   rt   r�   Ú__name__© r   r   ú<module>r�      sà   ðñ÷ 1× 0× 0Û Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à#€Ø/€
ØÐ'Ñ'¨*Ñ4Øiñj€à3€	Ø€Ø€	ð DØ>Ø'ØÐ3Ñ3Ø(ñ€ð €òòòòò6Bò òò249ðn ˆzÒÙ…Fð r   