Ë
    ¸¬uj'  ã                   ó€  — 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
æ �ç›®: col1229865783ï¼ˆå»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤ºï¼Œ55æ�¡â‰ˆ3é¡µï¼Œ25æ�¡/é¡µï¼‰
ç«™ç‚¹: https://www.ouhai.gov.cn/col/col1229865783/index.html

ç”¨æ³•:
  python3 crawl_ouhai_sthjj.py             # å¢žé‡�ï¼ˆç¬¬1é¡µï¼‰
  python3 crawl_ouhai_sthjj.py --pages=5   # çˆ¬å‰�5é¡µ
  python3 crawl_ouhai_sthjj.py --full      # å…¨é‡�3é¡µ
é    N)ÚBeautifulSoup)ÚurljoinÚ	SEARCH_DBz/mnt/data/search.dbuI   æ¸©å·žå¸‚ç“¯æµ·åŒºäººæ°‘æ”¿åºœ-å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤ºzwww.ouhai.gov.cnz5https://www.ouhai.gov.cn/col/col1229865783/index.htmlu*   å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬ç¤ºu   æµ™æ±Ÿu   çŽ¯è¯„å…¬ç¤ºé   é   zOhttps://www.ouhai.gov.cn/api-gateway/jpaas-publish-server/front/page/build/unitÚbulidstaticÚ1827ÚuOnCZokpGn8yCLzYmbGrNÚcolumnu   2022æ–°é—»listÚnullÚ
1229865783)Ú	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_ouhai_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Œ1t	        |j                  dd	«      xs |j                  d¬
«      «      }|j                  d«      }|r|j                  d¬
«      nd	}|j                  d«      r|ndt        z   |z   }	|j                  ||	|dd dœ«       Œ¿ |S )u_   è§£æž�åˆ—è¡¨HTMLï¼šli > a[href] + span(æ—¥æœŸ)ã€‚ç“¯æµ· title å±žæ€§ä¸ºç©ºï¼Œæ ‡é¢˜å�– a æ–‡æœ¬ÚlxmlÚliÚaT©ÚhrefrO   z/art/Útitler   ©r    ÚspanÚhttpzhttps://Né
   )rP   ÚurlÚdate)
r   Úfind_allÚfindr    r%   r:   Úget_textÚ
startswithÚDOMAINÚappend)
r1   ÚitemsÚsouprL   rM   rO   rP   rR   rV   Úfull_urls
             r$   Úparse_list_htmlr`   M   sâ   € à€EÜ˜˜vÓ&€DØ�m‰m˜DÓ!ò KˆØ�G‰G�C˜dˆGÓ#ˆÙØØ�‰y�‰Ó ˆØ˜$ÑØÜ˜AŸE™E '¨2Ó.ÒH°!·*±*À4°*Ó2HÓIˆØ�w‰w�v‹ˆÙ,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)Ú	recursiverc   z\s+style=\"[^\"]*\"r   z\s+class=\"[^\"]*\"rd   ÚsrcrS   Úaltz![z](ú)z![](%s)rb   rK   r   rQ   z[^\S\n]+rM   rN   rO   z)\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|et)$ú/éÿÿÿÿu
   é™„ä»¶ï¼š[z

)ÚsetrW   ÚidÚaddÚnameÚstrr!   r"   r\   r:   rZ   r   rX   r   Ú	decomposerY   r    r<   ÚIÚsplitÚjoin)ÚcontÚ
detail_urlÚpartsÚ	processedÚelÚtbl_htmlr"   rj   Úfullrk   Úcloner#   ÚtxtrM   rO   rr   Úatt_lines                    r$   Úextract_contentr‚   `   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Ö!ð?"ðD �]‰]˜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                 ót  — 	 | 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«      xs |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   Úmetarr   ÚArticleTitle)ÚattrsÚcontentre   TrQ   ÚPubDateNrT   z.oh_main_cont_flbox_show_contz#zoomÚscriptÚstylez<[^>]+>r   z\s+éÈ   z    detail error iØÿÿÿz: r3   )r   r   r   r   )r:   ÚHEADERSÚencodingr   ÚtextrX   r%   rY   r    Ú
select_onerW   rt   r‚   r!   r"   r?   r@   rA   rB   )rC   rU   Úrr^   rP   r…   re   rV   Úmeta_drˆ   rx   Ú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ð ˆØ�‰Ð>Ó?Ò[À4Ç?Á?ÐSZÓC[ˆÙØ—}‘} 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=F  Æ 	F7Æ	$F2Æ2F7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
   å…¨é‡�3é¡µ)ÚactionÚhelpz--pagesr2   u   çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultr¯   u   ðŸ”� %s â€” çˆ¬å�– %d é¡µu     [p%d] API å¤±è´¥ï¼Œå�œæ­¢u     [p%d] æ— æ�¡ç›®ï¼Œå�œæ­¢u     [p%d/%d] %d æ�¡ (total=%s)ú?rU   rP   rV   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   r`   Úlenr•   rª   ÚtimeÚsleepr9   r£   )r³   ÚparserÚargsÚpages_to_crawlrC   rD   Ú	list_htmlrG   r]   ÚitrP   rV   rˆ   r”   Úfinal_titleÚ
final_dates                   r$   ÚmainrÊ   ã   sÃ  € ÛØ×$Ñ$Ð1OÐ$ÓP€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   r`   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€	àW€	Ø	€ØB€Ø<€Ø€Ø€Ø€	Ø€	à
[€àØØ'ØØØØñ€ð DØñ€ð
 ˜1¨Ñ*€òòò$ò&.òb#òL)òX!fðH ˆzÒÙ…Fð r&   