Ë
     Š£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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efd„Zedk(  �rxdej0                  v ZerdneZdZdej0                  v rdZdZdej0                  v rKej0                  j9                  d«      Zedz    eej0                  «      k  r eej0                  edz      «      Zerêg Z dZ! e"dedz   «      D ]š  Z# ee#«      Z$e$s nŽe$D ]‡  Z% ee%d   «      Z&e&rfe%d   Z'e'r ejP                  d e'«      rd!e'› �Z'e jS                  ee%d   e%d"   e'xs e&d#   e&d$   ee&d%   d&œ«       e!dz  Z!e!d'z  dk(  r e*d(e!› d)�d¬*«        ejV                  d+«       Œ‰ Œœ d,Z, e-e,d-d.¬/«      5 Z. ej^                  e e.dd0¬1«       ddd«        e*d2e!› d3e,› �d¬*«       y eee¬4«       yy# 1 sw Y   Œ&xY w)5uz   
éƒ´å·žæ–°ç½‘ - å…¬å‘Šå¤´æ�¡ (0735.com)
https://www.0735.com/toutiao/list-22.html
æœ¬åœ°ç”Ÿæ´»ä¿¡æ�¯é—¨æˆ· - è‡ªå®šä¹‰CMS
é    N)ÚBeautifulSoup)Úurljoinz/root/search.dbu   éƒ´å·žæ–°ç½‘-å…¬å‘Šå¤´æ�¡u   ä¼�ä¸šz)https://www.0735.com/toutiao/list-22.htmlé   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.8zhttps://www.0735.com/toutiao/)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_0735.pyrA   zbody_text.<locals>.walk6   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,}ú

)ÚreÚbs4r3   ÚjoinÚsubÚstrip)ÚelÚ_reÚtr3   r@   rA   s      @@@rB   Ú	body_textrM   .   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)rO   Úconns     rB   Úinit_dbrT   I   s2   € ÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø€KrC   c                 óZ  — | dk(  rt         }n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«      }|sŒ|j                  d¬«      }|j                  dd«      j                  «       }	|	sŒLt        ||	«      }
|j                  }|r|j                  dd¬«      nd
}|r|j                  dd¬«      nd
}|r|j                  d¬«      nd}t!        j"                  d|«      rŒ¿|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/https://www.0735.com/toutiao/list-22.html?page=é   ©ÚheadersÚtimeoutúutf-8z  [ERROR] Failed to fetch page ú: T©ÚflushNéÈ   ú  [ERROR] HTTP z
 for page úhtml.parserz.con h3Úa©rI   Úhrefr2   r   Úinfo2)Úclass_ÚspanÚtimeu   [å¤©æ—¶åˆ†é’Ÿç§’]å‰�)ÚtitleÚurlÚdateú  Page z items)ÚBASE_URLÚrequestsÚgetÚHEADERSÚencodingÚ	ExceptionÚprintÚstatus_coder   ÚtextÚselectÚfindÚget_textrI   r   ÚparentrE   Úsearchr:   Úlen)Úpage_numrj   ÚrÚeÚsoupÚitemsr   Úa_tagri   rd   Úfull_urlÚ
parent_tagre   Ú	time_spanÚdate_strs                  rB   Úextract_list_pager†   Q   s¯  € à�1‚}Ü‰à?À¸zÐJˆðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ð
 	‡}�}˜ÒÜ� §¡˜¨j¸¸
