Ë
    ¡Š£j¤2  ã                   ó¢  — 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dl	m
Z
 dZdZdZdZd	Zd
ddddœZdZh d£Zd„ Zd„ Zd„ Zd„ Zd„ Zdefd„Zedk(  rxdej4                  v ZerdneZdej4                  v rKej4                  j;                  d«      Zedz    eej4                  «      k  r e ej4                  edz      «      Z eee¬«       yy)uÄ   
æ€€å®�åŽ¿äººæ°‘æ”¿åºœ - å»ºè®¾é¡¹ç›®çŽ¯è¯„æ–‡ä»¶ï¼ˆæŠ¥å‘Šä¹¦ã€�æŠ¥å‘Šè¡¨ï¼‰å®¡æ‰¹
https://www.ahhn.gov.cn/grassroots/column/2000000951?catId=1002621
è“�æ±›(Lonsun) CMS - åŸºå±‚æ”¿åŠ¡å…¬å¼€ç›®å½•
é    N)ÚBeautifulSoup)Úurljoinz/root/search.dbu(   æ€€å®�åŽ¿-å»ºè®¾é¡¹ç›®çŽ¯è¯„æ–‡ä»¶å®¡æ‰¹u   å®‰å¾½zBhttps://www.ahhn.gov.cn/grassroots/column/2000000951?catId=1002621é   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-LanguageÚRefererz�
INSERT OR IGNORE INTO gov_raw 
    (site_name, page_url, title, publish_date, summary, content, category, attachments)
    VALUES (?, ?, ?, ?, '', ?, ?, ?)
>)   Ú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Úchr3   ÚoutÚwalks     €€€ú"/root/gov_crawler/crawl_ahhn_hn.pyrA   zbody_text.<locals>.walk7   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]*r7   z\n{3,}z

)ÚreÚbs4r3   ÚjoinÚsubÚstrip)ÚelÚ_reÚtr3   r@   rA   s      @@@rB   Ú	body_textrL   /   sb   ú€ à	€zØÛÝ#Ø
€Cöñ 	ˆ„HØ
�‰�‹€AØ�‰Ð-¨t°QÓ7€AØ�‰�	˜6 1Ó%€AØ�7‰7‹9ÐrC   c                  ó|   — dd l } | j                  t        «      }|j                  d«       |j                  d«       |S )Nr   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000)Úsqlite3ÚconnectÚDB_PATHÚexecute)rN   Úconns     rB   Úinit_dbrS   J   s2   € ÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€KrC   c                 ó,   — | €y| j                  d¬«      S )z,Extract text from an element, handling None.r2   T©rH   )Úget_text)Úelems    rB   Ú	safe_textrX   R   s   € à€|ØØ�=‰=˜tˆ=Ó$Ð$rC   c                 ób  — | dk(  rt         }nt         › d| › �}	 t        j                  |t        d¬«      }d|_        |j                  dk7  rt        d|j                  › d| › �d¬	«       g S t        |j                  d«      }g }|j                  d«      D ]Ñ  }|j                  dd¬«      }|sŒ|j                  dd«      j                  «       }|s|j                  d¬«      }|j                  dd«      j                  «       }	|	r|	j                  d«      rŒ�t        t         |	«      }
|j                  dd¬«      }t!        |«      j                  «       }|j#                  ||
|dœ«       ŒÓ t        d| › dt%        |«      › d�d¬	«       |S # t
        $ r}t        d| › d|› �d¬	«       g cY d
}~S d
}~ww xY w)z<Fetch a list page and extract article URLs + titles + dates.é   z&pageIndex=é   ©ÚheadersÚtimeoutúutf-8z  [ERROR] Failed to fetch page ú: T©ÚflushNéÈ   ú  [ERROR] HTTP z
 for page úhtml.parserzli.clearfixÚaÚtitle)Úclass_r2   rU   ÚhrefÚ
javascriptÚspanÚdate)rg   Úurlrl   ú  Page z items)ÚBASE_URLÚrequestsÚgetÚHEADERSÚencodingÚ	ExceptionÚprintÚstatus_coder   ÚtextÚselectÚfindrH   rV   Ú
startswithr   rX   r:   Úlen)Úpage_numrm   ÚrÚeÚsoupÚitemsr   Úa_tagrg   ri   Úfull_urlÚ	date_spanÚdate_strs                rB   Úextract_list_pager…   Y   s¨  € à�1‚}Ü‰ä�
˜+ h ZÐ0ˆðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ð
 	‡}�}˜ÒÜ� §¡˜¨j¸¸
