Ë
    '˜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mZ ddlm	Z	 ddl
mZ dZdZdZ ej                  d	d
«      Z ej"                  «        ed¬«      z
  j%                  d«      ZddiZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u’   ç²¾æ²³åŽ¿â€”çŽ¯å¢ƒå½±å“�è¯„ä»·çˆ¬è™«
URL: https://www.xjjh.gov.cn/zwgk/zfxxgk/fdzdgknr/zdly_zdms/sthj/hjyxpj.htm
CMS: VSB9 (Visual SiteBuilder 9)
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinu   ç²¾æ²³åŽ¿-çŽ¯å¢ƒå½±å“�è¯„ä»·zhttps://www.xjjh.gov.cnz//zwgk/zfxxgk/fdzdgknr/zdly_zdms/sthj/hjyxpj.htmÚ	SEARCH_DBz/root/search.dbiG  ©Údaysú%Y-%m-%dz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36c                 óz  — | dk(  rt         t        z   }nSt        j                  dd«      d   j                  dd«      }t        j                  dd«      d   }t         › |› d|› d| › d�}t	        j
                  |t        d¬«      }d	|_        d
|j                  v st        |j                  «      dk  ry|j                  S )zNFetch list page by number. Page 1 uses the base URL, others use hjyxpj/{N}.htmé   ú/éÿÿÿÿz.htmÚ r   é   ©ÚheadersÚtimeoutúutf-8u   404é”™è¯¯æ��ç¤ºiÐ  N)
ÚBASE_URLÚ	LIST_PAGEÚrsplitÚreplaceÚrequestsÚgetÚHEADERSÚencodingÚtextÚlen)Úpage_numÚurlÚ	base_nameÚlist_dirÚrs        ú&/root/gov_crawler/crawl_xjjh_hjyxpj.pyÚ
fetch_pager%      s¬   € à�1‚}ÜœÑ"‰ô ×$Ñ$ S¨!Ó,¨RÑ0×8Ñ8¸ÀÓDˆ	Ü×#Ñ# C¨Ó+¨AÑ.ˆÜ�
˜8˜* A i [°°(°¸4Ð@ˆÜ�‰�S¤'°2Ô6€AØ€A„JØ˜AŸF™FÑ"¤c¨!¯&©&£k°DÒ&8ØØ�6‰6€Mó    c                 óH  — t        | d«      }g }|j                  dd¬«      }|s|S |j                  d«      D ]è  }|j                  dd¬«      }|j                  dd	¬«      }|sŒ,|sŒ/|j                  d
d«      }|sŒDd|v sŒI|j                  dd«      xs |j	                  d¬«      }|sŒr|j	                  d¬«      }	|	j                  dd«      j                  dd«      j                  dd«      j                  «       }	t        t        |«      }
|j                  ||	|
dœ«       Œê |S )z&Parse list page HTML to extract items.úhtml.parserÚtableÚwinstyle27637©Úclass_ÚtrÚaÚc27637ÚspanÚtimestyle27637Úhrefr   zinfo/ÚtitleT)Ústripu   å¹´ú-u   æœˆu   æ—¥)r3   Údater    )
r   ÚfindÚfind_allr   Úget_textr   r4   r   r   Úappend)ÚhtmlÚsoupÚitemsr)   r-   r.   Ú	date_spanr2   r3   Údate_strÚfull_urls              r$   Ú
parse_listrA   '   s%  € ä˜˜}Ó-€DØ€EØ�I‰I�g oˆIÓ6€EÙØˆØ�n‰n˜TÓ"ò ˆØ�G‰G�C ˆGÓ)ˆØ—G‘G˜FÐ+;�GÓ<ˆ	Ú’Ø—5‘5˜ Ó$ˆDÚ˜ 4šØŸ™˜g rÓ*ÒD¨a¯j©j¸t¨jÓ.D�ÙØà$×-Ñ-°DÐ-Ó9�Ø#×+Ñ+¨E°3Ó7×?Ñ?ÀÀsÓK×SÑSÐTYÐ[]Ó^×dÑdÓf�ä"¤8¨TÓ2�Ø—‘Ø"Ø$Ø#ñõ ðð& €Lr&   c                 ó¢  — 	 t        j                  | t        d¬«      }d|_        t	        |j
                  d«      }d}|j                  dd	d
