Ë
    ¸¬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mZ dZ	e	dz   Z
dZdZdd	d
dœZdd„Zd„ Zd„ Zdd„Zd„ Zedk(  r’dZ ej*                  ed¬«       ddlZdej,                  v xs dej,                  v Z ede›de›d�«        ee¬«      Zer7ej4                  j7                  ed«      Z eee«        ed ee«      z  «       y ed«       yy) uç   
å†…ä¸˜åŽ¿äººæ°‘æ”¿åºœç½‘ (hbnq.gov.cn) - å…¬å‘Šå…¬ç¤ºçˆ¬è™«
ç«™ç‚¹ï¼šhttps://www.hbnq.gov.cn/channelList/11049.html
CMS: è‡ªå®šä¹‰æ”¿åºœç½‘ç«™
åˆ—è¡¨ï¼š/channelList/11049.html å�Š /channelList/11049_{pn}.html åˆ†é¡µ(10é¡µ~200æ�¡)
é    N)ÚBeautifulSoupzhttps://www.hbnq.gov.cnz/channelList/11049.htmlu"   å†…ä¸˜åŽ¿äººæ°‘æ”¿åºœ-å…¬å‘Šå…¬ç¤ºu	   å†…ä¸˜åŽ¿zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zJtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagec                 ó`   — t        j                  | t        d¬«      }||_        |j                  S )Né   )ÚheadersÚtimeout)ÚrequestsÚgetÚHEADERSÚencodingÚtext)Úurlr   Úrs      ú$/root/gov_crawler/crawl_hbnq_gsgg.pyÚfetchr      s$   € Ü�‰�S¤'°2Ô6€AØ€A„JØ�6‰6€Mó    c                 ó  — g }t        | d«      }|j                  dt        j                  d«      ¬«      D ]Í  }|j	                  dd«      }|j                  d«      s	t        |z   }|j	                  dd«      }|s|j                  d	¬
«      }|sŒXd}|j                  dd„ ¬«      }|r|j                  d	¬
«      }n6|j                  }|r(|j                  dd„ ¬«      }|r|j                  d	¬
«      }|j                  |||dœ«       ŒÏ |S )u   è§£æž�åˆ—è¡¨é¡µúhtml.parserÚaz/content/11049/\d+\.html©Úhrefr   Ú ÚhttpÚtitleT©ÚstripÚspanc                 ó   — | xr d| v S ©NÚtime© ©Úcs    r   ú<lambda>z$extract_list_items.<locals>.<lambda>4   s   € ¸QÒ=NÀ6ÈQÀ;€ r   ©Úclass_c                 ó   — | xr d| v S r   r!   r"   s    r   r$   z$extract_list_items.<locals>.<lambda>;   s   € ÀÒARÀvÐQRÀ{€ r   )r   ÚlinkÚdate)r   Úfind_allÚreÚcompiler
   Ú
