Ë
    ¸¬uj(!  ã                   óà   — 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ZdZ	e	dz   Z
dZdZdZ ej                  «       Zd	e_        ej"                  e_        d
„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u™  
æ²¾ç›ŠåŒºæ”¿åºœ - è¡Œæ”¿æ‰§æ³•ä¿¡æ�¯å…¬ç¤º (zhanyi.gov.cn)
CMS: è‡ªå®šä¹‰ PHP, GET åˆ†é¡µ
List: /pub/special/377.html?cate=377&page=N
  Container: ol.news_list > li > a(href, title) + date text
Detail: /news/xzzfxxgs/{id}.html
  Content: div.web_con.wow.fadeInUp (p > span inline formatting)
  Title: <title> (strip site suffix)
  Date: YYYY-MM-DD from page
  No WAF, direct curl OK, ~13 items/page, 2 pages
é    Nu"   æ²¾ç›ŠåŒº-è¡Œæ”¿æ‰§æ³•ä¿¡æ�¯å…¬ç¤ºzhttps://www.zhanyi.gov.cnz&/pub/special/377.html?cate=377&page={}z/root/search.dbz
2023-01-01é   Fc                 ó&  — t         j                  j                  | ddi¬«      }	 t         j                  j                  |dt        ¬«      }|j                  «       j                  dd¬«      S # t        $ r}t        d	| › d
|› �«       Y d }~y d }~ww xY w)Nz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36)Úheadersé   )ÚtimeoutÚcontextzutf-8Úreplace)Úerrorsz  [FETCH ERROR] ú: )	ÚurllibÚrequestÚRequestÚurlopenÚssl_ctxÚreadÚdecodeÚ	ExceptionÚprint)ÚurlÚreqÚrespÚes       ú&/root/gov_crawler/crawl_zhanyi_xzzf.pyÚfetchr   !   sŽ   € Ü
�.‰.×
 Ñ
  Øð  Hð/Ð
 ó €CðÜ�~‰~×%Ñ% c°2¼wÐ%ÓGˆØ�y‰y‹{×!Ñ! '°)Ð!Ó<Ð<øÜò ÜÐ    R¨ sÐ+Ô,Üûðús   ¥AA, Á,	BÁ5BÂBc                 óz  — g }d}t        j                  || t         j                  «      D ]Ž  }|j                  d«      j	                  «       }|j                  d«      j	                  «       }|j                  d«      j	                  «       }|j                  d«      s	t        |z   }|j                  |||dœ«       Œ� |S )zParse list pagez<<li>.*?<a href="([^"]*)"[^>]*>([^<]+)</a>(\d{4}-\d{2}-\d{2})é   r   é   Úhttp)r   ÚtitleÚdate)ÚreÚfinditerÚDOTALLÚgroupÚstripÚ
startswithÚBASE_URLÚappend)ÚhtmlÚitemsÚpatternÚmatchÚhrefr   r    s          r   Ú
parse_listr.   -   sŸ   € à€EØM€GÜ—‘˜W d¬B¯I©IÓ6ò BˆØ�{‰{˜1‹~×#Ñ#Ó%ˆØ—‘˜A“×$Ñ$Ó&ˆØ�{‰{˜1‹~×#Ñ#Ó%ˆØ�‰˜vÔ&Ü˜d‘?ˆDØ�‰˜T¨E¸4Ñ@ÕAðBð €Ló    c           
      óÚ  — d}t        j                  d| «      }|r:|j                  d«      }t        j                  dd|«      j	                  «       }|s|}d}t        j                  d| «      }|r|j                  d«      }d}| j                  d«      }|dk  r| j                  d«      }|dk  r| j                  d	«      }|dkD  �r| j                  d
