Ë
    ÝP~jY  ã                   óR  — 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d	Zd
Z ej&                  «        e	d¬«      z
  j)                  d«      Zej,                  j/                  dd«      ZddiZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d"d„Z!e"dk(  rƒejF                  dd Z$dZ%dZ&ddjO                  e$«      v r7 e( ejR                  ddjO                  e$«      «      jU                  d«      «      Z%d e$v re$e$jW                  d «      dz      Z& e!e%e&¬!«       yy)#u$  
å¹¿è¥¿å�šçŽ¯çŽ¯å¢ƒå’¨è¯¢æœ�åŠ¡æœ‰é™�å…¬å�¸ - é¡¹ç›®å…¬ç¤º (bohuanchina.com/xiangmugongshi/)
CMS: ThinkPHP
åˆ—è¡¨: /xiangmugongshi/{id}.html, a æ–‡æœ¬
åˆ†é¡µ: /xiangmugongshi/index/p/N (62é¡µ)
è¯¦æƒ…: div.content, æ ‡é¢˜ h1
ç”¨æ³•: python3 crawl_bohuan_xmgs.py [--pages=N] [--json out.jsonl]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinu%   å¹¿è¥¿å�šçŽ¯çŽ¯å¢ƒå’¨è¯¢-é¡¹ç›®å…¬ç¤ºzhttp://www.bohuanchina.comz*http://www.bohuanchina.com/xiangmugongshi/zwww.bohuanchina.comu   ä¼�ä¸š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_bohuan_xmgs.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                 ó¨   — | dk(  rt         n
t         › d| › �}t        j                  |t        d¬«      }|j                  xs d|_        |j                  S )Né   zindex/p/é   ©ÚheadersÚtimeoutúutf-8)ÚLIST_URLÚrequestsÚgetÚHEADERSÚapparent_encodingÚencodingÚtext)ÚpÚurlÚrs      r   Ú
fetch_pager+   %   sG   € Ø˜1’f�(¤X J¨h°q°cÐ":€CÜ�‰�S¤'°2Ô6€AØ×$Ñ$Ò/¨€A„JØ�6‰6€Mr   c                 ó  — g }t        | d«      j                  dd¬«      D �]  }|j                  dd«      }d|v sŒ|j                  d«      j	                  d«      d	   j                  d
«      sŒNt        |j                  d¬«      «      }|rt        |«      dk  rŒz|j                  ddg«      }d}|rjt        j                  d|j                  «       «      }|rD|j                  d«      j                  dd«      j                  dd«      j                  dd«      d d }|j                  t        t         |«      ||dœ«       �Œ  t#        «       }g }	|D ]/  }
|
d   |vsŒ|j%                  |
d   «       |	j                  |
«       Œ1 |	S )Núhtml.parserÚaT©Úhrefr0   r   z/xiangmugongshi/ú/éÿÿÿÿz.html©r   é   ÚliÚdivõ#   20\d{2}[-/å¹´]\d{1,2}[-/æœˆ]\d{1,2}r   õ   å¹´ú-õ   æœˆé
   )r)   ÚtitleÚpub_dater)   )r   Úfind_allr#   ÚrstripÚsplitÚendswithr   Úget_textÚlenÚfind_parentr   ÚsearchÚgroupÚreplaceÚappendr   r!   ÚsetÚadd)ÚhtmlÚitemsr.   r0   r<   Úparentr=   ÚmÚseenÚuniqÚits              r   Ú