startswithÚBASE_URLÚget_textÚ	find_nextÚparentÚfindÚappend)	ÚhtmlÚitemsÚsoupÚa_tagr   r   Údate_strÚ	date_spanr1   s	            r   Úextract_list_itemsr:       s  € à€Eä˜˜}Ó-€Dà—‘˜s¬¯©Ð4OÓ)P�ÓQò GˆØ�y‰y˜ Ó$ˆØ�‰˜vÔ&Ü˜d‘?ˆDð —	‘	˜' 2Ó&ˆÙØ—N‘N¨�NÓ.ˆEÙØð ˆØ—O‘O FÑ3N�OÓOˆ	ÙØ ×)Ñ)°Ð)Ó5‰Hð —\‘\ˆFÙØ"ŸK™K¨Ñ7R˜KÓS�	ÙØ(×1Ñ1¸Ð1Ó=�Hà�‰˜u¨d¸HÑEÕFð3Gð6 €Lr   c                 ó  ‡— t        | d«      }d}|j                  dddi¬«      }|r$|j                  d«      r|d   j                  «       }|s%|j                  d«      }|r|j	                  d	¬
«      }|s@|j                  d«      }|r-|j	                  d	¬
«      }d|v r|j                  d«      d   }n|}d}|j                  dddi¬«      }	|	r=|	j                  d«      r,t        j                  d|	d   «      }
|
r|
j                  d«      }d}ddiddiddiddiddiddifD ]E  }d|v r|j                  d|d   fd„¬«      }n|j                  d|d   ¬«      }|sŒ:t        |«      } n |sÕ|j                  d«      }|rÂg }|j                  «       D ]œ  }|j                  dv rb|j                  d«      rQdj                  |j                  dg «      «      Št        ˆfd„dD «       «      rŒX|j                  t        |«      «       Œs|j                  dk(  sŒƒ|j                  t        |«      «       Œž d j                  |«      }g }|j                  d!t        j                   d"t        j"                  «      ¬#«      D ]€  }|j                  d$d«      }|j%                  d%«      r|j%                  d&«      rd'|z   nt&        |z   }|j	                  d	¬
«      xs |j                  d%«      d(   }|j                  ||d)œ«       Œ‚ |||j                  «       |d*œS )+u   è§£æž�è¯¦æƒ…é¡µr   r   ÚmetaÚnameÚArticleTitle)ÚattrsÚcontentÚh1Tr   r   Ú_r   ÚPubDatez(\d{4}[-/]\d{1,2}[-/]\d{1,2})é   ÚclassÚdetailÚ
TRS_Editorzewb-articleÚidzUCAP-CONTENTÚarticleÚdivc                 ó   — | xr || v S ©Nr!   )r#   Úclss     r   r$   z extract_detail.<locals>.<lambda>h   s   € È1Ê>ÐQTÐXYÐQY€ r   r%   )rH   )rJ   ú c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wrL   r!   )Ú.0ÚxÚcls_strs     €r   ú	<genexpr>z!extract_detail.<locals>.<genexpr>x   s   øè ø€ ÒS¨A˜1 œ<ÑSùs   ƒ)ÚfootÚprintÚshareÚbtnú
r   z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$r   r   ú/z//zhttps:éÿÿÿÿ)r   r=   )r   r)   r@   Úattachments)r   r2   r
   r   r/   Úsplitr+   ÚsearchÚgroupÚstrÚfind_next_siblingsr=   ÚjoinÚanyr3   r*   r,   ÚIr-   r.   )r4   r   r6   r   Ú
meta_titlerA   Ú	title_tagÚtr8   Ú	meta_dateÚ
date_matchr@   ÚselectorrJ   Úcontent_partsÚsiblingr[   r7   r   r=   rR   s                       @r   Úextract_detailrl   C   s
  ø€ ä˜˜}Ó-€Dð €EØ—‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆáØ�Y‰Y�t‹_ˆÙØ—K‘K d�KÓ+ˆEáØ—I‘I˜gÓ&ˆ	ÙØ×"Ñ"¨Ð"Ó.ˆAØ�a‰xØŸ™ › Q™‘à�ð €HØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ü—Y‘YÐ?ÀÈ9ÑAUÓVˆ
ÙØ!×'Ñ'¨Ó*ˆHð €GØ˜xÐ(¨7°IÐ*>ÀÈ,Ð@WØ˜}Ð-°°nÐ/EÈÐQZÐG[ð]ò ˆà�hÑØ—)‘)˜E¸ÀÑ8IÒ*Y�)ÓZ‰Cà—)‘)˜E h¨t¡n�)Ó5ˆCÚÜ˜#“hˆGÙðñ à�Y‰Y�t‹_ˆÙàˆMØ×0Ñ0Ó2ò 7�Ø—<‘< 7Ñ*¨w¯{©{¸7Ô/CØ!Ÿh™h w§{¡{°7¸BÓ'?Ó@�GÜÓSÐ1RÔSÔSØ Ø!×(Ñ(¬¨W«Õ6Ø—\‘\ UÓ*Ø!×(Ñ(¬¨W«Õ6ð7ð —i‘i Ó.ˆGð €KØ—‘˜s¬¯©Ð4YÔ[]×[_Ñ[_Ó)`�Óaò 8ˆØ�y‰y˜ Ó$ˆØ�?‰?˜3ÔØ&*§o¡o°dÔ&;�8˜d’?ÄÈDÁˆDà�~‰~ Dˆ~Ó)Ò@¨T¯Z©Z¸«_¸RÑ-@ˆØ×Ñ 4°Ñ6Õ7ð8ð ØØ—=‘=“?Ø"ñ	ð r   c                 óÚ  — d}| rdg}nt        t        d|dz   «      «      }g }|D ]õ  }|dk(  rt        }nt        d|z  z   }t	        d||fz  «       t        |«      }t        |«      }|st	        d«        |S t	        dt        |«      z  «       |D ]‰  }t	        d|d   d	d
 z  «       	 t        |d   «      }	t        |	|d   «      }
