Ë
    ¡Š£jŸ(  ã                   ó  — 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	Z	ddl
mZ ddlmZ dZedz   ZdZdZd	Zd
dddœZdZg d¢Zh d£Zd„ Zd„ Z e«        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'  
ç¦�å·žå¸‚æ™‹å®‰åŒºäººæ°‘æ”¿åºœ - çŽ¯è¯„å®¡æ‰¹ çˆ¬è™«
CMS: TRSï¼ˆæ‹“å°”æ€�ï¼‰+ Avalon.js åŠ¨é�™ç»“å�ˆ
åˆ—è¡¨: é�™æ€�HTMLå�«å…¨éƒ¨æ–‡ç« é“¾æŽ¥ï¼ˆ63æ�¡ï¼Œ15æ�¡/é¡µ * 5é¡µï¼‰
åˆ†é¡µ: å…¨éƒ¨åœ¨é¦–é¡µé�™æ€�HTMLä¸­ï¼Œä¸�éœ€è¦�åˆ†é¡µé��åŽ†
è¯¦æƒ…: div.article_content.article_content_01.font_family_cn
é    N)ÚBeautifulSoup)Úurljoinzhttps://www.fzja.gov.cnz"/xjwz/zwgk/zfxxgkzdgz/hjbh/hjxmsp/z/root/search.dbu   ç¦�å·žå¸‚æ™‹å®‰åŒº-çŽ¯è¯„å®¡æ‰¹u   ç¦�å»ºzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.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-Languageé   )z218.106.155.202z112.54.42.145z121.204.110.21>)   ÚpÚddÚdlÚdtÚh1Úh2Úh3Úh4Úh5Úh6ÚhrÚliÚolÚtdÚthÚtrÚulÚdivÚnavÚpreÚformÚmainÚasideÚtableÚtbodyÚtfootÚtheadÚcenterÚdialogÚfigureÚfooterÚheaderÚhgroupÚaddressÚarticleÚcaptionÚdetailsÚsectionÚfieldsetÚ
blockquoteÚ
figcaptionc                 óÒ   ‡‡‡— | €yddl }ddlmŠ g Šˆˆˆfd„Š ‰| «       dj                  ‰«      }|j	                  dd|«      }|j	                  dd	|«      }|j                  «       S )
ul   å�—çº§è¾¹ç•Œå‡ºæ�¢è¡Œã€�è¡Œå†…èŠ‚ç‚¹ç›´æŽ¥æ‹¼æŽ¥ã€�<br> å‡ºæ�¢è¡Œï¼ˆâ‰ˆ æµ�è§ˆå™¨çœ‹åˆ°çš„æ�¢è¡Œç»“æž„ï¼‰ã€‚NÚ r   )ÚNavigableStringc                 óF  •— | j                   D ]‘  }t        |‰«      r‰j                  t        |«      «       Œ*t	        |dd «      dk(  r‰j                  d«       ŒLt	        |dd «      t
        v r+‰j                  d«        ‰|«       ‰j                  d«       ŒŠ ‰|«       Œ“ y )NÚnameÚbrú
)ÚchildrenÚ
isinstanceÚappendÚstrÚgetattrÚ_BLOCK_TAGS)ÚnodeÚchr2   ÚoutÚwalks     €€€ú/root/gov_crawler/crawl_fzja.pyr@   zbody_text.<locals>.walk3   s„   ø€ Ø—-‘-ò 
	ˆBÜ˜"˜oÔ.Ø—
