Ë
    ,„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ez   d	z   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„Zd„ Zd#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;  
é»„å¹³åŽ¿äººæ°‘æ”¿åºœ - çŽ¯å¢ƒè¯„ä»· (qdnhp.gov.cn/xxgk/zdxxgk/hjbh/xmhp/)
åˆ—è¡¨: /xxgk/zdxxgk/hjbh/xmhp/ (P1), index_{N}.html (PN, å…±4é¡µ)
åˆ—è¡¨é¡¹: a href="...xmhp/20MM/t20MMDD_ID.html" (æ ‡é¢˜å�«&middot;å‰�ç¼€+<i>æ—¥æœŸ)
è¯¦æƒ…: TRS_UEDITOR
ç”¨æ³•: python3 crawl_qdnhp_hjsp.py [--pages=N] [--json out.jsonl]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinu"   é»„å¹³åŽ¿äººæ°‘æ”¿åºœ-çŽ¯å¢ƒè¯„ä»·zhttps://www.qdnhp.gov.cnz/xxgk/zdxxgk/hjbh/xmhpú/zwww.qdnhp.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_qdnhp_hjsp.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;|&middot;|\u200b|\ufeffÚ z\s+ú u   \.\.\.|â€¦$)ÚreÚsubÚstrip)Úts    r   Úclean_titler      sK   € Ü
�‰Ð6¸¸AºGÀÓD€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰ˆ~˜r 1Ó%×+Ñ+Ó-€AØ€Hr   c                 ó&  — t        d«      D ]3  }	 t        j                  | t        |¬«      }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é   )ÚheadersÚtimeoutúutf-8é   z
fetch ERR iÎÿÿÿú: r   é   é   )
ÚrangeÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	Exceptionr   ÚtimeÚsleep)Úurlr   ÚattemptÚrÚes        r   Úfetchr1   "   s�   € Ü˜“8ò 	*ˆð	*Ü—‘˜S¬'¸7ÔCˆ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        |«      }|sg S g }t        j                  dt        j                  «      }|j                  |«      D ]ó  }|j                  d«      |j                  d«      }}t        j                  d|«      }|r|j                  d«      j                  «       nd}	t        j                  dd|«      }
t        |
«      }
|
s4t        j                  d	|«      }t        |r|j                  d«      nd«      }
|j                  d
«      r|nt        t         |«      }|
sŒÜ|j                  |
||	d d dœ«       Œõ |S )Nr#   Úindex_z.htmlz7<a[^>]+href="([^"]*?t20\d{6}_\d+\.html)"[^>]*>(.*?)</a>r"   z<i[^>]*>([^<]*)</i>r   z<[^>]+>ztitle="([^"]+)"Úhttpé
   )Útitler-   Údate)ÚLIST_URLr1   r   ÚcompileÚSÚfinditerÚgroupÚsearchr   r   r   Ú
startswithr   Úappend)Úpager-   ÚhtmlÚitemsÚpatÚmÚhrefÚinnerÚimr7   r6   ÚtmÚfulls                r   Ú
fetch_listrJ   /   s*  € Ø˜a’i�(¬ z°¸°v¸UÐ%C€CÜ�‹:€DÙØˆ	Ø€EÜ
�*‰*ÐOÔQS×QUÑQUÓ
V€CØ�\‰\˜$Óò KˆØ—g‘g˜a“j !§'¡'¨!£*ˆeˆä�Y‰YÐ-¨uÓ5ˆÙ&(ˆr�x‰x˜‹{× Ñ Ô"¨bˆÜ—‘�z 2 uÓ-ˆÜ˜EÓ"ˆÙÜ—‘Ð-¨uÓ5ˆBÜ©r §¡¨¤°rÓ:ˆEØ—‘ vÔ.‰t´G¼HÀdÓ4KˆÚØ�L‰L 5°¸tÀCÀR¸yÑIÕJðKð €Lr   c                 ó°  — | syt        | d«      }|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   úhtml.parserÚaT)rE   rE   ©r   u   é™„ä»¶z<p><a href="z">z</a></p>)ÚspanÚbÚstrongÚfontÚemÚiÚuÚsÚtableÚp)Ú	separatorr   z<p>z</p>z

)r   Úfind_allr&   Úget_textr   ÚBASE_URLÚreplace_withÚunwrapÚnamer?   ÚstrÚfind_parentÚjoinr   )Úcontent_htmlÚpage_urlÚsoupÚa_tagrE   r)   Úfull_urlÚtagÚpartsÚelr   s              r   Úextract_clean_textrk   E   sF  € ÙØÜ˜ }Ó5€DØ—‘˜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«      }|rt        |j	                  d¬«      «      |d<   t        j                  d|d d «      }|r|j                  d	«      |d
<   |j                  dd¬«      }|s|j                  dd¬«      }|rt        t        |«      | «      |d<   |S )Nr   )r6   Úpublish_dateÚcontentrL   r6   TrN   z(\d{4}-\d{2}-\d{2})i@  r#   rm   ÚdivÚTRS_UEDITOR)Úclass_rn   )
r1   r   Úfindr   r[   r   r=   r<   rk   r`   )r-   rA   re   ÚresultÚttagrD   Úcontent_divs          r   Úparse_detailrv   Z   sÎ   € Ü�‹:€DÙØ¨R¸BÑ?Ð?Ü˜˜}Ó-€DØ¨2¸"Ñ=€FØ�9‰9�WÓ€DÙÜ% d§m¡m¸$ mÓ&?Ó@ˆˆw‰Ü
�	‰	Ð(¨$¨u°¨+Ó6€AÙØ!"§¡¨£ˆˆ~ÑØ—)‘)˜E¨-�)Ó8€KÙØ—i‘i ¨i�iÓ8ˆÙÜ.¬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   r7   r6   rn   u   çŽ¯å¢ƒè¯„ä»·)r6   rd   rm   rn   Ú	site_nameÚcolumnr5   z  r   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   rd   r   iô  r{   zcrawl_qdnhp_hjsp.pyz
DB error: zResult: z new, z skipped)r   ÚCUTOFFÚsetr$   rJ   Úaddr?   Úlenr+   r,   Ú	enumeraterv   r   ÚopenÚwriteÚjsonÚdumpsÚsqlite3Úconnectr	   ÚexecuteÚcursorÚrowcountr*   ÚcommitÚclose)ÚpagesÚjson_outÚ	items_allÚseenrX   rB   ÚnewÚitÚenrichedÚidxÚdÚfÚitemÚconnÚcÚstoredÚskippedr0   s                     r   Úcrawlrž   m   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±Ð@UðWô	Xð �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),Ú__doc__r   ÚsysÚosr†   r+   rˆ   r%   r   r   Úbs4r   Úurllib.parser   r   r\   Ú	LIST_PATHr8   ÚDOMAINÚGROUPÚnowÚstrftimer   Úenvironr&   r	   r'   r   r   r1   rJ   rk   rv   rž   Ú__name__ÚargvÚargsr�   r�   rb   Úintr=   r<   Úindex© r   r   ú<module>r²      sC  ðñ÷ 2× 1× 1Ó 1ß (Ý Ý  à0€	Ø%€Ø$€	Ø�iÑ #Ñ%€Ø	€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø
�*‰*�.‰.˜Ð$5Ó
6€Øð  Kð  L€ò.òóòó,Aò*ó&?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   