ÐCÈ4ÕPØˆ	ä˜Ÿ™ Ó/€DØ€Eà�k‰k˜-Ó(ò ˆØ—‘˜ G�Ó,ˆÙØð —	‘	˜' 2Ó&×,Ñ,Ó.ˆÙØ—N‘N¨�NÓ.ˆEà�y‰y˜ Ó$×*Ñ*Ó,ˆÙ�t—‘ |Ô4ØÜœ8 TÓ*ˆð —G‘G˜F¨6�GÓ2ˆ	Ü˜YÓ'×-Ñ-Ó/ˆà�‰ØØØñ
õ 	ð'ô2 
ˆG�H�:˜R¤ E£
˜|¨6Ð
2¸$Õ?Ø€LøôK ò ÜÐ/°¨z¸¸A¸3Ð?ÀtÕLØ�	ûðús   ™#F Æ	F.ÆF)Æ#F.Æ)F.c                 ó^  — 	 t        j                  | t        d¬«      }d|_        |j                  d	k7  rt        d
|j                  › d| › �d¬«       yt        |j                  d«      }d}|j                  dddi¬«      }|r$|j                  d«      r|d   j                  «       }|j                  d«      }|s|j                  d«      }|s|j                  d«      }d}|rt        |«      }d}|�rÞt        |«      }	|j                  d«      }
t        |
«      D ]'  \  }}d|› d�}|	j                  t        |«      |d«      }	Œ) t        |	d«      }t!        |«      }g }|j#                  d«      }d}|D �]J  }|j                  «       }|sŒ|j%                  d«      �r|j'                  d«      �rÿ|}|dz  }|t)        |
«      k  sŒQ|
|   }|j                  d«      }|sŒjd}|D ]*  }|j                  dd g«      }t+        |t)        |«      «      }Œ, |d!k(  rñd"d#g}|D ]¼  }|j                  dd g«      }t)        |«      d!k\  sŒ%|d   j-                  d$d¬%«      }|d   j-                  d$d¬%«      }|rUt/        |d   j                  d&d«      «      }|dkD  r|j1                  d'|› d(|› d)�«       Œ�|j1                  d'|› d(|› d)�«       Œ¨|j1                  d*|› d)�«       Œ¾ |s�Œi|j1                  ddj3                  |«      z   dz   «       �Œ‘|}dg|z  }|D ]V  }|j                  dd g«      }t        |«      D ]3  \  }}|j-                  d$d¬%«      } t+        ||   t)        | «      «      ||<   Œ5 ŒX |D �!cg c]  }!t+        d+t5        |!d!z   d,«      «      ‘Œ }}!g }t        |«      D ]ä  \  }"}|j                  dd g«      }g }#t7        |«      D ]K  }$|$t)        |«      k  r||$   j-                  d$d¬%«      nd}%|#j1                  |%j9                  ||$   «      «       ŒM d'}&|j1                  |&|&j3                  |#«      z   d)z   «       |"dk(  sŒ¢g }'|D ]  }!|'j1                  d-|!z  «       Œ |j1                  d.d/j3                  |'«      z   d0z   «       Œæ |s�Œ|j1                  ddj3                  |«      z   dz   «       �Œ:|j1                  |«       �ŒM dj3                  |«      }g }(|r|j                  d1d¬2«      ng D ]u  })|)d3   }*t;        j<                  d4|*t:        j>                  «      sŒ.|)j-                  d¬%«      xs |*j#                  d5«      d6   }+tA        | |*«      },|(j1                  |+|,d7œ«       Œw ||||(rtC        jD                  |(d8¬9«      d:œS dd:œS # t        $ r}t        d| › d|› �d¬«       Y d}~yd}~ww xY wc c}!w );z-Fetch a detail page and extract full content.r[   r\   r_   z  [ERROR] Failed to fetch r`   Tra   Nrc   rd   z for re   r2   Úmetar5   ÚPubDate)ÚattrsÚcontentz%div.j-fontContent.newscontnet.minh500zdiv.xxgk_contentzdiv.content_mainr   z	
__TABLE_z__
rZ   r7   r   Ú__TABLE_Ú__r   r   r   é   u   | é¡¹ ç›® | å†… å®¹ |z|------|------|ú rU   Úrowspanz| z | z |z| | é   é(   ú-z|-z-|-z-|rf   )ri   ri   z"\.(pdf|doc|docx|xls|xlsx|rar|zip)$ú/éÿÿÿÿ)r5   rm   F)Úensure_ascii)rŠ   Úcontent_htmlÚpub_dateÚattachments)#rp   rq   rr   rs   rt   ru   rv   r   rw   ry   rH   Ú
select_oner;   Úfind_allÚ	enumerateÚreplacerL   Úsplitrz   Úendswithr{   ÚmaxrV   Úintr:   rF   ÚminÚrangeÚljustrD   ÚsearchÚ
IGNORECASEr   ÚjsonÚdumps)-rm   r}   r~   r   r—   Ú	meta_dateÚcontent_divr–   Úcontent_textÚcontent_html_strÚ
all_tablesÚtir   ÚmarkerÚ
clean_soupÚ
clean_textÚpartsÚsegmentsÚ	table_idxÚsegÚrowsÚmax_colsÚrowÚcellsÚtable_linesÚlabelÚvaluer�   Únum_colsÚ
col_widthsÚiÚcellÚ	cell_textÚwÚriÚ
cell_textsÚciÚtxtÚsepÚsep_liner˜   r�   ri   Ú	att_titler‚   s-                                                rB   Úextract_detailrÉ   ‹   s  € ðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ð
 	‡}�}˜ÒÜ� §¡˜¨e°C°5Ð9ÀÕFØä˜Ÿ™ Ó/€Dð €HØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø˜YÑ'×-Ñ-Ó/ˆð —/‘/Ð"IÓJ€KÙØ—o‘oÐ&8Ó9ˆÙØ—o‘oÐ&8Ó9ˆà€LÙÜ˜;Ó'ˆð €LÚä˜{Ó+Ðð !×)Ñ)¨'Ó2ˆ