‘
œ3˜r›7Õ#Ü˜˜V TÓ*¨dÒ2Ø—
‘
˜4Õ Ü˜˜V TÓ*¬kÑ9Ø—
‘
˜4Ô Ù�R”Ø—
‘
˜4Õ á�R•ñ
	ó    z[ \t\r\f\v]*\n[ \t\r\f\v]*r6   z\n{3,}ú

)ÚreÚbs4r2   ÚjoinÚsubÚstrip)ÚelÚ_reÚtr2   r?   r@   s      @@@rA   Ú	body_textrL   +   sb   ú€ à	€zØÛÝ#Ø
€Cöñ 	ˆ„HØ
�‰�‹€AØ�‰Ð-¨t°QÓ7€AØ�‰�	˜6 1Ó%€AØ�7‰7‹9ÐrB   c                  óH   ‡— t         j                  Šdˆfd„	} | t         _        y)u=   åŠ«æŒ� socket.getaddrinfo ä½¿ www.fzja.gov.cn ä½¿ç”¨å·²çŸ¥ IPc           	      óz   •— | dk(  rt         D ]  }	  ‰||||||«      c S   ‰| |||||«      S # t        $ r Y Œ,w xY w)Nzwww.fzja.gov.cn)ÚFZJA_IPSÚ	Exception)ÚhostÚportÚfamilyÚtypeÚprotoÚflagsÚipÚoriginal_getaddrinfos          €rA   Úpatched_getaddrinfoz'_patch_dns.<locals>.patched_getaddrinfoJ   s`   ø€ ØÐ$Ò$Üò �ðÙ/°°D¸&À$ÈÈuÓUÒUðñ
 $ D¨$°¸¸eÀUÓKÐKøô !ò Ùðús   ‘.®	:¹:N)r   r   r   r   )ÚsocketÚgetaddrinfo)rY   rX   s    @rA   Ú
