Ë
    ¸¬ujs(  ã                   ó€  — 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	Z	ddl
mZ ddlmZ ej                  j                  ej                  j!                  e«      «      Z ej&                  dd«      ZdZdZd	Zd
ZdZdZdZdZdZddddddddœZdedœZddddœZ d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d „ Z&d!„ Z'e(d"k(  r e'«        yy)#u+  
æ¸©å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤º çˆ¬è™«
==================================================
CMS: JPAAS å�‘å¸ƒæœ�åŠ¡å™¨ï¼ˆæµ™æ±Ÿç»Ÿä¸€å¹³å�°ï¼‰ï¼Œåˆ—è¡¨èµ° API
æ �ç›®: col1229880650ï¼ˆå»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤ºï¼Œå…±192æ�¡â‰ˆ8é¡µï¼Œ25æ�¡/é¡µï¼‰
ç«™ç‚¹: https://sthjj.wenzhou.gov.cn/col/col1229880650/index.html

ç”¨æ³•:
  python3 crawl_wenzhou_sthjj.py             # å¢žé‡�ï¼ˆç¬¬1é¡µï¼‰
  python3 crawl_wenzhou_sthjj.py --pages=5   # çˆ¬å‰�5é¡µ
  python3 crawl_wenzhou_sthjj.py --full      # å…¨é‡�8é¡µ
é    N)ÚBeautifulSoup)ÚurljoinÚ	SEARCH_DBz/mnt/data/search.dbuC   æ¸©å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤ºzsthjj.wenzhou.gov.cnz9https://sthjj.wenzhou.gov.cn/col/col1229880650/index.htmlu*   å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤ºu   æµ™æ±Ÿu   çŽ¯è¯„å…¬ç¤ºé   é   zShttps://sthjj.wenzhou.gov.cn/api-gateway/jpaas-publish-server/front/page/build/unitÚbulidstaticÚ2490ÚUaizqAb90FxcqrGu9suMgÚcolumnu   å†…é¡µåˆ†é¡µåˆ—è¡¨ÚnullÚ
1229880650)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚeditTypeÚpageIdzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36)z
User-AgentÚReferer)ÚnewÚskipÚerrorsc                 óÀ   — | syt        j                  | «      } | j                  dd«      j                  «       } t	        j
                  dd| «      } | j                  «       S )u@   æ ‡é¢˜æ¸…æ´—ï¼šHTMLå®žä½“å��è½¬ä¹‰ + strip &middot;&nbsp; å‰�ç¼€Ú õ   Â ú u   ^[Â·\u00b7]\s*)Úhtml_modÚunescapeÚreplaceÚstripÚreÚsub)Úts    ú(/root/gov_crawler/crawl_wenzhou_sthjj.pyÚclean_titler%   1   sP   € áØÜ×Ñ˜!Ó€AØ	�	‰	�(˜CÓ ×&Ñ&Ó(€AÜ
�‰Ð  " aÓ(€AØ�7‰7‹9Ðó    c                 óÄ  — t        t        «      }t        j                  |t        dœd¬«      |d<   	 | j                  t        |d¬«      }|j                  «       }|j                  d«      sy|d	   d
   }t        j                  d|«      }|rt        |j                  d«      «      nd}||fS # t        $ r*}t        d||fz  t        j                  ¬«       Y d}~yd}~ww xY w)u   é€šè¿‡APIèŽ·å�–åˆ—è¡¨é¡µ)ÚpageNoÚpageSizeF)Úensure_asciiÚ	paramJsoné   )ÚparamsÚtimeoutÚsuccess)Nr   ÚdataÚhtmlzcount="(\d+)"é   r   z  [API ERROR] page %d: %s©ÚfileN)ÚdictÚLIST_PARAMSÚjsonÚdumpsÚ	PAGE_SIZEÚgetÚAPI_URLr!   ÚsearchÚintÚgroupÚ	ExceptionÚprintÚsysÚstderr)	ÚsessionÚpage_nor-   Úrespr0   r1   Úcount_mÚtotalÚes	            r$   Úfetch_list_pagerI   ;   sÅ   € ä”+Ó€FÜŸ*™*°ÄYÑ%OÐ^cÔd€Fˆ;ÑðØ�{‰{œ7¨6¸2ˆ{Ó>ˆØ�y‰y‹{ˆØ�x‰x˜	Ô"ØØ�F‰|˜FÑ#ˆÜ—)‘)Ð,¨dÓ3ˆÙ)0”�G—M‘M !Ó$Ô%°aˆØ�Uˆ{ÐøÜò ÜÐ)¨W°a¨LÑ8¼s¿z¹zÕJÜûðús   ²9B, Á,?B, Â,	CÂ5 CÃCc                 óÌ  — g }t        | d«      }|j                  d«      D ]Á  }|j                  dd¬«      }|sŒ|d   j                  «       }d|vrŒ1|j	                  dd	«      xs |j                  d¬