ÐCÈ4ÕPØˆ	ä˜Ÿ™ Ó/€DØ€Eà�k‰k˜)Ó$ò ˆØ—‘˜“ˆÙØà—‘ T�Ó*ˆØ�y‰y˜ Ó$×*Ñ*Ó,ˆÙØÜ˜3 Ó%ˆð —Y‘Yˆ
Ù:D�
—‘ ¨g�Ô6È$ˆÙ9>�E—J‘J˜v¨f�JÔ5ÀDˆ	Ù5>�9×%Ñ%¨DÐ%Ô1ÀBˆä�9‰9Ð,¨hÔ7Øà�‰ØØØñ
õ 	ð)ô4 
ˆG�H�:˜R¤ E£
˜|¨6Ð
2¸$Õ?Ø€LøôM ò ÜÐ/°¨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«      }|r%|j                  d«      }|r|j                  d¬«      }|j                  d«      }|s|j                  d«      }|s|j                  d«      }d}g }	|�r*t        |«      }
g }|j                  d«      D ]!  }t        |«      }|sŒ|j                  |«       Œ# dj!                  |«      }|j                  dd¬«      D ]u  }|d   }t#        j$                  d|t"        j&                  «      sŒ.|j                  d¬«      xs |j)                  d«      d   }t+        | |«      }|	j                  ||dœ«       Œw |j                  d«      D ]8  }|j                  d¬«      }d|v s	d|v sd|v sŒ"|	j                  |dd  |dœ«       Œ: |||	rt-        j.                  |	d!¬"«      d#œS dd#œS # t        $ r}t        d| › d|› �d¬«       Y d}~yd}~ww xY w)$z-Fetch a detail page and extract full content.rW   rX   r[   z  [ERROR] Failed to fetch r\   Tr]   Nr_   r`   z for ra   r2   zul.publish_lr   rc   zdiv.con#resizeIMGzdiv.conzdiv.zx-content div.detailr   rD   rb   )rd   rd   z"\.(pdf|doc|docx|xls|xlsx|rar|zip)$ú/éÿÿÿÿ)r5   rj   u   ç½‘ç›˜u   é“¾æŽ¥:u	   æ��å�–ç �éP   F)Úensure_ascii)ÚcontentÚpub_dateÚattachments)rn   ro   rp   rq   rr   rs   rt   r   ru   Ú
select_onerw   rx   r;   Úfind_allrM   r:   rG   rE   rz   Ú
IGNORECASEÚsplitr   ÚjsonÚdumps)rj   r}   r~   r   r�   Ú
publish_ulr   Úcontent_divÚcontent_textÚattachments_listÚcontent_htmlÚ
paragraphsr   rL   r�   rd   Ú	att_titler‚   ru   s                      rB   Úextract_detailrœ   „   sm  € ðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ð
 	‡}�}˜ÒÜ� §¡˜¨e°C°5Ð9ÀÕFØä˜Ÿ™ Ó/€Dð €HØ—‘ Ó0€JÙØ�_‰_˜TÓ"ˆÙØ—{‘{¨�{Ó.ˆHð —/‘/Ð"5Ó6€KÙØ—o‘o iÓ0ˆÙØ—o‘oÐ&AÓBˆà€LØÐâä˜;Ó'ˆð ˆ
Ø×%Ñ% cÓ*ò 	%ˆAÜ˜!“ˆAÚØ×!Ñ! !Õ$ð	%ð —{‘{ :Ó.ˆð !×)Ñ)¨#°DÐ)Ó9ò 	NˆEØ˜‘=ˆDÜ�y‰yÐ>ÀÄbÇmÁmÕTØ!ŸN™N°˜NÓ6ÒM¸$¿*¹*ÀS»/È"Ñ:M�	Ü" 3¨Ó-�Ø ×'Ñ'°À8Ñ(LÕMð	Nð ×%Ñ% cÓ*ò 	JˆAØ—:‘: D�:Ó)ˆDØ˜4Ñ 9°Ñ#4¸ÀtÒ8KØ ×'Ñ'°°c°r°À4Ñ(HÕIð	Jð  ØÙK[”t—z‘zÐ"2ÀÔGñð ð bdñð øôm ò ÜÐ*¨3¨%¨r°!°Ð5¸TÕBÜûðús   ‚#H+ È+	IÈ4IÉIFc                 óv  — t        dt        › d|› �d¬«       t        «       }|j                  «       }d}d}d}t	        d|dz   «      D �]A  }t        |«      }|s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   }|rt        j                  d|«      r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«       �ŒD |j%                  «        t        dt        › d|› d|› d|› �d¬«       |S )zMain crawl function.ú[z] Starting crawl, max_pages=Tr]   r   rV   rl   z empty, stoppingri   rj   rk   z)SELECT id FROM gov_raw WHERE page_url = ?rŒ   é   z<p><a href="z">u(   </a></p>
ï¼ˆæœ¬æ–‡ä¸ºPDF/ç½‘ç›˜é™„ä»¶ï¼‰rŽ   ú^\d{2}-\d{2}$ú2026-r�   é
   z  Test mode: stopping after z insertsg      à?z] Done. Inserted=z