|
d   xs |d   |d   |
d   xs |d   |
d   |
d   t        t        dœ}|j                  |«       t        j                  d«       Œ‹ Œ÷ |S # t        $ rB}t	        d|z  «       |j                  |d   |d   |d   dg t        t        dœ«       Y d	}~ŒÖd	}~ww xY w)u   çˆ¬å�–å…¨éƒ¨æ–‡ç« é
   rD   z/channelList/11049_%d.htmlz  Fetching list page %d/%d...z    No more items, stoppingz    Found %d itemsz  Fetching: %sr   Né2   r(   r)   r@   r[   )r   r(   r)   r@   r[   Ú	site_namer^   g333333Ó?z    ERROR fetching detail: %sr   )ÚlistÚrangeÚLIST_URLr.   rU   r   r:   Úlenrl   Ú	SITE_NAMEÚGROUPr3   r    ÚsleepÚ	Exception)ÚincrementalÚtotal_pagesÚ
page_rangeÚresultsÚpage_numr   r4   r5   ÚitemÚdetail_htmlrF   ÚresultÚes                r   Ú	crawl_allr‚   �   s±  € à€KáØ�S‰
äœ%  ;°¡?Ó3Ó4ˆ
à€Gàò ,ˆØ�qŠ=Ü‰CäÐ9¸HÑDÑDˆCäÐ-°¸;Ð0GÑGÔHÜ�S‹zˆÜ" 4Ó(ˆáÜÐ/Ô0ØðD €NôA 	Ð"¤S¨£ZÑ/Ô0àò 	ˆDÜÐ" T¨'¡]°3°BÐ%7Ñ7Ô8ðÜ# D¨¡LÓ1�Ü'¨°T¸&±\ÓB�ð $ G™_Ò=°°W±Ø  ™LØ" 6™NÒ:¨d°6©lØ% iÑ0Ø#)¨-Ñ#8Ü!*Ü"ñ�ð —‘˜vÔ&Ü—
‘
˜3•ñ#	ð!,ð\ €Nøô ò 
ÜÐ5¸Ñ9Ô:Ø—‘Ø! '™]Ø  ™LØ  ™LØ!Ø#%Ü!*Ü"ñ ÷ ñ ûð
ús   Â'A2DÄ	E*Ä(8E%Å%E*c                 óÞ   — t        |dd¬«      5 }| D ]+  }|j                  t        j                  |d¬«      dz   «       Œ- 	 d d d «       t	        dt        | «      |fz  «       y # 1 sw Y   Œ#xY w)NÚwúutf-8)r   F)Úensure_asciirX   zExported %d records to %s)ÚopenÚwriteÚjsonÚdumpsrU   rt   )r|   Úoutput_pathÚfr   s       r   Úexport_jsonlr�   Ë   si   € Ü	ˆk˜3¨Ô	1ð >°QØò 	>ˆAØ�G‰G”D—J‘J˜q¨uÔ5¸Ñ<Õ=ñ	>÷>ô 
Ð
%¬¨W«°{Ð(CÑ
CÕD÷>ð >ús   �1A#Á#A,Ú__main__z/root/gov_crawler/outputT)Úexist_okz--incrementalÚ1z	Crawling z (incremental=ú))ry   zhbnq_gsgg.jsonlz
Done! %d articles totalzNo results found!)r…   )F)Ú__doc__r	   r+   r‰   r    ÚosÚsysÚbs4r   r.   rs   ru   rv   r   r   r:   rl   r‚   r�   Ú__name__Ú
output_dirÚmakedirsÚargvry   rU   r|   Úpathra   Ú
jsonl_pathrt   r!   r   r   ú<module>rœ      s  ðñó Û 	Û Û Û 	Û 
Ý à$€ØÐ/Ñ/€Ø0€	Ø€ð DØZØ0ñ€óò
!òFKóZ9òvEð ˆzÒØ+€JØ€B‡K�K�
 TÕ*ãØ! S§X¡XÐ-Ò@°¸¿¹°€Kâ	ªI²{Ð
CÔDÙ KÔ0€GáØ—W‘W—\‘\ *Ð.?Ó@ˆ
Ù�W˜jÔ)ÙÐ)©C°«LÑ8Õ9áÐ!Õ"ð r   