«      }t        |«      }|j                  dd¬«      }|r|j                  d¬
«      nd	}|j                  d«      r|ndt        z   |z   }	|j                  ||	|dd dœ«       ŒÃ |S )u7   è§£æž�åˆ—è¡¨HTMLï¼šli > a.bt_link[title] + span.bt_timeÚlxmlÚliÚaT©ÚhrefrO   z/art/Útitler   ©r    ÚspanÚbt_time)Úclass_Úhttpzhttps://Né
   )rP   ÚurlÚdate)
r   Úfind_allÚfindr    r:   Úget_textr%   Ú
startswithÚDOMAINÚappend)
r1   ÚitemsÚsouprL   rM   rO   rP   rR   rX   Úfull_urls
             r$   Úparse_list_htmlrb   M   sì   € à€EÜ˜˜vÓ&€DØ�m‰m˜DÓ!ò KˆØ�G‰G�C˜dˆGÓ#ˆÙØØ�‰y�‰Ó ˆØ˜$ÑØØ—‘�g˜rÓ"Ò< a§j¡j°t jÓ&<ˆÜ˜EÓ"ˆØ�w‰w�v iˆwÓ0ˆÙ,0ˆt�}‰} 4ˆ}Ô(°bˆØŸ?™?¨6Ô2‘4¸
ÄVÑ8KÈdÑ8RˆØ�‰˜u¨X¸tÀCÀR¸yÑIÕJðKð €Lr&   c                 óê  — g }t        «       }| j                  g d¢d¬«      D �]  }t        |«      |v rŒ|j                  t        |«      «       |j                  dk(  rt        |«      }t        j                  dd|«      }t        j                  dd|«      }|j                  |«       |j                  g d¢d¬«      D ]  }|j                  t        |«      «       Œ Œº|j                  dk(  rg|j                  d	d«      }|sŒÞ|j                  d
«      st        ||«      n|}|j                  dd«      }	|j                  |	r	d|	›d|›d�nd|z  «       �Œ0|j                  dk(  r¡|j                  d«      rOt        t        |«      d«      }
|
j                  d«      D ]  }|j                  «        Œ |
j                  dd¬«      }n|j                  dd¬«      }|s�Œ¶t        j                  dd|«      }|j                  |«       �Œà|j                  dd¬«      }|s�Œ÷|j                  |«       �Œ
 | j                  dd¬«      D ]¡  }|d   j!                  «       }t        j"                  d|t        j$                  «      sŒ<|j                  d
«      st        ||«      n|}|j                  d¬«      xs |j'                  d«      d   }d|›d|›d�}||vsŒ‘|j                  |«       Œ£ dj)                  |«      S )ue   æ­£æ–‡æ��å�–ï¼šæ®µè�½å�–æ–‡æœ¬ã€�è¡¨æ ¼ä¿�ç•™åŽŸå§‹HTMLã€�å›¾ç‰‡è½¬markdownã€�

åˆ†æ®µã€�é™„ä»¶åµŒå…¥)ÚpÚtableÚimgÚh1Úh2Úh3Úh4T)Ú	recursivere   z\s+style=\"[^\"]*\"r   z\s+class=\"[^\"]*\"rf   ÚsrcrU   Úaltz![z](ú)z![](%s)rd   rK   r   rQ   z[^\S\n]+rM   rN   rO   z)\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|et)$ú/éÿÿÿÿu
   é™„ä»¶ï¼š[z

)ÚsetrY   ÚidÚaddÚnameÚstrr!   r"   r^   r:   r\   r   rZ   r   Ú	decomposer[   r    r<   ÚIÚsplitÚjoin)ÚzoomÚ
detail_urlÚpartsÚ	processedÚelÚtbl_htmlr"   rl   Úfullrm   Úcloner#   ÚtxtrM   rO   rt   Úatt_lines                    r$   Úextract_contentr„   a   s�  € à€EÜ“€IØ�m‰mÒIÐUYˆmÓZó ""ˆÜˆb‹6�YÑØØ�‰”b˜“fÔØ�7‰7�gÒä˜2“wˆHÜ—v‘vÐ4°b¸(ÓCˆHÜ—v‘vÐ4°b¸(ÓCˆHØ�L‰L˜Ô"à—{‘{Ò#PÐ\`�{Óaò '�Ø—‘œb ›gÕ&ñ'à�W‰W˜ÒØ—&‘&˜ Ó#ˆCÚØ7:·~±~ÀfÔ7M”w˜z¨3Ô/ÐSV�Ø—f‘f˜U BÓ'�Ø—‘º#ªC²Ñ6À9ÈtÑCSÖTØ�W‰W˜Š^Ø�w‰w�wÔä%¤c¨"£g¨vÓ6�ØŸ™¨Ó0ò "�AØ—K‘K•Mð"à—n‘n S°�nÓ5‘à—k‘k #¨T�kÓ2�ÛÜ—f‘f˜[¨#¨sÓ3�Ø—‘˜SÖ!à—+‘+˜c¨�+Ó.ˆCÛØ—‘˜SÖ!ðE""ðJ �]‰]˜3 Tˆ]Ó*ò 'ˆØ�‰y�‰Ó ˆÜ�9‰9ÐAÀ4ÌÏÉÕNØ48·O±OÀFÔ4K”7˜: tÔ,ÐQUˆDØ—:‘: D�:Ó)Ò@¨T¯Z©Z¸«_¸RÑ-@‰DÚ.2²DÐ9ˆHØ˜uÒ$Ø—‘˜XÕ&ð'ð �;‰;�uÓÐr&   c                 óN  — 	 | j                  |t        d¬«      }d|_        t        |j                  d«      }d}|j                  dddi¬	«      }|r|j                  d
«      rt        |d
   «      }|s.|j                  d«      }|rt        |j                  d¬«      «      }d}|j                  dddi¬	«      }|r'|j                  d
«      r|d
   j                  «       dd }d}	|j                  d«      }
|
r4|
j                  ddg«      D ]  }|j                  «        Œ t        |
|«      }	t        j                  dd|	«      }t        j                  dd|«      j                  «       dd }|||	|fS # t        $ r.}t!        d|dd ›d|›�t"        j$                  ¬«       Y d}~yd}~ww xY w)u   èŽ·å�–è¯¦æƒ…é¡µå†…å®¹r,   )Úheadersr.   zutf-8rK   r   Úmetart   ÚArticleTitle)ÚattrsÚcontentrg   TrQ   ÚPubDateNrV   z#zoomÚscriptÚstylez<[^>]+>r   z\s+éÈ   z    detail error iØÿÿÿz: r3   )r   r   r   r   )r:   ÚHEADERSÚencodingr   ÚtextrZ   r%   r[   r    Ú
select_onerY   rv   r„   r!   r"   r?   r@   rA   rB   )rC   rW   Úrr`   rP   r‡   rg   rX   Úmeta_drŠ   rz   ÚtagÚsummaryrH   s                 r$   Úfetch_detailr—   •   s“  € ð#Ø�K‰K˜¤W°bˆKÓ9ˆØˆŒ
Ü˜QŸV™V VÓ,ˆð ˆØ�y‰y˜¨°Ð'?ˆyÓ@ˆÙ�D—H‘H˜YÔ'Ü  Y¡Ó0ˆEÙØ—‘˜4“ˆBÙÜ# B§K¡K°d KÓ$;Ó<�ð ˆØ—‘˜6¨&°)Ð)<�Ó=ˆÙ�f—j‘j Ô+Ø˜)Ñ$×*Ñ*Ó,¨S¨bÐ1ˆDð ˆØ�‰˜wÓ'ˆÙØ—}‘} h°Ð%8Ó9ò  �Ø—‘•ð ä% d¨CÓ0ˆGä—&‘&˜ S¨'Ó2ˆÜ—&‘&˜  gÓ.×4Ñ4Ó6°t¸Ð<ˆà�d˜G WÐ,Ð,øÜò Ý¨3¨s¨tª9±aÐ8¼s¿z¹zÕJÜûðús   ‚E*E- Å-	F$Å6$FÆF$c                 ó  — t        j                  t        «      }	 |j                  d| |t        t
        |t        t        t        ||f
