Ë
    ¡Š£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m	Z	 dZ
dZdZdZd	d
iZh d£Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uë   
çº³æºªåŒº â€” çŽ¯å¢ƒä¿�æŠ¤
https://www.naxi.gov.cn/zw/fdzdgknr/zdmsxx/hjbh
CMS: è‡ªå®šä¹‰
åˆ†é¡µ: hjbh (page1), hjbh_2 ... hjbh_48
åˆ—è¡¨: ul.newsList > li > a + span
è¯¦æƒ…: /zw/fdzdgknr/zdmsxx/hjbh/content_XXXXXX
æ­£æ–‡: div.conTxt
é    N)Údatetime)ÚBeautifulSoupÚNavigableStringz/root/search.dbu   çº³æºªåŒº-çŽ¯å¢ƒä¿�æŠ¤z/https://www.naxi.gov.cn/zw/fdzdgknr/zdmsxx/hjbhzhttps://www.naxi.gov.cnz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36>)   Ú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   )r   c                 ó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Úchr   ÚoutÚwalks     €€€ú/root/gov_crawler/crawl_naxi.pyr>   zbody_text.<locals>.walk.   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]*r4   ú\n{3,}ú

)ÚreÚbs4r   ÚjoinÚsubÚstrip)ÚelÚ_reÚtr   r=   r>   s      @@@r?   Ú	body_textrK   &   sb   ú€ à	€zØÛÝ#Ø
€Cöñ 	ˆ„HØ
�‰�‹€AØ�‰Ð-¨t°QÓ7€AØ�‰�	˜6 1Ó%€AØ�7‰7‹9Ðr@   c                 ó�   — | dk(  rt         }nt         › d| › �}t        j                  |t        dd¬«      }d|_        |j
                  S )Né   Ú_é   F©ÚheadersÚtimeoutÚverifyúutf-8)ÚLIST_URLÚrequestsÚgetÚHEADERSÚencodingÚtext)ÚpageÚurlÚrs      r?   Ú
fetch_listr^   A   sB   € Øˆq‚yÜ‰ä�
˜!˜D˜6Ð"ˆÜ�‰�S¤'°2¸eÔD€AØ€A„JØ�6‰6€Mr@   c                 óê  — t        | d«      }g }|j                  dd¬«      }|s|S |j                  dd¬«      D ]·  }|j                  dd	¬
«      }|sŒ|d   }|j                  d	¬«      }|rt	        |«      dk  rŒA|j                  d«      r|}n'|j                  d«      r
t        |z   }nt        dz   |z   }d}	|j                  d«      }
|
r|
j                  d	¬«      }	|j                  |||	dœ«       Œ¹ |S )Núhtml.parserr   ÚnewsList©Úclass_r   F)Ú	recursiveÚaT)Úhrefrf   ©rG   é   Úhttpú/r0   Úspan)Útitler\   Údate)	r   ÚfindÚfind_allÚget_textÚlenÚ
startswithÚBASE_DOMAINrU   r7   )ÚhtmlÚsoupÚitemsr   r   re   rf   rl   Úfull_urlÚdate_strrk   s              r?   Úextract_itemsry   J   s   € Ü˜˜}Ó-€DØ€EØ	�‰�4 
ˆÓ	+€BÙØˆØ�k‰k˜$¨%ˆkÓ0ò JˆØ�G‰G�C˜dˆGÓ#ˆÙØØ�‰yˆØ—
‘
 �
Ó&ˆÙœ˜E›
 QšØØ�?‰?˜6Ô"Ø‰HØ�_‰_˜SÔ!Ü" TÑ)‰Hä #‘~¨Ñ,ˆHØˆØ�w‰w�v‹ˆÙØ—}‘}¨4�}Ó0ˆHØ�‰˜u¨X¸xÑHÕIð%Jð& €Lr@   c                 ó*  — g }| j                  d«      D ]\  }t        |«      }t        j                  dd|«      }t        j                  dd|«      }|j	                  |«       |j                  «        Œ^ | j                  d«      D ]  }|j                  «        Œ t        «       }| j                  ddg«      D ]>  }|j                  d	¬
