Ë
    ¸¬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dlZdZ	dZ
e
› d�ZdZdZdZ ej                  «       Zd	e_        ej$                  e_        dd
„Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uS  
æ‹›è¿œå¸‚æ”¿åºœ - å»ºè®¾é¡¹ç›®çŽ¯è¯„å®¡æ‰¹ (zhaoyuan.gov.cn)
CMS: TRS/JCMS, AJAX åˆ†é¡µ (client-side only, 15 items)
API: /api-gateway/jpaas-publish-server/front/page/build/unit
  webId=155, pageId=48655, tagId=å�³ä¾§æ–‡ç« åˆ—è¡¨
List: ul.bt-main-r-ul > li.bt-main-r-ul-li > a[title] + span(date)
Detail: /col/col48655/art/2026/art_{hash}.html
  Content: div.text#zoom (> p + table)
  Title: div.title > h1
  Date: span.time "å�‘å¸ƒæ—¥æœŸï¼šYYYY-MM-DD"
  Attachments: <a href="/api-gateway/...download-m?..."> inside content
  15 items/page, only page 1 available (AJAX client-side pagination)
é    Nu"   æ‹›è¿œå¸‚-å»ºè®¾é¡¹ç›®çŽ¯è¯„å®¡æ‰¹zhttps://www.zhaoyuan.gov.cnzÙ/api-gateway/jpaas-publish-server/front/page/build/unit?parseType=bulidstatic&webId=155&tplSetId=sW4TqQJo1K65B01yzYBRg&pageType=column&tagId=%E5%8F%B3%E4%BE%A7%E6%96%87%E7%AB%A0%E5%88%97%E8%A1%A8&pageId=48655&pageNo=1z/root/search.dbz
2023-01-01é   Fc                 óN  — t         j                  j                  | ddi¬«      }|r|j                  d|«       	 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ÚRefereré   )ÚtimeoutÚcontextzutf-8Úreplace)Úerrorsz  [FETCH ERROR] ú: )
ÚurllibÚrequestÚRequestÚ
add_headerÚurlopenÚssl_ctxÚreadÚdecodeÚ	ExceptionÚprint)ÚurlÚrefererÚreqÚrespÚes        ú*/root/gov_crawler/crawl_zhaoyuan_hpjpxz.pyÚfetchr   (   s¡   € Ü
�.‰.×
 Ñ
  Øð  Hð/Ð
 ó €Cñ Ø�‰�y 'Ô*ðÜ�~‰~×%Ñ% c°2¼wÐ%ÓGˆØ�y‰y‹{×!Ñ! '°)Ð!Ó<Ð<øÜò ÜÐ    R¨ sÐ+Ô,Üûðús   ¹AB  Â 	B$Â	BÂB$c                  ó†  — t        t        d¬«      } | sg S 	 t        j                  | «      }|j	                  di «      }t        |t        «      r|j	                  dd«      }nt        |«      }g }d}t        j                  ||t        j                  «      D ]Ž  }|j                  d«      j                  «       }|j                  d«      j                  «       }|j                  d	«      j                  «       }	|j                  d
«      s	t        |z   }|j!                  |||	dœ«       Œ� |S # t        j                  $ r g cY S w xY w)zFetch list via AJAX APIz3https://www.zhaoyuan.gov.cn/col/col48655/index.html)r   ÚdataÚhtmlÚ z„<li[^>]*class="[^"]*bt-main-r-ul-li[^"]*">.*?<a[^>]*href="([^"]*)"[^>]*title="([^"]*)"[^>]*>.*?<span[^>]*>(\d{4}-\d{2}-\d{2})</span>r   é   é   Úhttp)r   ÚtitleÚdate)r   ÚAPI_URLÚjsonÚloadsÚgetÚ
isinstanceÚdictÚstrÚJSONDecodeErrorÚreÚfinditerÚDOTALLÚgroupÚstripÚ
startswithÚBASE_URLÚappend)
r    r   ÚdÚ	list_htmlÚitemsÚpatternÚmatchÚhrefr%   r&   s
             r   Úfetch_list_apir=   6   s  € ä”Ð"WÔX€DÙØˆ	ðÜ�z‰z˜$ÓˆØ�H‰H�V˜RÓ ˆÜ�aœÔØŸ™˜f bÓ)‰Iä˜A›ˆIð €Eð V€GÜ—‘˜W i´·±Ó;ò BˆØ�{‰{˜1‹~×#Ñ#Ó%ˆØ—‘˜A“×$Ñ$Ó&ˆØ�{‰{˜1‹~×#Ñ#Ó%ˆØ�‰˜vÔ&Ü˜d‘?ˆDØ�‰˜T¨E¸4Ñ@ÕAðBð €Løô ×Ñò ØŠ	ðús   —AD( Ä(E Ä?E c           
      ó\  — d}d}d}t        j                  d| «      }|r4t        j                  dd|j                  d«      «      j	                  «       }t        j                  d| «      }|r|j                  d«      }| 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«      }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 | «      D ]y  }|j                  d«      }|j                  d«      j	                  «       }|j#                  d!«      s	t$        |z   }|j                  ||xs |j'                  d"«      d#   d$d% d&œ«       Œ{ ||||d'œS c c}w )(z-Extract title, date, content from detail pager!   z<h1[^>]*>(.*?)</h1>z<[^>]+>r   u(   å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}-\d{2}-\d{2})z	id="zoom"r   zclass="text"z<div)z<div class="other"z<div class="qrcodez<div class="footerz<div id="footerz<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z	<br\s*/?>ú
z</p>z