d|«      }|dk  r|}g d¢}	t        | «      }
|	D ]%  }| j                  ||«      }d|cxk  r|
k  sŒ!n Œ$|}
Œ' | ||
 }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|«      }t        j                  dd|«      }|j                  dd«      }|j                  dd«      j                  dd«      j                  dd«      }g }t        j                  d|t         j                  «      D �].  }|j                  d«      }t        j                  d|t         j                  «      }g }|D ]Ž  }t        j                  d|t         j                  «      }|D �cg c]'  }t        j                  dd|«      j	                  «       ‘Œ) }}|sŒ]t        |«      sŒi|j                  ddj                  |«      z   d z   «       Œ� |sŒÒt        |«      d!k\  r/|d   j                  d"«      dz
  }|j!                  dd"d#|z  z   «       |j                  dj                  |«      «       �Œ1 t        j                  dd|«      }t        j                  d$d|«      }t        j                  d%d|«      }t        j                  d&d|«      }|j	                  «       }|r|gng }|r |j                  dj                  |«      «       dj                  |«      }g }t        j                  d'| t         j"                  «      }|D ]Y  \  }}|j	                  «       }|j%                  d(«      s	t&        |z   }|j                  ||xs |j)                  d)«      d*   d+œ«       Œ[ ||||d,œS c c}w )-z-Extract title, date, content from detail pageÚ z<title>(.*?)</title>r   u   [-â€“â€”].*$z!(\d{4}-\d{2}-\d{2})\s*\d{2}:\d{2}zclass="web_con wow fadeInUp"r   zclass="web_con"zclass="wow fadeInUp"z<div)z<div class="arti_attr"z<div class="nearz<div class="sharez<div class="footerz<div class="configz<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z	<br\s*/?>ú
z</p>z