«      }|sŒ||vsŒ|j	                  |«       |j                  |«       Œ@ |rdj                  |«      S t        | «      S )zOExtract text from element, preserving <table> HTML and proper paragraph breaks.r   z>\s+<z><z\s{2,}ú rk   r   r   Trg   rB   )ro   r8   rC   rF   r7   Ú	decomposeÚunwrapÚsetrp   ÚaddrE   rK   )ÚelementÚpartsr   Ú
table_htmlrk   ÚseenrH   rZ   s           r?   Úextract_content_with_tablesr„   e   sþ   € à€Eà×!Ñ! 'Ó*ò ˆÜ˜“Zˆ
ä—V‘V˜H d¨JÓ7ˆ
Ü—V‘V˜I s¨JÓ7ˆ
Ø�‰�ZÔ à�‰Õðð × Ñ  Ó(ò ˆØ�‰�ðô ‹5€DØ×Ñ  T˜{Ó+ò ˆØ�{‰{ ˆ{Ó&ˆÚ�D Ò$Ø�L‰L˜ÔØ�H‰H�T�Nð	ñ "'ˆ6�;‰;�uÓÐ>¬I°gÓ,>Ð>r@   c                 óÌ  — 	 t        j                  d«       t        j                  | t        dd¬«      }d|_        t        |j                  d«      } |g d¢«      D ]  }|j                  «        Œ d}|j                  d	d
¬«      }|r7t        j                  d|j                  «       «      }|r|j                  d«      }|j                  d	d¬«      }|s|j                  d	d„ ¬«      }|rt        |«      }nt        |«      }t        j                   dd|«      }t        j                   dd|«      }|j#                  «       |fS # t$        $ r}	t'        d|	› �d¬«       Y d }	~	yd }	~	ww xY w)Ng333333ó?rO   FrP   rT   r`   )ÚscriptÚstyler   r$   r%   r   r0   r   Úpropertyrb   z(\d{4}-\d{1,2}-\d{1,2})rM   ÚconTxtc                 ó   — | xr d| xs dv S )NÚ	printArear0   © )Úcs    r?   ú<lambda>zfetch_detail.<locals>.<lambda>’   s   € ¸AÒ<\À;ÐSTÒSZÐXZÐC[€ r@   rA   rB   z {2,}r{   z  [ERROR] detail: T©Úflush)r0   r0   )ÚtimeÚsleeprV   rW   rX   rY   r   rZ   r|   rn   rC   Úsearchrp   Úgroupr„   rK   rF   rG   Ú	ExceptionÚprint)
r\   r]   ru   ÚtagÚdetail_dateÚpropÚmÚcontent_divÚcontentÚes
             r?   Úfetch_detailrž   €   s6  € ðÜ�
‰
�3ŒÜ�L‰L˜¤g°rÀ%ÔHˆØˆŒ
Ü˜QŸV™V ]Ó3ˆÙÒOÓPò 	ˆCØ�M‰M�Oð	ð ˆØ�y‰y˜ zˆyÓ2ˆÙÜ—	‘	Ð4°d·m±m³oÓFˆAÙØŸg™g a›j�à—i‘i ¨h�iÓ7ˆÙØŸ)™) EÑ2\˜)Ó]ˆKÙÜ1°+Ó>‰Gä “oˆGä—&‘&˜ F¨GÓ4ˆÜ—&‘&˜ 3¨Ó0ˆØ�}‰}‹ Ð+Ð+øÜò ÜÐ" 1 #Ð&¨dÕ3Üûðús   ‚D=E  Å 	E#Å	EÅE#c                  óH  — t        j                  t        «      } | j                  «       }t	        «       }|j                  dt        f«      D ]  }|j                  |d   «       Œ d}|j                  dt        f«      j                  «       }|r
|d   r|d   }| j                  «        t        d|› �d¬«       t        dt        |«      › �d¬«       g }d}t        d	d
«      D ]c  }	 t        |«      }t#        |«      }
t        d|› dt        |
«      › d�d¬«       t        |
«      dk(  r|d	z  }|dk\  r nd}|j%                  |
«       Œe t        dt        |«      › �d¬«       t        j                  t        «      } | j                  «       }dx}x}}|D �].  }|d   }|d   }|d   }||v r|d	z  }Œt'        |«      \  }}|s|}|rt        |«      dk  r(t        d|d d › dt        |«      › d�d¬«       |s|d	z  }Œg|s#t)        j*                  «       j-                  d«      }t/        j0                  dd|«      d d }|j3                  d«      dk(  rt5        |j7                  dd«      «      nd}|j                  d t        t8        |||||d d! |f«       |d	z  }|dz  dk(  s�Œ| j;                  «        t        d"|› d#|› d$�d¬«       �Œ1 | j;                  «        | j                  «        t        d%d¬«       t        j                  t        «      }|j                  «       }|j                  d&t        f«       |j;                  «        |j                  «        t        d'd(› �d¬«       t        d)t        › �d¬«       t        dt        |«      › �d¬«       t        d*|› �d¬«       t        d+|› �d¬«       t        d,|› �d¬«       t        d(› d¬«       y # t        $ rM}	t        d|› d|	› �d¬«       t        j                   d«       	 t        |«      }n#  Y Y d }	~	 �ŒÍxY wY d }	~	�Œ-d }	~	ww xY w)-Nz.SELECT page_url FROM gov_raw WHERE site_name=?r   z
1900-01-01z7SELECT MAX(publish_date) FROM gov_raw WHERE site_name=?zLatest DB date: Tr�   zExisting URLs: rM   é1   z  [ERROR] Page z: rh   z  Page z itemsé   zTotal list items: r\   rl   rm   é2   z
  [SHORT] rO   z... (ú)z%Y-%m-%dz[^\d-]r0   é
   ú-é   z³
            INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, content, summary, date_rank)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?)
        iô  z  Progress: z new / z skipzRebuilding FTS...z(DELETE FROM gov_search WHERE site_name=?r4   z2==================================================zSite: zNew: zSkipped (existing): zErrors: )Úsqlite3ÚconnectÚDB_PATHÚcursorr~   ÚexecuteÚ	SITE_NAMEr   ÚfetchoneÚcloser–   rq   Úranger^   r•   r‘   r’   ry   Úextendrž   r   ÚnowÚstrftimerC   rF   ÚcountÚintÚreplacerU   Úcommit)Úconnr�   ÚexistingÚrowÚlatest_db_dateÚ	all_itemsÚempty_pagesr[   rt   r�   rv   Ú	new_countÚ
skip_countÚerror_countÚitemr\   rl   rx   rœ   r˜   ÚdrÚconn2Úc2s                          r?   r   r   Ÿ   s  € Ü�?‰?œ7Ó#€DØ�‰‹€AÜ‹u€HØ�y‰yÐIÌIÈ<ÓXò ˆØ�‰�S˜‘VÕðà!€NØ
�)‰)ÐMÔPYÈ|Ó
\×
eÑ
eÓ
g€CÙ
ˆs�1ŠvØ˜Q™ˆØ‡J�J„LÜ	Ð˜^Ð,Ð
-°TÕ:Ü	ˆOœC ›M˜?Ð
+°4Õ8à€IØ€KÜ�a˜“ò  ˆð	Ü˜dÓ#ˆDô ˜dÓ#ˆÜ�˜�v˜R¤ E£
˜|¨6Ð2¸$Õ?Üˆu‹:˜Š?Ø˜1ÑˆKØ˜aÒÙàˆKØ×Ñ˜Õð% ô( 
Ðœs 9›~Ð.Ð
/°tÕ<ä�?‰?œ7Ó#€DØ�‰‹€AØ+,Ð,€IÐ,�
˜[àó RˆØ�5‰kˆØ�W‘ˆØ˜‘<ˆØ�(‰?Ø˜!‰OˆJØä+¨CÓ0Ñˆ�ÙØ"ˆKÙœ#˜g›,¨Ò+Ü�J˜u S b˜z˜l¨%´°G³¨~¸QÐ?ÀtÕLÙØ˜qÑ �ØáÜ"Ÿ,™,›.×1Ñ1°*Ó=ˆKÜ—f‘f˜Y¨¨KÓ8¸¸"Ð=ˆØ2=×2CÑ2CÀCÓ2HÈAÒ2MŒS�×$Ñ$ S¨"Ó-Ô.ÐSTˆà	�	‰	ð ô œ 3¨¨{¸GÀWÈTÈcÀ]ÐTVÐWô	Yð 	�Q‰ˆ	Ø�r‰>˜QÔØ�K‰KŒMÜ�L  ¨7°:°,¸eÐDÈD×Qð;Rð> 	‡K�K„MØ‡J�J„Lô 
Ð
 TÕ*Ü�O‰OœGÓ$€EØ	�‰‹€BØ‡J�JÐ9¼I¸<ÔHØ	‡L�L„NØ	‡K�K„Mä	ˆBˆvˆhˆ-˜tÕ$Ü	ˆF”9�+Ð
 dÕ+Ü	Ðœs 9›~Ð.Ð
/°tÕ<Ü	ˆE�)�Ð
 TÕ*Ü	Ð   Ð
-°TÕ:Ü	ˆH�[�MÐ
"¨$Õ/Ü	ˆVˆH˜TÖ"øôO ò 	Ü�O D 6¨¨A¨3Ð/°tÕ<Ü�J‰J�qŒMðÜ! $Ó'‘øðßúõ ûð		ús6   Ã$OÏ	P!Ï(PÏ=P	ÐPÐ	PÐPÐPÐP!Ú__main__)rM   )Ú__doc__rV   r§   rC   r‘   Úosr   rD   r   r   r©   r¬   rU   rs   rX   r:   rK   r^   ry   r„   rž   r   Ú__name__rŒ   r@   r?   ú<module>rÈ      s€   ðñó Û Û 	Û Û 	Ý ß .à
€Ø$€	Ø<€Ø'€àð  Dð€ò*€òó6òò6?ò6ò>Z#ðx ˆzÒÙ…Fð r@   