_patch_dnsr\   F   s   ø€ ä!×-Ñ-ÐõLð -„FÕrB   c                  ó|   — t        j                  t        «      } | j                  d«       | j                  d«       | S )NzPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    rA   Úinit_dbrc   Y   s/   € Ü�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€KrB   c                 óþ   — 	 t        j                  | t        d¬«      }d|_        |j                  dk7  ry t        |j                  d«      S # t        $ r(}t        d|› �t        j                  ¬«       Y d }~y d }~ww xY w)Né   )ÚheadersÚtimeoutzutf-8éÈ   zhtml.parserz  [ERROR] fetch: )Úfile)ÚrequestsÚgetÚHEADERSÚencodingÚstatus_coder   ÚtextrP   ÚprintÚsysÚstderr)ÚurlÚrÚes      rA   Úget_souprv   `   si   € ðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
Ø�=‰=˜CÒØÜ˜QŸV™V ]Ó3Ð3øÜò ÜÐ! ! Ð%¬C¯J©JÕ7Üûðús   ‚2A µA Á	A<ÁA7Á7A<c                 ó`  ‡— g }| j                  dt        j                  d«      ¬«      D �]   }|j                  dd¬«      D ]ç  }|d   j                  «       }t        j                  d|«      sŒ-|j                  d	«      xs |j                  d¬
«      xs d}|j                  «       }t        j                  dd|«      j                  «       }|rt        |«      dk  rŒœ|j                  d«      r|nt        t        |«      Št        ˆfd„|D «       «      rŒÔ|j                  |‰dœ«       Œé �Œ |S )uB   ä»Žé¡µé�¢æ��å�–æ‰€æœ‰æ–‡ç« é“¾æŽ¥ï¼ˆé�™æ€�HTMLåŒ…å�«å…¨éƒ¨63æ�¡ï¼‰r   Ú	list_base©Úclass_ÚaT©Úhrefr}   zt\d{8}_\d+\.htm$Útitle©rH   r1   u   ^[\s\xa0Â·\u00b7]+é   Úhttpc              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)rs   N© )Ú.0ÚitemÚfull_urls     €rA   ú	<genexpr>z%extract_list_items.<locals>.<genexpr>}   s   øè ø€ ÒE°t˜4 ™;¨(Õ2ÑEùs   ƒ)r~   rs   )Úfind_allrD   ÚcompilerH   Úsearchrk   Úget_textrG   ÚlenÚ
startswithr   ÚLIST_URLÚanyr9   )ÚsoupÚitemsr   r{   r}   r~   r†   s         @rA   Úextract_list_itemsr’   l   s  ø€ à€Eà�}‰}˜U¬2¯:©:°lÓ+Cˆ}ÓDó DˆØ—‘˜c¨�Ó-ò 	DˆAØ�V‘9—?‘?Ó$ˆDä�y‰yÐ,¨dÕ3ØŸ™˜g›ÒF¨!¯*©*¸4¨*Ó*@ÒFÀB�ØŸ™›�äŸ™Ð4°b¸%Ó@×FÑFÓH�Ù¤ E£
¨Q¢ØØ#'§?¡?°6Ô#:™4ÄÌÐRVÓ@W�äÓE¸uÔEÕEØ—L‘L¨5¸Ñ!BÕCò	DðDð €LrB   c                 ó  — | j                  dddi¬«      }|r'|j                  d«      r|d   j                  «       dd S | j                  dd	¬
«      }|r7t        j                  d|j                  «       «      }|r|j                  d«      S y)u   ä»Žè¯¦æƒ…é¡µæ��å�–å�‘å¸ƒæ—¶é—´Úmetar4   ÚPubDate©ÚattrsÚcontentNé
   ÚspanÚarticle_timery   z(\d{4}-\d{1,2}-\d{1,2})r   r1   )Úfindrk   rH   rD   rŠ   r‹   Úgroup)r�   ÚmÚspÚm2s       rA   Úextract_dater¡   ‚   sƒ   € ð 	�	‰	�& ¨Ð 3ˆ	Ó4€AÙˆQ�U‰U�9ÔØ�‰|×!Ñ!Ó# C RÐ(Ð(à	�‰�6 .ˆÓ	1€BÙ	Ü�Y‰YÐ1°2·;±;³=ÓAˆÙØ—8‘8˜A“;ÐØrB   c                 óÐ   — | j                  dddi¬«      }|r$|j                  d«      r|d   j                  «       S | j                  dd¬«      }|r|j                  d	¬
«      }|r|S y)u   ä»Žè¯¦æƒ…é¡µæ��å�–æ ‡é¢˜r”   r4   ÚArticleTitler–   r˜   r   Úarticle_titlery   Tr   r1   )rœ   rk   rH   r‹   )r�   rž   r   rK   s       rA   Úextract_titler¥   ‘   sl   € ð 	�	‰	�& ¨Ð 8ˆ	Ó9€AÙˆQ�U‰U�9ÔØ�‰|×!Ñ!Ó#Ð#à
�)‰)�E /ˆ)Ó
2€CÙ
Ø�L‰L˜tˆLÓ$ˆÙØˆHØrB   c                 ó´  — | j                  dd¬«      xs& | j                  dt        j                  d«      ¬«      }|sy|j                  d«      }|r|j                  d«      }|r|}n|}n|}g }|j                  D �]  }t	        |«      }t        |dd	«      }|d
k(  rNt        |«      }	|	sŒ/t        j                  ddt	        |«      j                  «       «      }
|j                  |
«       Œo|dk(  r |j                  |j                  «       «       Œ”|dv r`|j                  d«      }|r)|j                  t	        |«      j                  «       «       ŒÔt        |«      }	|	sŒâ|j                  d|	› d�«       Œø|dv sŒý|j                  |j                  «       «       �Œ | j                  dd¬«      }|r|j                  t        |«      «       dj                  |«      S )u1   æ��å�–æ­£æ–‡HTMLï¼Œä¿�ç•™è¡¨æ ¼ã€�æ®µè�½ã€�é™„ä»¶r   z1article_content article_content_01 font_family_cnry   Úarticle_contentr1   ÚhtmlÚbodyr4   Nr   z\s+ú r   )r   r,   z<p>ú</p>)r   r   Úarticle_attachmentrC   )rœ   rD   r‰   r7   r:   r;   rL   rG   rH   r9   Ú
attach_strrF   )r�   r   Úhtml_tagÚbody_tagÚ	containerÚpartsÚchildÚ	child_strÚtagro   Ú
inner_htmlÚtblÚattachs                rA   Úextract_contentr¸       s£  € à�9‰9�UÐ#Vˆ9ÓWò CØ�9‰9�U¤2§:¡:Ð.@Ó#Aˆ9ÓBð áØð �x‰x˜Ó€HÙØ—=‘= Ó(ˆÙà ‰Ià ‰Iàˆ	ð €Eà×#Ñ#ó ,ˆÜ˜“Jˆ	Ü�e˜V TÓ*ˆà�#Š:Ü˜UÓ#ˆDÚÜŸV™V F¨C´°U³×1AÑ1AÓ1CÓD�
Ø—‘˜ZÕ(Ø�GŠ^Ø�L‰L˜Ÿ™Ó*Õ+ØÐ&Ñ&à—*‘*˜WÓ%ˆCÙØ—‘œS ›XŸ^™^Ó-Õ.ä  Ó'�ÚØ—L‘L 3 t f¨DÐ!1Õ2Ø�LÒ Ø�L‰L˜Ÿ™Ó*Ö+ð+,ð0 �Y‰Y�uÐ%9ˆYÓ:€FÙØ�‰”Z Ó'Ô(à�;‰;�uÓÐrB   c                 óH  — g }| j                  dd¬«      D ]g  }|d   }|j                  d¬«      xs d}|j                  d«      s|j                  d«      rt        t        |«      }|j                  d	|› d
|› d�«       Œi |rddj                  |«      z   dz   S t        | «      S )u   æ ¼å¼�åŒ–é™„ä»¶åŒºåŸŸr{   Tr|   r}   r   u   é™„ä»¶ú/z./z	<a href="z">z</a>u   <p>é™„ä»¶ï¼šu   ï¼›r«   )rˆ   r‹   r�   r   ÚBASE_URLr9   rF   r:   )r   Úlinesr{   r}   r4   s        rA   r­   r­   Ö   s¦   € à€EØ�\‰\˜# Dˆ\Ó)ò 5ˆØ�‰yˆØ�z‰z ˆzÓ%Ò1¨ˆØ�?‰?˜3Ô 4§?¡?°4Ô#8Üœ8 TÓ*ˆDØ�‰�y   b¨¨¨dÐ3Õ4ð5ñ ;@ˆ>˜EŸJ™J uÓ-Ñ-°Ñ6ÐMÄSÈÃXÐMrB   c                 ó   — |}t         }| j                  d||||t         |t        df«       | j                  «        | j                  d«      j	                  «       d   }| j                  d||t         |r|dd ndf«       | j                  «        |S )	u   ä¿�å­˜åˆ°search.dbz¸
        INSERT OR IGNORE INTO gov_raw
            (title, page_url, source_url, content, site_name, publish_date, group_name, script_name)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?)
    zcrawl_fzja.pyzSELECT last_insert_rowid()r   zWINSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) VALUES (?, ?, ?, ?)Nrh   r1   )Ú	SITE_NAMEra   ÚGROUPÚcommitÚfetchone)rb   r~   Úpub_dater˜   rs   Úpage_urlÚ