Ü" :Ó.ò 	O‰IˆB�Ø! "  TÐ*ˆFØ/×7Ñ7¼¸E»
ÀFÈAÓNÑð	Oô
 #Ð#3°]ÓCˆ
Ü˜zÓ*ˆ
ð ˆØ×#Ñ# DÓ)ˆØˆ	Øó >	"ˆCØ—)‘)“+ˆCÙØØ�~‰~˜jÕ)¨c¯l©l¸4Õ.@Ø�Ø˜Q‘�	Øœ˜J›Ó'Ø& r™N�EØ Ÿ>™>¨$Ó/�DÚà#$˜Ø#'ò A˜CØ$'§L¡L°$¸°Ó$>˜EÜ'*¨8´S¸³ZÓ'@™HðAð $ qš=à+BÐDUÐ*V˜KØ'+ò M Ø(+¯©°d¸D°\Ó(B Ü#& u£:°£?Ø,1°!©H×,=Ñ,=¸cÈÐ,=Ó,N EØ,1°!©H×,=Ñ,=¸cÈÐ,=Ó,N EÙ',Ü25°e¸A±h·l±lÀ9ÈaÓ6PÓ2Q¨Ø+2°Qª;Ø,7×,>Ñ,>ÀÀEÀ7È#ÈeÈWÐTVÐ?WÕ,Xà,7×,>Ñ,>ÀÀEÀ7È#ÈeÈWÐTVÐ?WÕ,Xà(3×(:Ñ(:¸TÀ%ÀÈÐ;KÕ(LðMó  +Ø %§¡¨T°D·I±I¸kÓ4JÑ-JÈTÑ-QÖ Rð (0˜HØ*+¨¨x©˜JØ'+ò W Ø(+¯©°d¸D°\Ó(B Ü/8¸Ó/?ò !W¡G A tØ04·±¸cÈ°Ó0N IÜ47¸
À1¹ÄsÈ9Ã~Ó4V J¨q¢Mñ!WðWð
 KUÖ)UÀQ¬#¨a´°Q¸±U¸B³Õ*@Ð)U˜JÐ)UØ*,˜KÜ+4°T«?ò [¡  CØ(+¯©°d¸D°\Ó(B Ø-/ 
Ü*/°«/ò !Q BØQSÔVYÐZ_ÓV`ÒQ`¨%°©)×*<Ñ*<¸SÈÐ*<Ô*MÐfh CØ$.×$5Ñ$5°c·i±iÀ
È2ÁÓ6OÕ$Pð!Qð '+ Ø +× 2Ñ 2°3¸¿¹À*Ó9MÑ3MÐPTÑ3TÔ UØ#%¨£7Ø/1 HØ-7ò %A¨Ø(0¯©¸¸a¹Õ(@ð%Aà$/×$6Ñ$6°t¸e¿j¹jÈÓ>RÑ7RÐUYÑ7YÕ$Zð[ó  +Ø %§¡¨T°D·I±I¸kÓ4JÑ-JÈTÑ-QÖ Rà—‘˜SÖ!ð}>	"ð@ —y‘y Ó'ˆð €KÙ9D�×%Ñ% c°Ð%Ô5È"ò EˆØ�V‰}ˆÜ�9‰9Ð:¸DÄ"Ç-Á-ÕPØŸ™¨T˜Ó2ÒI°d·j±jÀ³oÀbÑ6IˆIÜ˜s DÓ)ˆHØ×Ñ¨	¸(ÑCÕDðEð  Ø$ØÙFQ”t—z‘z +¸EÔBñ	ð ð XZñ	ð øôu ò ÜÐ*¨3¨%¨r°!°Ð5¸TÕBÜûðüòv *Vs   ‚#V Í' V*Ö	V'Ö
V"Ö"V'Fc                 óH  — t        dt        › d|› �d¬«       t        «       }|j                  «       }d}d}d}t	        d|dz   «      D �]*  }t        |«      }|s|dkD  rt        d|› d�d¬«        �nŒ+|dz  }|D ]·  }	|	d	   }
|	d
   }|	d   }|j                  d|f«       |j                  «       r|dz  }Œ;t        |«      }|€|dz  }ŒN|d   }t        |j                  «       «      dk  r	d|› d|