«       |j                  «        |j                  dkD  }|sj|rh|j                  d|f«      j                  «       }|rE|d   r|d   j                  «       dk(  r*|j                  d|||d   f«       |j                  «        d}|r�|j                  d|f«      j                  «       }|r[t        j                  t        «      }	 |j                  d	|d   | t
        |xs | f«       |j                  «        |j                  «        t        d
xx   dz  cc<   nt        dxx   dz  cc<   |j                  «        y # t        $ r Y ŒOw xY w# |j                  «        w xY w# t        $ r9}	t        dxx   dz  cc<   t!        d|	z  t"        j$                  ¬«       Y d }	~	Œrd }	~	ww xY w# |j                  «        w xY w)Nz£INSERT OR IGNORE INTO gov_raw (title, page_url, source_url, site_name, publish_date, category, industry, group_name, content, summary) VALUES (?,?,?,?,?,?,?,?,?,?)r   z0SELECT id, content FROM gov_raw WHERE page_url=?r2   r   z2UPDATE gov_raw SET content=?, summary=? WHERE id=?Tz'SELECT id FROM gov_raw WHERE page_url=?zSINSERT OR IGNORE INTO gov_search(rowid, title, site_name, summary) VALUES (?,?,?,?)r   r   r   z  DB error: %sr3   )Úsqlite3Úconnectr   ÚexecuteÚSITE_URLÚ	SITE_NAMEÚCATEGORY_NAMEÚINDUSTRYÚGROUPÚcommitÚtotal_changesÚfetchoner    r?   ÚcloseÚstatsr@   rA   rB   )
rP   Úpage_urlÚpublish_daterŠ   r–   ÚconnÚis_newÚrowÚc2rH   s
             r$   Ústore_recordr¬   ½   sÀ  € Ü�?‰?œ9Ó%€Dð'Ø�‰ð+ð �Hœh¬	°<ÜœH¤e¨W°gð?ô		
ð 	�‰ŒØ×#Ñ# aÑ'ˆá™'Ø—,‘,ÐQÐT\ÐS^Ó_×hÑhÓjˆCÙ˜C šF c¨!¡f§l¡l£n¸Ò&:Ø—‘ÐQÐT[Ð]dÐfiÐjkÑflÐSmÔnØ—‘”Ø�áØ—,‘,ÐHÈ8È+ÓV×_Ñ_ÓaˆCÙÜ—_‘_¤YÓ/�ð	Ø—J‘JØmØ˜Q™ ¬	°7Ò3C¸eÐDôð —I‘I”Kð —H‘H”JÜ�%‹L˜AÑŒLä�&‹M˜QÑ‹Mð
 	�
‰
�øô !ò Ùðûð —H‘H•Jûô ò 5Üˆh‹˜1Ñ‹ÜÐ Ñ"¬¯©×4Ò4ûð5ûð 	�
‰
�úsZ   ›C9F. Ä1F
 Å3F. Æ
	FÆF ÆFÆF ÆF+Æ+F. Æ.	G0Æ7/G+Ç&G3 Ç+G0Ç0G3 Ç3Hc            
      ó¬  — dd l } | j                  d¬«      }|j                  ddd¬«       |j                  dt        d	d