i¬«      xs |j                  ddd
i¬«      }|r$|j                  d«      r|d   j                  «       }d}|j                  dd¬«      }|rt        |«      }||dœS # t        $ r}dddœcY d}~S d}~ww xY w)z&Fetch detail page and extract content.r   r   r   r(   r   )ÚcontentÚ
full_titleNÚmetaÚnameÚArticleTitle)ÚattrsÚNamerC   ÚdivÚv_news_contentr+   )
r   r   r   r   r   r   Ú	Exceptionr7   r4   Ústr)r    r#   r<   ÚerD   Ú
meta_titlerC   Úcontent_divs           r$   Úfetch_detailrQ   D   sØ   € ð1Ü�L‰L˜¤g°rÔ:ˆØˆŒ
Ü˜QŸV™V ]Ó3ˆð
 €JØ—‘˜6¨&°.Ð)A�ÓBÒwÀdÇiÁiÐPVÐ_eÐguÐ^vÀiÓFw€JÙ�j—n‘n YÔ/Ø 	Ñ*×0Ñ0Ó2ˆ
ð €GØ—)‘)˜EÐ*:�)Ó;€KÙÜ�kÓ"ˆà¨jÑ9Ð9øô ò 1Ø¨RÑ0Õ0ûð1ús   ‚9B6 Â6	CÂ?C	ÃCÃ	Cc                 óz  — t        j                  t        «      }|j                  «       }d}| D ]j  }t	        j
                  dd|d   «      j                  «       }|j                  d|d   |d   t        |dd	 |d   |d
   f«       |j                  dkD  sŒf|dz  }Œl |j                  «        |j                  «        |S )zInsert items into DB.r   z<[^>]+>r   rC   zŒINSERT OR IGNORE INTO gov_raw
            (title, page_url, site_name, summary, content, publish_date)
            VALUES (?, ?, ?, ?, ?, ?)r3   r    Niô  r6   r   )Úsqlite3ÚconnectÚDB_PATHÚcursorÚreÚsubr4   ÚexecuteÚ	SITE_NAMEÚrowcountÚcommitÚclose)r=   ÚconnÚcÚinsertedÚitemÚcontent_cleans         r$   Ú
save_to_dbrc   \   s¼   € ä�?‰?œ7Ó#€DØ�‰‹€AØ€HØò ˆÜŸ™˜z¨2¨t°I©Ó?×EÑEÓGˆØ	�	‰	ð )ð �'‰]˜D ™K¬Ø˜4˜CÐ  $ y¡/°4¸±<ðAô	Bð
 �:‰:˜‹>Ø˜‰M‰Hðð 	‡K�K„MØ‡J�J„LØ€Or&   c                  óô   — t        j                  t        «      } | j                  «       }dD ]  }	 |j	                  d|› d|› d�«       Œ | j                  «        | j                  «        y# t
        $ r Y ŒJw xY w)zRebuild FTS indexes.)Ú
gov_searchzINSERT INTO ú(z) VALUES('rebuild')N)rS   rT   rU   rV   rY   rL   r\   r]   )r^   r_   Útbls      r$   Úrebuild_ftsrh   p   ss   € ä�?‰?œ7Ó#€DØ�‰‹€AØò ˆð	Ø�I‰I˜ S E¨¨3¨%Ð/BÐCÕDðð
 	‡K�K„MØ‡J�J…Løô ò 	Ùð	ús   °A+Á+	A7Á6A7c            
      ó�  — t        t        j                  «      dk\  } | rt        t        j                  d   «      nd}t	        dt
        › d| › d|› d�«       g }t        dd«      D ]j  }t        |«      }|€t	        d	|› d
�«        nLt        |«      }|st	        d	|› d�«        n.t	        d	|› dt        |«      › d�«       |j                  |«       Œl t	        dt        |«      › d�«       | rIt        j                  «       t        |¬«      z
  j                  d«      }|D �cg c]  }|d   |k\  sŒ|‘Œ }}nt        }|D �cg c]  }|d   |k\  sŒ|‘Œ }}t	        dt        |«      › d|› d�«       |st	        d«       y t        j                   t"        «      }	|	j%                  «       }
