Ë
    ,„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mZm	Z	 ddl
mZ ddlmZ dZdZdZe› d	e› d
�ZdZdZ ej(                  «        e	d¬«      z
  j+                  d«      Zej.                  j1                  dd«      ZddiZd„ Zd„ ZddlZ ej<                  ej>                  j@                  «       d#d„Z!d„ Z"d$d„Z#d„ Z$d%d„Z%e&dk(  rƒejN                  dd Z(dZ)dZ*ddjW                  e(«      v r7 e, ejZ                  d djW                  e(«      «      j]                  d«      «      Z)d!e(v re(e(j_                  d!«      dz      Z* e%e)e*¬"«       yy)&ug  
å�—å®«å¸‚äººæ°‘æ”¿åºœ - å…¬å‘Šå…¬ç¤º (info.nangong.gov.cn/channelList/11049.html)
åˆ—è¡¨: /channelList/11049.html (P1), /list/list.jsp?pn=N&classId=11049 (PN, å…±241é¡µ)
åˆ—è¡¨é¡¹: ul.info-list-xxgk li a + span.time
è¯¦æƒ…: /content/11049/{id}.html, div#content.detail-2 (éœ€æ¸…å…ƒæ•°æ�®)
ç”¨æ³•: python3 crawl_nangong_gsgg.py [--pages=N] [--json out.jsonl]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinu"   å�—å®«å¸‚äººæ°‘æ”¿åºœ-å…¬å‘Šå…¬ç¤ºzhttps://info.nangong.gov.cnÚ11049z/channelList/z.htmlzinfo.nangong.gov.cnu   æ²³åŒ—iG  )Údaysz%Y-%m-%dÚDB_PATHz/root/search.dbz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú'/root/gov_crawler/crawl_nangong_gsgg.pyÚlogr      s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                 ó´   — t        j                  dd| xs d«      } t        j                  dd| «      } t        j                  dd| «      j                  «       } | S )Nz&nbsp;|&#160;|\u200b|\ufeffÚ z\s+ú u   \.\.\.|â€¦$)ÚreÚsubÚstrip)Úts    r   Úclean_titler      sK   € Ü
�‰Ð-¨r°1²7¸Ó;€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰ˆ~˜r 1Ó%×+Ñ+Ó-€AØ€Hr   c                 ó(  — t        d«      D ]4  }	 t        j                  | t        |d¬«      }d|_        |j
                  c S  y	# t        $ rD}|dk(  rt        d| dd  › d|› �«       Y d }~ y	t        j                  d
|dz   z  «       Y d }~Œ€d }~ww xY w)Né   F)ÚheadersÚtimeoutÚverifyúutf-8é   z
fetch ERR iÎÿÿÿú: r   é   é   )
ÚrangeÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	Exceptionr   ÚtimeÚsleep)Úurlr   ÚattemptÚrÚes        r   Úfetchr2   %   s’   € Ü˜“8ò 	*ˆð	*Ü—‘˜S¬'¸7È5ÔQˆAØ ˆAŒJØ—6‘6ŠMð		*ð øô ò 	*Ø˜!Š|Ü�j  S T  ¨2¨a¨SÐ1Ô2ÝÜ�J‰J�q˜G a™KÑ(×)Ñ)ûð		*ús   �/AÁ	BÁBÁ,BÂBc                 ó*  — | dk(  rt         }nt        › d| › dt        › �}t        |«      }|sg S g }t	        |d«      }|j                  dd¬«      }|sg S |j                  d«      D ]¬  }|j                  d	d
¬«      }|sŒ|j                  dd«      }t        |j                  d
¬«      «      }	|j                  dd¬«      }
|
r|
j                  d
¬«      nd}|j                  d«      st        t        |«      }|	sŒ“d|v sŒ˜|j                  |	||dœ«       Œ® |S )Nr$   z/list/list.jsp?pn=z	&classId=úhtml.parserÚulzinfo-list-xxgk)Úclass_ÚliÚaT©Úhrefr:   r   ©r   Úspanr,   Úhttpz	/content/)Útitler.   Údate)ÚLIST_URLÚBASE_URLÚCLASS_IDr2   r   ÚfindÚfind_allr'   r   Úget_textÚ
startswithr   Úappend)Úpager.   ÚhtmlÚitemsÚsoupr5   r7   r8   r:   r>   Úspr?   s               r   Ú
fetch_listrM   2   s  € Øˆq‚yÜ‰ä�
Ð,¨T¨F°)¼H¸:ÐFˆÜ�‹:€DÙØˆ	Ø€EÜ˜˜}Ó-€DØ	�‰�4Ð 0ˆÓ	1€BÙØˆ	Ø�k‰k˜$Óò FˆØ�G‰G�C˜dˆGÓ#ˆÙØØ�u‰u�V˜RÓ ˆÜ˜AŸJ™J¨T˜JÓ2Ó3ˆØ�W‰W�V FˆWÓ+ˆÙ*,ˆr�{‰{ ˆ{Ô&°"ˆØ�‰˜vÔ&Üœ8 TÓ*ˆDÚ�[ DÒ(Ø�L‰L 5°¸tÑDÕEðFð €Lr   c                 óP  — | syt        | d«      }|j                  t        j                  d«      ¬«      D ](  }|j	                  g d¢«      }|sŒ|j                  «        Œ* |j                  dd¬«      D ]V  }|j                  d	d«      }|j                  d¬
«      xs d}t        |xs t        |«      }|j                  d|› d|› d�«       ŒX |j                  g d¢«      D ]  }|j                  «        Œ g }	|j                  ddg«      D ]y  }
|
j                  dk(  r|	j                  t        |
«      «       Œ-|
j                  dk(  sŒ=|
j	                  d«      rŒO|
j                  dd¬«      }|sŒe|	j                  d|› d�«       Œ{ |	rdj                  |	«      S | j!                  «       S )Nr   r4   uX   ä½“è£�åˆ†ç±»ï¼š|ä¸»é¢˜åˆ†ç±»ï¼š|å�‘å¸ƒæœºæž„ï¼š|æµ�è§ˆæ¬¡æ•°ï¼š|å­—ä½“ï¼š\[|ã€�å­—ä½“ï¼š)Ústring)ÚpÚdivr<   r7   Útdr8   Tr9   r:   r;   u   é™„ä»¶z<p><a href="z">z</a></p>)r<   ÚbÚstrongÚfontÚemÚiÚuÚsÚtablerP   )Ú	separatorr   z<p>z</p>z

)r   rD   r   ÚcompileÚfind_parentÚ	decomposer'   rE   r   rA   Úreplace_withÚunwrapÚnamerG   ÚstrÚjoinr   )Úcontent_htmlÚpage_urlrK   ÚtagrP   Úa_tagr:   r*   Úfull_urlÚpartsÚelr   s               r   Úextract_clean_textrk   M   s�  € ÙØÜ˜ }Ó5€Dà�}‰}¤B§J¡Jð  0Kó  %Lˆ}ó  Mò ˆØ�O‰OÒ<Ó=ˆÚØ�K‰K�Mðð —‘˜s¨�Ó.ò FˆØ�y‰y˜ Ó$ˆØ�~‰~ Dˆ~Ó)Ò5¨XˆÜ˜8Ò/¤x°Ó6ˆØ×Ñ˜\¨(¨°2°d°V¸8ÐDÕEð	Fð
 �}‰}ÒQÓRò ˆØ�
