Ë
    êœzjá)  ã                   ót  — 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dddedz   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)uµ  
ç¦�å»ºçœ�å·¥ä¸šå’Œä¿¡æ�¯åŒ–åŽ… - é¡¹ç›®æ ¸å‡†å®¡æŸ¥ çˆ¬è™«
æ �ç›®: https://gxt.fujian.gov.cn/zwgk/jsxm/xmhz/
CMS: TRS WCM (list2.trsapi åŠ¨é�™ç»“å�ˆ) â€” was5 æ£€ç´¢ JSON API
åˆ—è¡¨ API: /was5/web/search?channelid=229105&searchword=chnlid%3D61090&perpage=15&outlinepage=1&page=N&sortfield=-docreltime
  channelid=229105 (SiteInfo.searchId), chnlid=61090 (PageInfo.chnlid æ �ç›®ID)
  total=552 æ�¡, 15æ�¡/é¡µ (37é¡µ), sortfield=-docreltime æ—¶é—´å€’åº�
  docs[] å­—æ®µ: title(å®Œæ•´)/url/chnldocurl/content(æˆªæ–­~260å­—ç¬¦)/pubdate/pubtime/file(é™„ä»¶P0)/filedesc/fileno(æ–‡å�·)
  âš ï¸� æ¯�é¡µè¿”å›ž 16 æ�¡å�« 1 æ�¡å��æ�¡ç›® (url é�ž http, date ç©º) â†’ è¿‡æ»¤ url startswith http + pubdate é�žç©º
è¯¦æƒ…: /zwgk/jsxm/xmhz/YYYYMM/tYYYYMMDD_ID.htm
  æ­£æ–‡å®¹å™¨: <div class=TRS_Editor><DIV class='TRS_Editor'><style>...</style><p>...</p></DIV></div>
  âš ï¸� class=TRS_Editor æ— å¼•å�·; å†…å±‚ DIV å¤§å†™; style å�—é¡»å‰¥; æ®µè�½ <p align="justify"> ä¿�ç•™
é™„ä»¶: API file å­—æ®µ (P02026...pdf) + è¯¦æƒ…é¡µ article_attachment åŒº <a href="./P0...pdf">ä¸‹è½½ï¼šxxx.pdf</a>
  âš ï¸� é™„ä»¶ç›¸å¯¹è·¯å¾„ urljoin(è¯¦æƒ…é¡µURL, href) ç»�å¯¹åŒ– (ä¿�ç•™æ �ç›®è·¯å¾„æ®µ)
æ ‡é¢˜: API title å­—æ®µå®Œæ•´ (ç¦�å»ºçœ�å·¥ä¸šå’Œä¿¡æ�¯åŒ–åŽ…å…³äºŽXXé¡¹ç›®èŠ‚èƒ½æŠ¥å‘Šçš„å®¡æŸ¥æ„�è§�)
ç”¨æ³•:
  python3 crawl_fjgxt_xmhz.py --pages=1
  python3 crawl_fjgxt_xmhz.py --pages=16   # CUTOFF 3å¹´çª—å�£ (2023-08-11 èµ·)
  python3 crawl_fjgxt_xmhz.py              # é»˜è®¤ 5 é¡µå¢žé‡�
é    N)Úurljoin)Úpush_to_searchdbzhttps://gxt.fujian.gov.cnzs/was5/web/search?channelid=229105&searchword=chnlid%%3D61090&perpage=15&outlinepage=1&page=%d&sortfield=-docreltimeu%   ç¦�å»ºçœ�å·¥ä¿¡åŽ…-é¡¹ç›®æ ¸å‡†å®¡æŸ¥u   é¡¹ç›®æ ¸å‡†å®¡æŸ¥z
2023-08-11é%   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/zwgk/jsxm/xmhz/)z
User-AgentÚAcceptzAccept-LanguageÚRefereré   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_fjgxt_xmhz.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!   9   sZ   € Ü×Ñ˜!š'˜rÓ"€AÜ
�‰Ð0°"°aÓ8€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰Ð" B¨Ó*€AØ�7‰7‹9Ðr   c                 óŒ  — t         | z  }t        d«      D ]k  }	 t        j                  |t        t
        ¬«      }|j                  dk(  r#t        j                  |j                  d¬«      c S 	 t        j                  d
«       Œm 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éÈ   F)Ústricté   z  [WARN] API pz	 failed: ©Úfileg      ø?)ÚAPI_TPLÚrangeÚrequestsÚgetÚHEADERSÚTIMEOUTÚstatus_codeÚjsonÚloadsÚtextÚ	ExceptionÚprintr   ÚstderrÚtimeÚsleep)ÚpageÚurlÚattemptÚrÚes        r   Ú	fetch_apir@   A   s©   € Ü
�D‰.€CÜ˜“8ò 	ˆð	Ü—‘˜S¬'¼7ÔCˆAØ�}‰} Ò#Ü—z‘z !§&¡&°Ô7Ò7ð $ô 	�
‰
�3�ð	ð øô ò 	Ø˜!Š|Ü˜ t f¨I°a°SÐ9ÄÇ
Á
ÕKÝô ûð	ús   ™ABÂ	CÂ&B>Â>Cc                 ó@   — | j                  d«      r| S t        || «      S )N)úhttp://úhttps://zjavascript:zmailto:ztel:zdata:ú#)r   r   )ÚuÚpage_urls     r   Ú_abs_urlrG   P   s!   € Ø‡|�|Ð[Ô\ØˆÜ�8˜QÓÐr   c                 óÐ  ‡— | syt        j                  dd| «      } t        j                  dd| «      } t        j                  dd| t         j                  ¬«      } 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 ä¸ºåŸºå�€ä¿�ç•™æ �ç›®è·¯å¾„)r   z<script[\s\S]*?</script>z<style[\s\S]*?</style>z</?div[^>]*>)Úflagsz<a\s+href="([^"]+)"c                 óB   •— dt        | j                  d«      ‰«      › d�S )Nz	<a href="r
   ú"©rG   Úgroup©ÚmrF   s    €r   ú<lambda>zclean_content.<locals>.<lambda>_   s#   ø€ ¸)ÄHÈQÏWÉWÐUVËZÐYaÓDbÐCcÐcdÐ8e€ r   z<img\s+src="([^"]+)"c                 óB   •— dt        | j                  d«      ‰«      › d�S )Nz
<img src="r
   rK   rL   rN   s    €r   rP   zclean_content.<locals>.<lambda>`   s#   ø€ ¸:ÄhÈqÏwÉwÐWXËzÐ[cÓFdÐEeÐefÐ9g€ r   z<p[^>]*>z<p>z</?span[^>]*>z(<(table|tbody|thead|tr|td|th|br)([^>]*)>c                 ó,   — d| j                  d«      › d�S )Nú<r
   ú>©rM   ©rO   s    r   rP   zclean_content.<locals>.<lambda>f   s   € ÈqÐQR×QXÑQXÐYZÓQ[ÐP\Ð\]ÐM^€ r   z"</(table|tbody|thead|tr|td|th|br)>c                 ó,   — d| j                  d«      › d�S )Nz</r
   rT   rU   rV   s    r   rP   zclean_content.<locals>.<lambda>g   s   € ÈÈAÏGÉGÐTUËJÈ<ÐWXÐGY€ r   z)</?(?:font|b|strong|em|u|sup|sub)\b[^>]*>z[\u3000\xa0]r   z<p>\s*(?:&nbsp;)?\s*</p>z\r\nú
)r   r   ÚIr   )Úraw_htmlrF   s    `r   Úclean_contentr[   V   s   ø€ áØÜ�v‰vÐ1°2°xÓ@€HÜ�v‰vÐ/°°XÓ>€Hä�v‰v�o r¨8¼2¿4¹4Ô@€Hä�v‰vÐ,Ó.eÐgoÓp€HÜ�v‰vÐ-Ó/gÐiqÓr€Hä�v‰v�k 5¨(Ó3€Hä�v‰vÐ&¨¨HÓ5€Hä�v‰vÐAÑC^Ð`hÓi€HÜ�v‰vÐ;Ñ=YÐ[cÓd€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           	      ó6  — g }t        «       }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Œ€t        ||«      }||vsŒ‘|j                  |«       |j                  |xs |j                  d«      d	   |d
œ«       ŒÍ |rt        j                  |d¬«      S dS )u8   ä»Žæ­£æ–‡æ��å�–é™„ä»¶é“¾æŽ¥, è¿”å›ž JSON æ•°ç»„å­—ç¬¦ä¸²ú"<a\s+href="([^"]+)"[^>]*>(.*?)</a>r
   ú<[^>]+>r   r)   z2\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|7z|txt)(\?|$)Údownloadú/éÿÿÿÿ©Únamer<   F©Úensure_asciiú[])Úsetr   ÚfinditerÚSrM   r   r   ÚsearchrY   ÚlowerrG   ÚaddÚappendr   r3   Údumps)ÚcontentrF   ÚattsÚseenÚamÚahrefÚatextrE   s           r   Úextract_attachmentsru   q   så   € à€DÜ‹5€DÜ�k‰kÐ?ÀÌ"Ï$É$ÓOò KˆØ—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Ü˜ Ó)ˆAØ˜Š}Ø—‘˜”Ø—‘ UÒ%>¨a¯g©g°c«l¸2Ñ.>ÀqÑIÕJðKñ 48Œ4�:‰:�d¨Ô/ÐA¸TÐAr   c           	      óÚ  — t        d«      D �]{  }	 t        j                  | t        t        ¬«      }|j
                  dk7  rdg fc S d|_        |j                  }g }t        j                  d|«      }|rÉt        j                  d|j                  d«      «      D ]¡  }|j                  d	«      }t        j                  d
|t        j                  «      sŒ:t        j                  dd|j                  d«      j                  «       «      xs |j                  d«      d   }|j!                  |t#        || «      dœ«       Œ£ t        j                  d|t        j$                  «      }	|	�r t'        |	j                  d	«      | «      }
t        j                  d|
t        j$                  «      D ]—  }|j                  d	«      }t        j                  d
|t        j                  «      sŒ:t        j                  dd|j                  d«      «      j                  «       xs |j                  d«      d   }|j!                  ||dœ«       Œ™ t)        «       }g }|D ]/  }|d   |vsŒ|j+                  |d   «       |j!                  |«       Œ1 |
|fc S d|fc S  dg fS # t,        $ r;}|dk(  r,t/        d| › d|› �t0        j2                  ¬«       dg fcY d}~c S Y d}~nd}~ww xY wt5        j6                  d«       �Œá)u‚   æŠ“è¯¦æƒ…é¡µ: è¿”å›ž (å®Œæ•´æ­£æ–‡, é™„ä»¶åˆ—è¡¨) â€” API content æˆªæ–­æ—¶è¡¥å…¨; é™„ä»¶ä»Ž article_attachment åŒº + æ­£æ–‡æ��å�–r#   r$   r'   r   zutf-8zA<div\s+class="article_attachment"[\s\S]*?</div>\s*</div>\s*</div>z$<a\s+href="([^"]+)"[^>]*>([^<]*)</a>r   r
   z.\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|7z)(\?|$)u   ^ä¸‹è½½[ï¼š:]\s*r)   r`   ra   rb   z#<div\s+class=TRS_Editor>(.*?)</div>r]   r^   r<   z  [WARN] detail failed z: r*   Ng      ð?)r-   r.   r/   r0   r1   r2   Úencodingr5   r   rj   rh   rM   rY   r   r   r   rm   rG   ri   r[   rg   rl   r6   r7   r   r8   r9   r:   )r<   r=   r>   Ú	html_textrp   rr   Úa2rs   rt   rO   ÚbodyÚa3rq   ÚuniqÚa4r?   s                   r   Úfetch_detailr~      s„  € ä˜“8ó %ˆð#	Ü—‘˜S¬'¼7ÔCˆAØ�}‰} Ò#Ø˜2�v’Ø ˆAŒJØŸ™ˆIØˆDä—‘Ð_ÐajÓkˆBÙÜŸ+™+Ð&MÈrÏxÉxÐXYË{Ó[ò R�BØŸH™H Q›K�EÜ—y‘yÐ!RÐTYÔ[]×[_Ñ[_Õ`Ü "§¡Ð':¸BÀÇÁÈÃ×@QÑ@QÓ@SÓ TÒ lÐX]×XcÑXcÐdgÓXhÐikÑXl˜ØŸ™¨U¼8ÀEÈ3Ó;OÑ$PÕQð	Rô —	‘	Ð@À)ÌRÏTÉTÓRˆAÚÜ$ Q§W¡W¨Q£Z°Ó5�äŸ+™+Ð&KÈTÔSU×SWÑSWÓXò C�BØŸH™H Q›K�EÜ—y‘yÐ!RÐTYÔ[]×[_Ñ[_Õ`Ü "§¡ z°2°r·x±xÀ³{Ó C× IÑ IÓ KÒ cÈuÏ{É{Ð[^ÓO_Ð`bÑOc˜ØŸ™¨U¸5Ñ$AÕBð	Cô “u� R˜dØò =�BØ˜%‘y¨Ò,ØŸ™  E¡Ô+¨T¯[©[¸­_ð=ð ˜T�zÒ!Ø�t�8ŠOðA%ðL ˆrˆ6€Møô ò 	Ø˜!Š|ÜÐ/°¨u°B°q°cÐ:ÄÇÁÕLØ˜2�v—ô ûð	úô 	�
‰
�3Žs>   ‘2JÁBJÃDJÇA8JÉ*JÊJÊ	KÊ)KËKËKc                  óˆ  — t        «       } | sd} g }t        «       }t        d| dz   «      D �]Ð  }t        |«      }|st	        d|› d�«        �n±|j                  dg «      }|D �cg c]A  }t        |j                  dd«      «      j                  d«      sŒ.|j                  d	«      sŒ@|‘ŒC }}|st	        d|› d
�«        �n?|D �]ú  }|d   j                  «       j                  dd«      }||v rŒ,|j                  |«       t        |j                  dd«      «      }	|	sŒ[d}
t        j                  dt        |j                  d	d«      «      «      }|r|j                  d«      }
|
r
|
t        k  rŒ«t!        |j                  dd«      |«      }g }t#        t        j$                  dd|«      «      dk  rUt'        |«      \  }}|rCt#        t        j$                  dd|«      «      t#        t        j$                  dd|«      «      kD  r|}|}|s|j                  dd«      }|rk|j                  d«      rZ|j                  dd«      xs dj                  dd«      j                  «       xs |j)                  d«      d   }|t+        ||«      dœg}|rt-        j.                  |d¬«      nd}|j1                  t2        |	|
||||ddœ«       �Œý t	        d|› dt#        |«      › dt#        |«      › d�«       t5        j6                  d «       �ŒÓ t	        d!t#        |«      › d"�«       t9        |t:        «       t	        d#t#        |«      › d$�«       y c c}w )%Né   r
   z[PAGE z] API failed, stoppingÚdocsr<   r   ÚhttpÚpubdatez] 0 valid items, stoppingrB   rC   Útitlez(\d{4}-\d{2}-\d{2})ro   r^   i,  r+   ÚP0Úfiledescu	   ä¸‹è½½ï¼šr`   ra   rb   Frd   rf   )Ú	site_namer„   Úpub_datero   Ú
source_urlr<   ÚattachmentsÚindustryz] +z valid (total ú)g333333ã?u   
æœ‰æ•ˆ u    æ�¡, å…¥åº“...u   å®Œæˆ�! æ–°å¢ž/æ›´æ–° u    æ�¡)r   rg   r-   r@   r7   r/   Ústrr   r   Úreplacerl   r!   r   rj   rM   ÚCUTOFFr[   r   r   r~   r   rG   r3   rn   rm   Ú	SITE_NAMEr9   r:   r   ÚCATEGORY)r   Ú	all_itemsrq   ÚpgÚdatar�   ÚdÚvalidr<   r„   rˆ   Úpmro   rŠ   rz   rp   ÚfÚfnameÚatt_jsons                      r   Úmainr›   ª   s
  € Ü‹L€EÙØˆà€IÜ‹5€DÜ�A�u˜q‘yÓ!ó 3ˆÜ˜‹}ˆÙÜ�F˜2˜$Ð4Ð5Ô6ÚØ�x‰x˜ Ó#ˆà Öb�q¤C¨¯©¨e°RÓ(8Ó$9×$DÑ$DÀVÕ$LÐQR×QVÑQVÐW`ÕQa’ÐbˆÐbÙÜ�F˜2˜$Ð7Ð8Ô9ÚØó &	ˆAØ�E‘(—.‘.Ó"×*Ñ*¨9°jÓAˆCØ�d‰{ØØ�H‰H�SŒMÜ §¡ g¨rÓ 2Ó3ˆEÙØØˆHÜ—‘Ð1´3°q·u±u¸YÈÓ7KÓ3LÓMˆBÙØŸ8™8 A›;�Ù˜H¤vÒ-ØÜ# A§E¡E¨)°RÓ$8¸#Ó>ˆGØˆKä”2—6‘6˜* b¨'Ó2Ó3°cÒ9Ü)¨#Ó.‘
��dÙœC¤§¡ z°2°tÓ <Ó=ÄÄBÇFÁFÈ:ÐWYÐ[bÓDcÓ@dÒdØ"�GØ"�Ùà—E‘E˜& "Ó%�Ù˜Ÿ™ dÔ+ØŸU™U :¨rÓ2Ò8°b×AÑAÀ+ÈrÓR×XÑXÓZÒnÐ^_×^eÑ^eÐfiÓ^jÐkmÑ^n�EØ,1¼(À1ÀcÓ:JÑ#KÐ"L�KÙFQ”t—z‘z +¸EÕBÐW[ˆHØ×ÑÜ&ØØ$Ø"Ø!ØØ'Øñ	ö 	ð;&	ôN 	��r�d˜#œc %›j˜\¨¼¸I»Ð7GÀqÐIÔJÜ�
‰
�3Žðg3ôj 
ˆI”c˜)“nÐ% _Ð
5Ô6Ü�Y¤Ô)Ü	Ð"¤3 y£>Ð"2°$Ð
7Õ8ùòa cs   Á#/L?ÂL?Â%L?Ú__main__)#Ú__doc__Úosr   r   r9   r3   Úhtmlr   r.   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   ÚBASE_URLr,   r�   r‘   r�   Ú	MAX_PAGESr0   r1   r   r!   r@   rG   r[   ru   r~   r›   Ú__name__© r   r   ú<module>r«      sÖ   ðñ÷( 1× 0× 0Û Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à&€Øð Eñ E€à3€	Ø€Ø	€Ø€	ð DØ>Ø'ØÐ,Ñ,ñ	€ð €òòòò òò6Bò(òV>9ðB ˆzÒÙ…Fð r   