t'        «       }|D ]=  }|
j)                  d|d   f«       |
j+                  «       sŒ*|j-                  |d   «       Œ? |	j/                  «        |D �cg c]  }|d   |vsŒ|‘Œ }}t	        dt        |«      › d�«       g }t1        |«      D ]—  \  }}t3        |d   «      }|d   r;t        |d   «      dkD  r*|j5                  |d   xs |d   |d   |d   |d   dœ«       ŒT|d   r*|j5                  |d   xs |d   |d   |d   |d   dœ«       Œƒt	        d |d   d d! › d"�«       Œ™ t7        |«      }t	        d#|› d$t        |«      › d%t        |«      › d�«       |d&kD  rt9        «        t	        d'«       t	        dt
        › d(|› d)�«       y c c}w c c}w c c}w )*Né   r   i'  z=== u    === å¢žé‡�æ¨¡å¼�: z	 (cutoff=u   å¤©)é   u     ç¬¬u3   é¡µ: æ— æ›´å¤šå†…å®¹ï¼ˆ404/ç©ºé¡µï¼‰ï¼Œå�œæ­¢ç¿»é¡µu#   é¡µ: æ— æœ‰æ•ˆæ�¡ç›®ï¼Œå�œæ­¢ç¿»é¡µu   é¡µ: u    æ�¡u     å…±èŽ·å�– u    æ�¡åˆ—è¡¨æ•°æ�®r   r
   r6   u     æ—¥æœŸè¿‡æ»¤å�Ž: u	    æ�¡ (>= ú)u     æ— æ–°æ•°æ�®z-SELECT page_url FROM gov_raw WHERE page_url=?r    u     åŽ»é‡�å�Ž: u    æ�¡éœ€æŠ“è¯¦æƒ…é¡µrC   é2   rD   r3   )r3   r    r6   rC   u     è·³è¿‡æ— å†…å®¹: é(   z...u
     å…¥åº“: u    æ�¡ (æˆ�åŠŸ/æ€»æ•°: r   r   u     FTS é‡�å»ºå®Œæˆ�u    å®Œæˆ�ï¼Œæ–°å¢ž u    æ�¡ ===)r   ÚsysÚargvÚintÚprintrZ   Úranger%   rA   Úextendr   Únowr   ÚstrftimeÚCUTOFF_DATErS   rT   rU   rV   ÚsetrY   ÚfetchoneÚaddr]   Ú	enumeraterQ   r:   rc   rh   )Úis_incrementalÚcutoff_daysÚ	all_itemsÚpager;   r=   ÚcutoffÚitÚfilteredr^   r_   Úexistingra   Úto_fetchÚsuccessÚiÚdetailr`   s                     r$   Úmainrˆ   }   sr  € ÜœŸ™“] aÑ'€NÙ&4”#”c—h‘h˜q‘kÔ"¸$€KÜ	ˆD”�Ð.¨~Ð.>¸iÈÀ}ÐTXÐ
YÔZð €IÜ�a˜“ò 
 ˆÜ˜$ÓˆØˆ<Ü�E˜$˜ÐRÐSÔTÙÜ˜4Ó ˆÙÜ�E˜$˜ÐBÐCÔDÙÜ��d�V˜5¤ U£ ¨DÐ1Ô2Ø×Ñ˜Õð
 ô 
ˆLœ˜Y›Ð(Ð(8Ð
9Ô:ñ Ü—,‘,“.¤9°+Ô#>Ñ>×HÑHÈÓTˆØ!*ÖC˜2¨b°©j¸FÓ.B’BÐCˆÑCäˆØ!*ÖC˜2¨b°©j¸FÓ.B’BÐCˆÐCÜ	Ð¤ H£˜¨i¸°x¸qÐ
AÔBáÜÐÔØô �?‰?œ7Ó#€DØ�‰‹€AÜ‹u€HØò &ˆØ	�	‰	ÐAÀDÈÁKÀ>ÔRØ�:‰:�<Ø�L‰L˜˜e™Õ%ð&ð 	‡J�J„Là%ÖC�r¨¨E©¸(Ò)B’ÐC€HÐCÜ	ˆMœ#˜h›-˜Ð(;Ð
<Ô=ð €GÜ˜XÓ&ò A‰ˆˆ4Ü˜d 5™kÓ*ˆØ�)Ò¤ V¨IÑ%6Ó!7¸"Ò!<Ø�N‰NØ Ñ-Ò>°°g±Ø˜E‘{Ø˜V™Ø! )Ñ,ñ	õ ð �IÒà�N‰NØ Ñ-Ò>°°g±Ø˜E‘{Ø˜V™Ø! )Ñ,ñ	õ ô Ð'¨¨W©°c°rÐ(:Ð';¸3Ð?Õ@ð%Aô* ˜'Ó"€HÜ	ˆJ�x�jÐ 5´c¸'³l°^À1ÄSÈÃ]ÀOÐSTÐ
UÔVà�!‚|ÜŒÜÐ"Ô#ä	ˆD”�Ð,¨X¨J°hÐ
?Õ@ùòk Dùò Dùò" Ds$   ÄL9Ä-L9Ä>L>ÅL>ÈMÈMÚ__main__)Ú__doc__r   rW   rS   ro   Úosr   r   Úbs4r   Úurllib.parser   rZ   r   r   ÚgetenvrU   ru   rv   rw   r   r%   rA   rQ   rc   rh   rˆ   Ú__name__© r&   r$   ú<module>r‘      s©   ðñ÷
 &× %Ó %ß (Ý Ý  à*€	Ø$€Ø=€	Ø
ˆ"�)‰)�KÐ!2Ó
3€Øˆx�|‰|‹~¡	¨uÔ 5Ñ5×?Ñ?À
ÓK€ð ð  Dð€ò
ò ò::ò0ò(
òMAð` ˆzÒÙ…Fð r&   