‰
�ðà€EØ�m‰m˜W c˜NÓ+ò ,ˆØ�7‰7�gÒØ�L‰Lœ˜R›Õ!Ø�W‰W˜‹^ B§N¡N°7Õ$;Ø—‘ b°�Ó5ˆAÚØ—‘˜s 1 # T˜]Õ+ð,ñ "'ˆ6�;‰;�uÓÐ@¨L×,>Ñ,>Ó,@Ð@r   c           	      óº  — t        | «      }|sddddœS t        |d«      }ddddœ}|j                  d«      }|r3t        t	        j
                  dd|j                  d¬«      «      «      |d<   t	        j                  d|«      }|r|j                  d	«      |d
<   |j                  ddd¬«      }|s|j                  dd¬«      }|rt        t        |«      | «      |d<   |S )Nr   )r>   Úpublish_dateÚcontentr4   r>   u   \s*-\s*å�—å®«å¸‚äººæ°‘æ”¿åºœ$Tr;   u(   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{2}-\d{2})r$   rm   rQ   rn   zdetail-2)Úidr6   )ro   )r2   r   rC   r   r   r   rE   ÚsearchÚgrouprk   rb   )r.   rI   rK   ÚresultÚttagÚmÚcontent_divs          r   Úparse_detailrv   g   sÝ   € Ü�‹:€DÙØ¨R¸BÑ?Ð?Ü˜˜}Ó-€DØ¨2¸"Ñ=€FØ�9‰9�WÓ€DÙÜ%¤b§f¡fÐ-MÈrÐSW×S`ÑS`ÐgkÐS`ÓSlÓ&mÓnˆˆw‰Ü
�	‰	Ð=¸tÓD€AÙØ!"§¡¨£ˆˆ~ÑØ—)‘)˜E i¸
�)ÓC€KÙØ—i‘i ¨)�iÓ4ˆÙÜ.¬s°;Ó/?ÀÓEˆˆyÑØ€Mr   é   c                 ó¨  — t        d| › dt        › �«       g }t        «       }t        d| dz   «      D ]Š  }t	        |«      }d}|D ]4  }|d   |vsŒ|j                  |d   «       |j                  |«       |dz  }Œ6 t        d|› dt        |«      › d|› d	t        |«      › �«       |s nt        j                  d
«       ŒŒ g }t        |d«      D ]ž  \  }	}t        |d   «      }
|
d   s|d   r|
d   xs |d   t        k  rŒ2|j                  |
d   xs |d   |d   |
d   xs |d   |
d   t        ddœ«       |	dz  dk(  rt        d|	› dt        |«      › �«       t        j                  d«       Œ  |rct        |dd¬«      5 }|D ]+  }|j                  t        j                   |d¬«      dz   «       Œ- 	 d d d «       t        dt        |«      › d|› �«       y t#        j$                  t&        «      }|j)                  d«       |j+                  «       }dx}}|D ]W  }	 |j)                  d|d   |d    |d    |d   |d   |d   |d   xs d!d d" |d#   d$f	«       |j,                  dkD  r|dz  }n|dz  }ŒY |j1                  «        |j3                  «        t        d&|› d'|› d(�«       y # 1 sw Y   ŒñxY w# t.        $ r}t        d%|› �«       |dz  }Y d }~Œºd }~ww xY w))NzCrawl pages=z cutoff=r$   r   r.   ÚPr"   z items (z new), total g333333ã?rm   r?   r>   rn   u   å…¬å‘Šå…¬ç¤º)r>   re   rm   rn   Ú	site_nameÚcolumné
   z  ú/g333333Ó?Úwr    )r)   F)Úensure_asciiú