parse_listrR   ,   sk  € Ø€EÜ˜4 Ó/×8Ñ8¸À4Ð8ÓHó aˆØ�u‰u�V˜RÓ ˆØ Ò%¨$¯+©+°cÓ*:×*@Ñ*@ÀÓ*EÀbÑ*I×*RÑ*RÐSZÕ*[Ü §
¡
° 
Ó 6Ó7ˆEÙœC ›J¨šNØØ—]‘] D¨% =Ó1ˆFØˆHÙÜ—I‘IÐDÀfÇoÁoÓFWÓX�ÙØ Ÿw™w q›z×1Ñ1°%¸Ó=×EÑEÀeÈSÓQ×YÑYÐZ]Ð_bÓcÐdgÐegÐh�HØ�L‰L¤¬°4Ó!8À5ÐV^Ñ_Ö`ðaô ‹5€D˜�$Øò 1ˆØˆe‰9˜DÒ Ø�H‰H�R˜‘YÔ §¡¨R¥ð1ð €Kr   c                 ó|   — t        j                  | t        d¬«      }|j                  xs d|_        |j
                  S )Nr   r   r    )r"   r#   r$   r%   r&   r'   )r)   r*   s     r   Úfetch_detailrT   B   s/   € Ü�‰�S¤'°2Ô6€AØ×$Ñ$Ò/¨€A„JØ�6‰6€Mr   c                 óø  — ddddœ}t        | d«      }|j                  d«      }|rt        |j                  d¬«      «      |d<   |d   sJ|j                  d«      }|r7|j                  d¬«      }t	        j
                  dd|«      }t        |«      |d<   t	        j                  d	| d d
 «      }|rG|j                  d«      j                  dd«      j                  dd«      j                  dd«      d d |d<   |j                  dd¬«      }|D ]<  }|j                  dd¬«      }	t        |	«      dkD  sŒ%t        t        |«      «      |d<    n |d   s,|j                  dd¬«      }
|
rt        t        |
«      «      |d<   |S )Nr   ©r<   Úpublish_dateÚcontentr-   Úh1Tr3   r<   uF   [-_â€”]\s*(é¡¹ç›®å…¬ç¤º|å¹¿è¥¿å�šçŽ¯çŽ¯å¢ƒå’¨è¯¢æœ�åŠ¡æœ‰é™�å…¬å�¸).*$r7   i@  r   r8   r9   r:   r1   r;   rW   r6   rX   )Úclass_©Ú	separatorr   éÈ   zunf-nr)r   Úfindr   rB   r   r   rE   rF   rG   r>   rC   Úextract_clean_textÚstr)rK   ÚresultÚsoupÚhÚttr   rN   ÚdivsÚdÚtxtr6   s              r   Úparse_detailrh   H   sv  € Ø¨2¸"Ñ=€FÜ˜˜}Ó-€DØ�	‰	�$‹€AÙÜ% a§j¡j°t jÓ&<Ó=ˆˆw‰Ø�'Š?Ø�Y‰Y�wÓˆÙØ—‘ $�Ó'ˆAÜ—‘Ð`ÐbdÐfgÓhˆAÜ)¨!›nˆF�7‰OÜ
�	‰	Ð8¸$¸uÀ¸+ÓF€AÙØ!"§¡¨£×!3Ñ!3°E¸3Ó!?×!GÑ!GÈÈsÓ!S×![Ñ![Ð\_ÐadÓ!eÐfiÐgiÐ!jˆˆ~ÑØ�=‰=˜ yˆ=Ó1€DØò ˆØ�j‰j 2¨TˆjÓ2ˆÜˆs‹8�c‹>Ü 2´3°q³6Ó :ˆF�9ÑÙð	ð
 �)ÒØ�i‰i˜ hˆiÓ/ˆÙÜ 2´3°s³8Ó <ˆF�9ÑØ€Mr   c                 ó   — | syt        | d«      }|j                  dd¬«      D ]R  }|j                  dd«      }|j                  d¬«      xs d}t	        t
        |«      }|j                  d	|› d
|› d�«       ŒT |j                  g d¢«      D ]  }|j                  «        Œ g }|j                  ddg«      D ]u  }|j                  dk(  r|j                  t        |«      «       Œ-|j                  dk(  sŒ=|j                  d«      rŒO|j                  dd¬«      }	|	sŒe|j                  |	«       Œw |rdj                  |«      S | j                  «       S )Nr   r-   r.   Tr/   r0   r3   u   é™„ä»¶r
   z](ú))ÚspanÚbÚstrongÚfontÚemÚiÚuÚsÚtabler(   r[   z

)r   r>   r#   rB   r   ÚBASE_URLÚreplace_withÚunwrapÚnamerH   r`   rD   Újoinr   )
Úcontent_htmlrb   Úa_tagr0   r'   Úfull_urlÚtagÚpartsÚelr   s
             r   r_   r_   d   s6  € ÙØÜ˜ }Ó5€DØ—‘˜s¨�Ó.ò 4ˆØ�y‰y˜ Ó$ˆØ�~‰~ Dˆ~Ó)Ò5¨XˆÜœ8 TÓ*ˆØ×Ñ˜Q˜t˜f B x j°Ð2Õ3ð	4ð
 �}‰}ÒQÓRò ˆØ�
‰
�ðà€EØ�m‰m˜W c˜NÓ+ò  ˆØ�7‰7�gÒØ�L‰Lœ˜R›Õ!Ø�W‰W˜‹^ B§N¡N°7Õ$;Ø—‘ b°�Ó5ˆAÚØ—‘˜Q•ð ñ "'ˆ6�;‰;�uÓÐ@¨L×,>Ñ,>Ó,@Ð@r   r   c                 ó|  — t        d| › dt        › �«       g }t        «       }t        d| dz   «      D ]–  }	 t	        |«      }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 ]ž  \  }}	|	d   r|	d   t        k  rŒ	 t        |	d   «      }t        |«      }|
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"«       |j1                  «       }dx}}|
D ]V  }	 |j/                  d#|d$   |d%   |d%   |d   |d   |d   |d   xs dd d& |d'   f«       |j2                  dkD  r|dz  }n|dz  }ŒX |j5                  «        |j7                  «        t        d)|› d*|› d+�«       y # t
        $ r}t        d|› d|› �«       Y d }~ �Œd }~ww xY w# t
        $ r(}t        d|	d   dd  › d|› �«       ddddœ}Y d }~�Œõd }~ww xY w# 1 sw Y   �ŒNxY w# t
        $ r}t        d(|› �«       |dz  }Y d }~�Œd }~ww xY w),NzCrawl pages=z cutoff=r   ÚPz ERR: r   r)   z: z items (z new), total gš™™™™™é?r=   z	  detail iØÿÿÿr   rV   r<   rW   rX   u   é¡¹ç›®å…¬ç¤º)r<   Úpage_urlrW   rX   Ú	site_nameÚcolumnr;   z  r1   gš™™™™™Ù?Ú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) VALUES (?,?,?,?,?,?,?,?)r‚   r�   iô  rƒ   z
DB error: zResult: z new, z skipped)r   ÚCUTOFFrI   Úranger+   Ú	ExceptionrR   rJ   rH   rC   ÚtimeÚsleepÚ	enumeraterT   rh   r   ÚopenÚwriteÚjsonÚdumpsÚsqlite3Úconnectr   ÚexecuteÚcursorÚrowcountÚcommitÚclose)ÚpagesÚjson_outÚ	items_allrO   r(   rK   ÚerL   ÚnewrQ   ÚenrichedÚidxÚdetailÚfÚitemÚconnÚcÚstoredÚskippeds                      r   Úcrawlr¦   z   s   € Üˆ,�u�g˜X¤f XÐ.Ô/Ø€IÜ‹5€DÜ�1�e˜a‘iÓ ò ˆð	Ü˜a“=ˆDô ˜4Ó ˆØˆØò 	ˆBØ�%‰y Ò$Ø—‘˜˜E™Ô#Ø× Ñ  Ô$Ø�q‘‘ð		ô
 	ˆa�ˆs�"”S˜“Z�L ¨¨¨]¼3¸y»>Ð:JÐKÔLÙÙÜ�
‰
�3�ð!ð$ €HÜ˜Y¨Ó*ò ‰ˆˆRØˆjŠ>˜b ™n¬vÒ5Øð	FÜ  5¡	Ó*ˆDÜ! $Ó'ˆFð 	�‰Ø˜G‘_Ò3¨¨7©Ø˜5™	Ø" >Ñ2ÒD°b¸±nØ˜iÑ(Ü"Ø$ñ
ô 	ð �‰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±ð@ô	Að �z‰z˜AŠ~Ø˜!‘‘à˜1‘�øðð  	‡K�K„MØ‡J�J„LÜˆ(�6�(˜&  	¨Ð2Õ3øôE ò 	Ü�!�A�3�f˜Q˜CÐ Ô!Þûð	ûô, ò 	FÜ�)˜B˜u™I c d˜OÐ,¨F°1°#Ð6Ô7Ø!°2À"ÑEŽFûð	Fú÷ 	Eñ 	Eûô. ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰LŽGûð	úsT   µJ*Ã1KÆ	1LÈ"ALÊ*	KÊ3KËKË	LËK?Ë?LÌLÌ	L;ÌL6Ì6L;Ú__main__é   z--pages=r   z--pages=(\d+)z--json)r˜   r™   )r   N),Ú__doc__r   ÚsysÚosr�   rŠ   r‘   r"   r   r   Úbs4r   Úurllib.parser   r   rt   r!   ÚDOMAINÚGROUPÚnowÚstrftimer‡   Úenvironr#   r   r$   r   r   r+   rR   rT   rh   r_   r¦   Ú__name__ÚargvÚargsr˜   r™   rx   ÚintrE   rF   Úindex© r   r   ú<module>r¹      s:  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  à3€	Ø'€Ø7€Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€Øð  Kð  L€ò.òòòò,òò8Aó,I4ðX ˆ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   