› d�}|d   }|j                  t        t        ||
|xs |d   |t        |f«       |dz  }| sŒ±|dk\  sŒ· n |j                  «        | r|dk\  rt        d|› d�d¬«        nt        j                  d«       �Œ- |j!                  «        t        dt        › d|› d|› d|› �d¬«       |S )zMain crawl function.ú[z] Starting crawl, max_pages=Tra   r   rZ   rn   z empty, stoppingrg   rm   rl   z)SELECT id FROM gov_raw WHERE page_url = ?rŠ   é   z<p><a href="z">u!   </a></p>
ï¼ˆæœ¬æ–‡ä¸ºPDFé™„ä»¶ï¼‰r˜   r—   é
   z  Test mode: stopping after z insertsz] Done. Inserted=z
, Skipped=z, Pages=)ru   Ú	SITE_NAMErS   Úcursorr¢   r…   rQ   ÚfetchonerÉ   r{   rH   Ú
INSERT_SQLÚCATEGORYÚcommitÚtimeÚsleepÚclose)Ú	test_modeÚ	max_pagesrR   ÚcurÚtotal_insertedÚtotal_skippedÚpages_crawledr|   r€   Úitemrg   rm   rl   ÚdetailrŠ   r˜   s                   rB   Úcrawlrß     sû  € ä	ˆAŒiˆ[Ð4°Y°KÐ
@ÈÕMÜ‹9€DØ
�+‰+‹-€Cà€NØ€MØ€Mä˜!˜Y¨™]Ó+ó 2ˆÜ! (Ó+ˆÙØ˜!Š|Ü˜ ˜zÐ)9Ð:À$ÕGÚØà˜ÑˆØò  	ˆDØ˜‘MˆEØ�u‘+ˆCØ˜‘<ˆDð �K‰KÐCÀcÀVÔLØ�|‰|Œ~Ø Ñ"�Øô $ CÓ(ˆFØˆ~Ø Ñ"�Øà˜YÑ'ˆGô �7—=‘=“?Ó# bÒ(Ø(¨¨¨R°¨wÐ6XÐY�à  Ñ/ˆKà�K‰Kœ
Ü˜3  tÒ'A¨v°jÑ/AØœ ;ð%ô ð ˜aÑˆNâ˜^¨rÓ1ÙðA 	ðD 	�‰Œá˜¨2Ò-ÜÐ0°Ð0@ÀÐIÐQUÕVÙô 	�
‰
�1Žðe2ðh 	‡J�J„LÜ	ˆAŒiˆ[Ð)¨.Ð)9¸ÀMÀ?ÐRZÐ[hÐZiÐ
jÐrvÕwØÐrC   Ú__main__z--testé   z--max-pagesrZ   )r×   rØ   )!Ú__doc__rD   ÚsysrÔ   r¦   Úhashlibrp   rE   r   Úurllib.parser   rP   rÎ   rÒ   ro   Ú	MAX_PAGESrr   rÑ   r=   rL   rS   rX   r…   rÉ   rß   Ú__name__Úargvr×   ÚmpÚindexÚidxr{   r    © rC   rB   ú<module>rí      s  ðñó
 
Û 
Û Û Û Û Ý Ý  à
€Ø6€	Ø€ØO€Ø€	ð DØOØ0ØSñ	€ð€
ò*€òò6ò%ò/òdDðN  Yó @ðF ˆzÒØ˜CŸH™HÐ$€IÙ‰˜Y€BØ˜Ÿ™Ñ Ø�h‰h�n‰n˜]Ó+ˆØ�‰7‘S˜Ÿ™“]Ò"Ù�S—X‘X˜c A™gÑ&Ó'ˆBÙ	�I¨Ö,ð rC   