, Skipped=z, Pages=)rs   Ú	SITE_NAMErT   ÚcursorÚranger†   rR   Úfetchonerœ   r{   rI   rE   ÚmatchÚ
INSERT_SQLÚCATEGORYÚcommitrh   ÚsleepÚclose)Ú	test_modeÚ	max_pagesrS   ÚcurÚtotal_insertedÚtotal_skippedÚpages_crawledr|   r€   Úitemri   rj   rk   ÚdetailrŒ   rŽ   s                   rB   Úcrawlrµ   Æ   s  € ä	ˆAŒiˆ[Ð4°Y°KÐ
@ÈÕMÜ‹9€DØ
�+‰+‹-€Cà€NØ€MØ€Mä˜!˜Y¨™]Ó+ó 4ˆÜ! (Ó+ˆÙÜ�G˜H˜:Ð%5Ð6¸dÕCÚà˜ÑˆØò $	ˆDØ˜‘MˆEØ�u‘+ˆCØ˜‘<ˆDð �K‰KÐCÀcÀVÔLØ�|‰|Œ~Ø Ñ"�Øô $ CÓ(ˆFØˆ~Ø Ñ"�Øà˜YÑ'ˆGô �7—=‘=“?Ó# bÒ(Ø(¨¨¨R°¨wÐ6_Ð`�à  Ñ/ˆKñ œŸ™Ð!1°4Ô8Ø˜t˜f�~�à�K‰Kœ
Ü˜3  tÒ'A¨v°jÑ/AØœ ;ð%ô ð ˜aÑˆNâ˜^¨rÓ1ÙðI$	ðL 	�‰Œá˜¨2Ò-ÜÐ0°Ð0@ÀÐIÐQUÕVÙô 	�
‰
�3Žði4ðl 	‡J�J„LÜ	ˆAŒiˆ[Ð)¨.Ð)9¸ÀMÀ?ÐRZÐ[hÐZiÐ
jÐrvÕwØÐrC   Ú__main__z--testé   z--json-outputTz--max-pagesrV   rj   rk   r    r¡   ri   r�   rŒ   rŽ   )Ú	site_nameÚpage_urlri   Úpublish_daterŒ   ÚcategoryrŽ   rŸ   z[progress] z crawled...r]   g333333Ó?z/tmp/0735_data.jsonÚwr[   )rq   é   )r‹   Úindentz[done] z items saved to )r­   r®   )0Ú__doc__rE   Úsysrh   r“   rn   rF   r   Úurllib.parser   rQ   r£   r©   rm   Ú	MAX_PAGESrp   r¨   r=   rM   rT   r†   rœ   rµ   Ú__name__Úargvr­   ÚmpÚjson_outputÚindexÚidxr{   ÚintÚitems_crawledr°   r¥   r|   r€   r³   r´   rk   r§   r:   rs   r«   Úout_pathÚopenÚfÚdump© rC   rB   ú<module>rÐ      sq  ðñó
 
Û 
Û Û Û Ý Ý  à
€Ø'€	Ø€Ø6€Ø€	ð DØOØ0Ø.ñ	€ð€
ò*€òò6ò0òf?ðD  Yó BðJ ˆzÓØ˜CŸH™HÐ$€IÙ‰˜Y€Bð €KØ˜#Ÿ(™(Ñ"ØˆØˆ	à˜Ÿ™Ñ Ø�h‰h�n‰n˜]Ó+ˆØ�‰7‘S˜Ÿ™“]Ò"Ù�S—X‘X˜c A™gÑ&Ó'ˆBáàˆØˆá˜a  a¡Ó(ò 	 ˆHÙ% hÓ/ˆEÙÙØò  �Ù'¨¨U©Ó4�ÙØ ™<�DÙ  §¡Ð)9¸4Ô @Ø!& t f˜~˜Ø!×(Ñ(Ø%.Ø$(¨¡KØ!% g¡Ø(,Ò(B°°zÑ0BØ#)¨)Ñ#4Ø$,Ø'-¨mÑ'<ñ*ô ð # aÑ'�NØ%¨Ñ*¨aÒ/Ù ¨NÐ+;¸;ÐGÈtÕTØ�—
‘
˜3•ñ% ð		 ð2 )ˆÙ�(˜C¨'Ô2ð 	F°aØˆD�I‰I�m Q°UÀ1ÕE÷	Fá�˜Ð'Ð'7¸°zÐBÈ$ÖOá˜	¨RÖ0ðe ÷\	Fð 	Fús   ÆGÇG