úz<table[^>]*>.*?</table>z<tr[^>]*>(.*?)</tr>z<t[dh][^>]*>(.*?)</t[dh]>z| z | z |r"   ú|z---|z[ \t]+ú z *\n *z\n{3,}z5<a[^>]*href="([^"]*download-m[^"]*)"[^>]*>([^<]*)</a>r$   ú=éÿÿÿÿNé2   )r<   Útext)r%   r&   ÚcontentÚattachments)r/   ÚsearchÚsubr2   r3   ÚfindÚrfindÚlenr1   r
   r0   ÚfindallÚanyr6   ÚjoinÚcountÚinsertr4   r5   Úsplit)r    r%   r&   rH   Úh1_matchÚ
date_matchÚzoom_idxÚstartÚend_markersÚendÚmarkerÚposÚcontent_htmlrG   ÚtablesÚtable_matchÚ
table_htmlÚrowsÚtable_linesÚrowÚcellsÚcÚ
cell_textsÚhdrÚcleanÚpartsrI   r;   r<   s                                r   Úparse_detailrj   Q   s½  € à€EØ€DØ€Gô �y‰yÐ/°Ó6€HÙÜ—‘�z 2 x§~¡~°aÓ'8Ó9×?Ñ?ÓAˆô —‘ÐFÈÓM€JÙØ×Ñ Ó"ˆð �y‰y˜Ó%€HØ�!‚|Ø—9‘9˜^Ó,ˆØ�!ƒ|Ø—
‘
˜6 1 hÓ/ˆØ�1Š9ØˆEÚkˆÜ�$‹iˆØ!ò 	ˆFØ—)‘)˜F HÓ-ˆ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 "Ó%ˆð ˆÜŸ;™;Ð'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Ü—‘ÐUÐW[Ó\ò UˆØ�{‰{˜1‹~ˆØ�{‰{˜1‹~×#Ñ#Ó%ˆØ�‰˜vÔ&Ü˜d‘?ˆDØ×Ñ D°$Ò2R¸$¿*¹*ÀS»/È"Ñ:MÈcÈrÐ:RÑSÕTðUð  D°WÈ[ÑYÐYùò= Ps   È ,P)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%   r!   r   r&   rH   rI   r@   ú[rG   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Úcursorr*   ÚexecuteÚ	SITE_NAMEÚrowcountr   r   ÚcommitÚclose)r9   Úconnre   ÚinsertedÚskippedÚitemr%   r   r&   rH   Ú
attach_strÚattr   s                r   Úinsert_to_dbr   £   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«       t        «       }t        dt        |«      › d�«       |st        d«       y |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                  |«       Œ¹ |r*t        |«      \  }	}
||	z  }||
z  }t        d|	› d|
› d�«       t        d|› d|› �«       |dkD  rXt        j                   t"        d¬«      }|j%                  d«       |j'                  «        |j)                  «        t        d«       y y )Nr   z[INFO] u	    - çˆ¬è™«r   z 
  Fetching list via AJAX API...z  Found z itemsz  [STOP] No itemsr&   z  [STOP] Date z < z    rC   r%   rF   z...r   z    [SKIP] Cannot fetch detailrH   rI   z  [DB] +z new, z	 existingu   
[DONE] æ–°å¢ž: u
   , è·³è¿‡: rl   rm   z4INSERT INTO gov_search(gov_search) VALUES('rebuild')zFTS rebuilt)ÚPAGES_DEFAULTÚsysÚargvÚisdigitÚintr   ru   r=   rN   ÚCUTOFF_DATEr   rj   r*   r6   r   rp   rq   rr   rt   rw   rx   )Ú	max_pagesÚargÚ	all_itemsÚ	total_newÚ	total_oldr9   r|   Údetail_htmlÚdetailÚnewÚoldry   s               r   Úmainr�   Ì   s	  € Ü€IÜ�x‰x˜˜ˆ|ò !ˆØ�;‰;�=Ü˜C›‰Ið!ô 
ˆG”I�;˜iÐ
(Ô)à€IØ€IØ€Iô 
Ð-Ô/ÜÓ€EÜ	ˆH”S˜“Z�L Ð
'Ô(áÜÐ!Ô#Øàò ˆØ�‰<œ+Ò%Ü�N 4¨¡< .°´K°=ÐAÔBÙä��T˜&‘\�N ! D¨¡M°#°2Ð$6Ð#7°sÐ;Ô<Ü˜D ™KÓ(ˆÙÜÐ2Ô4Ø˜‰NˆIØä˜kÓ*ˆØ�'Š?Ø" 7™OˆD�‰MØ�&Š>Ø! &™>ˆD�‰LØ  Ñ+ˆˆY‰Ø$Ÿj™j¨¸Ó;ˆˆ]ÑØ×Ñ˜Õð'ñ* Ü 	Ó*‰ˆˆSØ�SÑˆ	Ø�SÑˆ	Ü�˜˜˜V C 5¨	Ð2Ô3ä	Ð˜i˜[¨
°9°+Ð
>Ô?à�1‚}Ü�‰œw°Ô3ˆØ�‰ÐKÔLØ�‰ŒØ�
‰
ŒÜˆmÕð ó    Ú__main__)N)Ú__doc__r‚   r/   Úosr(   rp   Úurllib.requestr   Ússlru   r5   r'   rr   r†   r�   Úcreate_default_contextr   Úcheck_hostnameÚ	CERT_NONEÚverify_moder   r=   rj   r   r�   Ú__name__© r‘   r   ú<module>r�      s¥   ðñó Û 	Û 	Û Û Û Û 
ð 1€	Ø(€ØˆZð $ð %€ð
 €Ø€Ø€à
$ˆ#×
$Ñ
$Ó
&€Ø€Ô Ø—m‘m€Ô óòò6OZòd&òR7ðt ˆzÒÙ…Fð r‘   