úz&nbsp;ú z&ldquo;u   â€œz&rdquo;u   â€�z<table[^>]*>.*?</table>z<tr[^>]*>(.*?)</tr>z<t[dh][^>]*>(.*?)</t[dh]>z<[^>]+>z| z | z |r   ú|z---|z[ \t]+z *\n *z\n{3,}z+<a[^>]*href="([^"]+\.pdf)"[^>]*>([^<]*)</a>r   ú/éÿÿÿÿ)r-   Útext)r   r    ÚcontentÚattachments)r!   Úsearchr$   Úsubr%   ÚfindÚrfindÚlenr#   r	   r"   ÚfindallÚanyr(   ÚjoinÚcountÚinsertÚ
IGNORECASEr&   r'   Úsplit)r)   r   Útitle_matchÚrawr    Ú
date_matchr:   ÚidxÚstartÚend_markersÚendÚmarkerÚposÚcontent_htmlr9   ÚtablesÚtable_matchÚ
table_htmlÚrowsÚtable_linesÚrowÚcellsÚcÚ
cell_textsÚhdrÚcleanÚpartsr;   Úpdfsr-   Úts                                  r   Úparse_detailr`   ;   s  € ð €EÜ—)‘)Ð3°TÓ:€KÙØ×Ñ Ó"ˆä—‘�¨¨CÓ0×6Ñ6Ó8ˆÙØˆEð €DÜ—‘Ð?ÀÓF€JÙØ×Ñ Ó"ˆð €GØ
�)‰)Ð2Ó
3€CØ
ˆQ‚wØ�i‰iÐ)Ó*ˆØ
ˆQ‚wØ�i‰iÐ.Ó/ˆà
ˆQƒwØ—
‘
˜6 1 cÓ*ˆØ�1Š9ØˆEò FˆÜ�$‹iˆØ!ò 	ˆFØ—)‘)˜F CÓ(ˆCØ�3Œ}˜Ž}Ø‘ð	ð ˜E #�ˆô �v‰vÐ2°B¸ÌBÏIÉIÔVˆÜ�v‰vÐ0°"°dÄ"Ç)Á)ÔLˆô �v‰v�l D¨$Ó/ˆÜ�v‰v�g˜v tÓ,ˆØ�|‰|˜D "Ó%ˆð �|‰|˜H cÓ*×2Ñ2°9¸hÓG×OÑOÐPYÐ[cÓdˆð ˆÜŸ;™;Ð'AÀ4ÌÏÉÓSó 	6ˆKØ$×*Ñ*¨1Ó-ˆJÜ—:‘:Ð4°jÄ"Ç)Á)ÓLˆDØˆKØò M�ÜŸ
™
Ð#?ÀÄbÇiÁiÓP�ØINÖOÀAœbŸf™f Z°°QÓ7×=Ñ=Õ?ÐO�
ÐOÚ¤# j¥/Ø×&Ñ& t¨e¯j©j¸Ó.DÑ'DÀtÑ'KÕLð	Mò
 Ü�{Ó# qÒ(Ø% a™.×.Ñ.¨sÓ3°aÑ7�CØ×&Ñ& q¨#°¸±Ñ*<Ô=Ø—‘˜dŸi™i¨Ó4Ö5ð	6ô  —‘�z 2 tÓ,ˆÜ—‘�y # uÓ-ˆÜ—‘�y $¨Ó.ˆÜ—‘�y &¨%Ó0ˆØ—‘“ˆá �‘ bˆÙØ�L‰L˜Ÿ™ VÓ,Ô-Ø—+‘+˜eÓ$ˆð €KÜ�:‰:ÐDÀdÌBÏMÉMÓZ€DØò M‰
ˆˆdØ�J‰J‹LˆØ�‰˜vÔ&Ü˜d‘?ˆDØ×Ñ D°!Ò2J°t·z±zÀ#³ÀrÑ7JÑKÕLð	Mð  D°WÈ[ÑYÐYùò= Ps   É.,Q(c                 ó�  — t        j                  t        d¬«      }|j                  «       }d}d}| D ]¿  }|j	                  dd«      }|j	                  dd«      }|j	                  dd«      }|j	                  dd«      }	d}
|j	                  d	g «      D ]  }|
r|
d
z  }
|
d|d   › d|d   › d�z  }
Œ |	s|s|dz  }Œ‡	 |j                  d||t        ||	|
||f«       |j                  dkD  r|dz  }n|dz  }ŒÁ |j                  «        |j                  «        ||fS # t        $ r$}t        d|d d › d|› �«       |dz  }Y d }~�Œd }~ww xY w)Né   ©r   r   r   r1   r   r    r:   r;   r3   ú[r9   z](r-   ú)r   a  
                INSERT OR IGNORE INTO gov_raw
                (title, page_url, site_name, publish_date, content, summary, attachments, source_url, date_rank)
                VALUES (?, ?, ?, ?, ?, '', ?, ?, CAST(strftime('%s', ?) AS INTEGER))
            z  [DB ERROR] r   )Úsqlite3ÚconnectÚDB_PATHÚcursorÚgetÚexecuteÚ	SITE_NAMEÚrowcountr   r   ÚcommitÚclose)r*   ÚconnrY   ÚinsertedÚskippedÚitemr   r   r    r:   Ú
attach_strÚattr   s                r   Úinsert_to_dbrv   –   sx  € Ü�?‰?œ7¨BÔ/€DØ�‰‹€AØ€HØ€Gàò ˆØ—‘˜ "Ó%ˆØ�h‰h�u˜bÓ!ˆØ�x‰x˜ Ó#ˆØ—(‘(˜9 bÓ)ˆàˆ
Ø—8‘8˜M¨2Ó.ò 	<ˆCÙØ˜dÑ"�
Ø˜A˜c &™k˜]¨"¨S°©[¨M¸Ð;Ñ;‰Jð	<ñ
 ™uØ�q‰LˆGØð	Ø�I‰Ið ð ˜œi¨¨w¸
ÀCÈÐNô	Pð
 �z‰z˜AŠ~Ø˜A‘‘à˜1‘�øð3ð< 	‡K�K„MØ‡J�J„LØ�WÐÐøô ò 	Ü�M %¨¨ * ¨R°¨sÐ3Ô4Ø�q‰LŽGûð	ús   Â:8DÄ	EÄ!E Å Ec            
      óª  — t         } t        j                  dd  D ]  }|j                  «       sŒt	        |«      } Œ  t        dt        › d| › �«       g }d}d}t        d| dz   «      D �]c  }t        j                  |«      }t        d|› d|› �«       t        |«      }|st        d|› �«       ŒFt        |«      }t        dt        |«      › d	�«       |st        d
«        nï|D ]·  }	|	d   t        k  rt        d|	d   › dt        › �«        n‘t        d|	d   › d|	d   d d › d�«       t        |	d   «      }
|
st        d«       |dz  }Œet        |
«      }|d   r|d   |	d<   |d   r|d   |	d<   |d   |	d<   |j                  dg «      |	d<   |j!                  |	«       Œ¹ |s�Œ8t#        |«      \  }}||z  }||z  }t        d|› d|› d�«       g }�Œf |rt#        |«      \  }}||z  }||z  }t        d|› d|› �«       |dkD  rXt%        j&                  t(        d¬«      }|j+                  d«       |j-                  «        |j/                  «        t        d«       y y ) Nr   z[INFO] u    - çˆ¬è™«, pages=r   z	
  [Page z] z  [SKIP] Cannot fetch page z  Found z itemsz  [STOP] No itemsr    z  [STOP] Date z < z    r5   r   é2   z...r   z    [SKIP] Cannot fetch detailr:   r;   z  [DB] +z new, z	 existingu   
[DONE] æ–°å¢ž: u
   , è·³è¿‡: rb   rc   z4INSERT INTO gov_search(gov_search) VALUES('rebuild')zFTS rebuilt)ÚPAGES_DEFAULTÚsysÚargvÚisdigitÚintr   rl   ÚrangeÚLIST_TPLÚformatr   r.   r@   ÚCUTOFF_DATEr`   rj   r(   rv   rf   rg   rh   rk   rn   ro   )Ú	max_pagesÚargÚ	all_itemsÚ	total_newÚ	total_oldÚpage_nor   r)   r*   rs   Údetail_htmlÚdetailÚnewÚoldrp   s                  r   ÚmainrŒ   ¿   s�  € Ü€IÜ�x‰x˜˜ˆ|ò !ˆØ�;‰;�=Ü˜C›‰Ið!ô 