¬«       |j	                  «       }t        j                  t        «       |j                  rt        n|j                  }t        j                  «       }|j                  j                  t        «       t!        dt"        |fz  «       t%        d	|d	z   «      D ]Ë  }t'        ||«      \  }}|st!        d|z  «        nªt)        |«      }|st!        d|z  «        n�t!        d||t+        |«      |xs dfz  «       |D ]S  }	t-        ||	d   «      \  }
}}}|
xs |	d   }|xs |	d   }t/        ||	d   |||xs |«       t1        j2                  d«       ŒU t+        |«      t4        k  sŒË n t!        dt6        d   t6        d   t6        d   fz  «       y )Nr   u+   æ¸©å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ çŽ¯è¯„å…¬ç¤ºçˆ¬è™«)Údescriptionz--fullÚ
store_trueu
   å…¨é‡�8é¡µ)ÚactionÚhelpz--pagesr2   u   çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultr±   u   ðŸ”� %s â€” çˆ¬å�– %d é¡µu     [p%d] API å¤±è´¥ï¼Œå�œæ­¢u     [p%d] æ— æ�¡ç›®ï¼Œå�œæ­¢u     [p%d/%d] %d æ�¡ (total=%s)ú?rW   rP   rX   gš™™™™™Ù?u&   
âœ… å®Œæˆ�! æ–°%d, è·³è¿‡%d, é”™è¯¯%dr   r   r   )ÚargparseÚArgumentParserÚadd_argumentr=   Ú
parse_argsÚosÚchdirÚBASE_DIRr€   Ú	MAX_PAGESÚpagesÚrequestsÚSessionr†   Úupdater�   r@   r�   ÚrangerI   rb   Úlenr—   r¬   ÚtimeÚsleepr9   r¥   )rµ   ÚparserÚargsÚpages_to_crawlrC   rD   Ú	list_htmlrG   r_   ÚitrP   rX   rŠ   r–   Úfinal_titleÚ
final_dates                   r$   ÚmainrÌ   é   sÃ  € ÛØ×$Ñ$Ð1^Ð$Ó_€FØ
×Ñ˜¨¸LÐÔIØ
×Ñ˜	¬°Q¸^ÐÔLØ×ÑÓ€Dä‡H�HŒXÔà"&§)¢)•Y°·±€NÜ×ÑÓ €GØ‡O�O×Ñœ7Ô#ä	Ð
%¬°NÐ(CÑ
CÔDÜ˜˜N¨QÑ.Ó/ò ˆÜ*¨7°GÓ<Ñˆ	�5ÙÜÐ/°'Ñ9Ô:ÙÜ 	Ó*ˆÙÜÐ.°Ñ8Ô9ÙÜÐ,°¸ÌÈUËÐUZÒUaÐ^aÐ/bÑbÔcØò 	ˆBÜ,8¸À"ÀUÁ)Ó,LÑ)ˆE�4˜ 'ØÒ. 2 g¡;ˆKØÒ+  F¡ˆJÜ˜ b¨¡i°¸WÀgÒF\ÐQ\Ô]Ü�J‰J�s�Oð	ô ˆu‹:œ	Ó!Ùð%ô( 
Ð
3´u¸U±|ÄUÈ6Á]ÔTYÐZbÑTcÐ6dÑ
dÕer&   Ú__main__))Ú__doc__r!   rA   r¹   rÃ   r7   r™   r1   r   r¾   Úbs4r   Úurllib.parser   ÚpathÚdirnameÚabspathÚ__file__r»   Úgetenvr   r�   r]   rœ   rž   r    rŸ   r¼   r9   r;   r6   r�   r¥   r%   rI   rb   r„   r—   r¬   rÌ   Ú__name__© r&   r$   ú<module>rØ      sö   ðñ÷ :× 9× 9Ó 9Û Ý Ý  à�7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€ØˆB�I‰I�kÐ#8Ó9€	àQ€	Ø	€ØF€Ø<€Ø€Ø€Ø€	Ø€	à
_€àØØ'ØØ!ØØñ€ð DØñ€ð
 ˜1¨Ñ*€òòò$ò(1òh%òP)òX"fðJ ˆzÒÙ…Fð r&   