source_urlÚrids           rA   Ú
save_to_dbrÆ   â   s�   € à€HÜ€Jà‡L�Lð ð �˜: w´	¸8ÄUÈOÐ	\ô	^ð
 	‡K�K„MØ
�,‰,Ð3Ó
4×
=Ñ
=Ó
?ÀÑ
B€Cà‡L�LÐjØ�uœi¹'¨°°#©ÀrÐJôLà‡K�K„MØ€JrB   c                  óü  — t        j                  «       } | j                  dt        t        d¬«       | j                  «       }t        |j                  t        «      }t        dt        › d|› �«       t        t        «      }|s t        d«       t        j                  d«       t        |«      }t        dt        |«      › d	�«       t!        «       }d
}d
}d
}t#        |«      D ]ï  \  }	}
|
d   }|j%                  d|f«      j'                  «       }|r|dz  }Œ4t        d|	dz   › dt        |«      › d|
d   d d › d�dd¬«       t        |«      }|st        d«       |dz  }Œ||
d   xs t)        |«      }t+        |«      }t-        |«      }|r|st        d«       |dz  }Œ¹t/        |||||«      }|dz  }t        d|› �«       t1        j2                  d«       Œñ |j5                  «        t        dt        › d|› d|› d|› �«       y )Nz--pagesu   çˆ¬å�–é¡µæ•°)rT   ÚdefaultÚhelpú[u   ] å¼€å§‹çˆ¬å�–ï¼Œpages=u   [ERROR] æ— æ³•èŽ·å�–åˆ—è¡¨é¡µr   u     åˆ—è¡¨é¡µèŽ·å�–åˆ° u
    ç¯‡æ–‡ç« r   rs   z'SELECT id FROM gov_raw WHERE page_url=?z  [rº   z] r~   é(   z...rª   T)ÚendÚflushu   [ERROR èŽ·å�–è¯¦æƒ…]u   [è·³è¿‡ æ— æ ‡é¢˜/å†…å®¹]zOK id=z