ˆG”I�;Ð/°	¨{Ð
;Ô<à€IØ€IØ€Iä˜˜I¨™MÓ*ó )ˆÜ�o‰o˜gÓ&ˆÜ�
˜7˜) 2 c UÐ+Ô,Ü�S‹zˆÙÜÐ/°¨yÐ9Ô:Øä˜4Ó ˆÜ�œ˜U›˜ FÐ+Ô,áÜÐ%Ô'Ùàò 	#ˆDØ�F‰|œkÒ)Ü˜ t¨F¡| n°C¼°}ÐEÔFÙä�D˜˜f™˜ a¨¨W©°c°rÐ(:Ð';¸3Ð?Ô@Ü  U¡Ó,ˆKÙÜÐ6Ô8Ø˜Q‘�	Øä! +Ó.ˆFØ�gŠØ & w¡��W‘Ø�fŠ~Ø% f™~��V‘Ø$ YÑ/ˆD�‰OØ"(§*¡*¨]¸BÓ"?ˆD�ÑØ×Ñ˜TÕ"ð'	#ó* Ü# IÓ.‰HˆC�Ø˜ÑˆIØ˜ÑˆIÜ�H˜S˜E ¨ u¨IÐ6Ô7ØŠIðS)ñV Ü 	Ó*‰ˆˆSØ�SÑˆ	Ø�SÑˆ	ä	Ð˜i˜[¨
°9°+Ð
>Ô?à�1‚}Ü�‰œw°Ô3ˆØ�‰ÐKÔLØ�‰ŒØ�
‰
ŒÜˆmÕð r/   Ú__main__)Ú__doc__rz   r!   Úosrf   Úurllib.requestr   Ússlrl   r'   r   rh   r�   ry   Úcreate_default_contextr   Úcheck_hostnameÚ	CERT_NONEÚverify_moder   r.   r`   rv   rŒ   Ú__name__© r/   r   ú<module>r˜      s›   ðñ
ó Û 	Û 	Û Û Û 
ð 1€	Ø&€ØÐ>Ñ>€Ø
€Ø€Ø€à
$ˆ#×
$Ñ
$Ó
&€Ø€Ô Ø—m‘m€Ô ò	òòXZòv&òRCðL ˆzÒÙ…Fð r/   