zJSONL: z
 items -> zPRAGMA busy_timeout=10000z˜INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, content, summary, category, script_name) VALUES (?,?,?,?,?,?,?,?,?)rz   re   r   iô  r{   zcrawl_nangong_gsgg.pyz
DB error: zResult: z new, z skipped)r   ÚCUTOFFÚsetr%   rM   ÚaddrG   Úlenr,   r-   Ú	enumeraterv   r   ÚopenÚwriteÚjsonÚdumpsÚsqlite3Úconnectr	   ÚexecuteÚcursorÚrowcountr+   ÚcommitÚclose)ÚpagesÚjson_outÚ	items_allÚseenrP   rJ   ÚnewÚitÚenrichedÚidxÚdÚfÚitemÚconnÚcÚstoredÚskippedr1   s                     r   Úcrawlr    z   s'  € Üˆ,�u�g˜X¤f XÐ.Ô/Ø€IÜ‹5€DÜ�1�e˜a‘iÓ ò ˆÜ˜1“ˆØˆØò 	ˆBØ�%‰y Ò$Ø—‘˜˜E™Ô#Ø× Ñ  Ô$Ø�q‘‘ð		ô
 	ˆa�ˆs�"”S˜“Z�L ¨¨¨]¼3¸y»>Ð:JÐKÔLÙÙÜ�
‰
�3�ðð €HÜ˜Y¨Ó*ò ‰ˆˆRÜ˜˜E™Ó#ˆØˆnÒ  F¢°!°NÑ2CÒ2QÀrÈ&ÁzÔU[Ò1[ØØ�‰Ø�w‘ZÒ. 2 g¡;Ø˜5™	Ø˜nÑ-Ò;°°F±Ø˜‘|Ü"Ø$ñ
ô 	ð �‰8�qŠ=Ü�"�S�E˜œ3˜y›>Ð*Ð+Ô,Ü�
‰
�3�ðñ  Ü�(˜C¨'Ô2ð 	E°aØ ò E�Ø—‘œŸ
™
 4°eÔ<¸tÑCÕDñE÷	Eô 	ˆg”c˜(“m�_ J¨x¨jÐ9Ô:Øä�?‰?œ7Ó#€DØ‡L�LÐ,Ô-Ø�‰‹€AØÐ€FˆWØò ˆð	Ø�I‰Ið.ð �kÑ" D¨Ñ$4°d¸:Ñ6FØ�g‘  ^Ñ 4°d¸9±oØ�y‘/Ò' R¨¨#Ð.°°X±Ð@WðYô	Zð �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3÷9	Eð 	Eûô. ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús%   Å=1JÈAJ+ÊJ(Ê+	KÊ4KËKÚ__main__r$   z--pages=r   z--pages=(\d+)z--json)r‘   r’   )é   )N)rw   N)0Ú__doc__r   ÚsysÚosrˆ   r,   rŠ   r&   r   r   Úbs4r   Úurllib.parser   r   rA   rB   r@   ÚDOMAINÚGROUPÚnowÚstrftimer�   Úenvironr'   r	   r(   r   r   Úurllib3Údisable_warningsÚ
exceptionsÚInsecureRequestWarningr2   rM   rk   rv   r    Ú__name__ÚargvÚargsr‘   r’   rc   Úintrp   rq   Úindex© r   r   ú<module>r·      sg  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  à0€	Ø(€Ø€ØˆZ�} X J¨eÐ4€Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€Øð  Kð  L€ò.òó Ø €× Ñ ˜×+Ñ+×BÑBÔ Cóòó6Aò4ó&?4ðB ˆzÒØ�8‰8�A�Bˆ<€DØ€EØ€HØ�S—X‘X˜d“^Ñ#Ù�I�B—I‘IÐ.°·±¸³Ó?×EÑEÀaÓHÓIˆØ�4ÑØ˜Ÿ
™
 8Ó,¨qÑ0Ñ1ˆÙ	� Ö)ð r   