[u   ] å®Œæˆ�: +u    è·³è¿‡u    é”™è¯¯)ÚargparseÚArgumentParserÚadd_argumentÚintÚ	MAX_PAGESÚ
parse_argsÚminÚpagesrp   r¾   rv   rŽ   rq   Úexitr’   rŒ   rc   Ú	enumeratera   rÁ   r¥   r¡   r¸   rÆ   ÚtimeÚsleepÚclose)ÚparserÚargsrÕ   r�   r‘   rb   Ú	new_countÚ
skip_countÚ	err_countÚidxr…   rs   ÚexistsÚdetail_soupr~   rÂ   r˜   rÅ   s                     rA   r   r   õ   sö  € Ü×$Ñ$Ó&€FØ
×Ñ˜	¬´YÀ^ÐÔTØ×ÑÓ€DÜ�—
‘
œIÓ&€Eä	ˆAŒiˆ[Ð/°¨wÐ
7Ô8ä”HÓ€DÙÜÐ-Ô.Ü�‰�Œä˜tÓ$€EÜ	Ð!¤# e£* ¨ZÐ
8Ô9ä‹9€DØ€IØ€JØ€Iä˜uÓ%ò ‰	ˆˆTØ�5‰kˆà—‘ÐGÈ#ÈÓP×YÑYÓ[ˆÙØ˜!‰OˆJØä��C˜‘E�7˜!œC ›J˜< r¨$¨w©-¸¸Ð*<Ð)=¸SÐAÀsÐRVÕWä˜s“mˆÙÜÐ(Ô)Ø˜‰NˆIØà�W‘Ò;¤¨{Ó!;ˆÜ Ó,ˆÜ! +Ó.ˆá™GÜÐ-Ô.Ø˜!‰OˆJØä˜˜u h°¸Ó=ˆØ�Q‰ˆ	Ü��s�eˆnÔä�
‰
�1�ð;ð> 	‡J�J„LÜ	ˆC”	ˆ{˜+ i [°¸
°|À7È9È+Ð
VÕWrB   Ú__main__)#Ú__doc__rD   rq   ÚjsonrØ   rj   r^   rÎ   Ú
subprocessrZ   rE   r   Úurllib.parser   r»   rŽ   r`   r¾   r¿   rl   rÒ   rO   r<   rL   r\   rc   rv   r’   r¡   r¥   r¸   r­   rÆ   r   Ú__name__rƒ   rB   rA   ú<module>ré      sÀ   ðñ÷ L× K× K× KÓ KÝ Ý  à$€ØÐ:Ñ:€Ø
€Ø-€	Ø€ð DØZØ0ñ€ð
 €	ò B€ò*€òò6-ñ  „òò	òò,òò3òl	Nòò&5Xðp ˆzÒÙ…Fð rB   