Ë
    6ß©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ZddlZdZ	dZ
dZde› �ZdZdZe› d	e› d
e› �Zd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d„ Zd„ Ze dk(  r e«        yy)uÆ  
ç»�å…´å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - å»ºè®¾é¡¹ç›®å®¡æ‰¹å…¬ç¤º (sxepb.sx.gov.cn)
CMS: TRS/JCMS, AJAX åˆ†é¡µ
List API: /api-gateway/jpaas-publish-server/front/page/build/unit
  pageId=1229459599, pageNo=N, 15æ�¡/é¡µ, å…±770æ�¡/52é¡µ
Detail: /col/col1229459599/art/2026/art_XXXX.html
  Title: h1.ewiunfjtitle
  Date: li.fabushijian
  Content: div.wenzhangzwendnrong (æ–‡ç« æ­£æ–‡å†…å®¹)
  Attachments: <a> links with PDF files
IP: 203.107.60.182 (needs Host header)
é    Nu1   ç»�å…´å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-å»ºè®¾é¡¹ç›®å®¡æ‰¹å…¬ç¤ºzsxepb.sx.gov.cnz203.107.60.182úhttp://Ú
1229459599Ú3001zT/api-gateway/jpaas-publish-server/front/page/build/unit?parseType=bulidstatic&webId=zf&tplSetId=1EDJzLJApOIQLd0OS4KST&pageType=column&tagId=ajax%E5%88%86%E9%A1%B5%E5%88%97%E8%A1%A8&pageId=z/root/search.dbz
2023-01-01é   é   Fc           
      ó<  — t         › d| › �}t        j                  j                  |t        ddt        › dt
        › d�dddœ¬	«      }	 t        j                  j                  |d
t        ¬«      }t        j                  |j                  «       j                  d«      «      }|j                  di «      j                  dd«      }|S # t        $ rO}t        d| › d|› �t        j                   ¬«       dd l}|j%                  t        j                   ¬«       Y d }~y d }~ww xY w)Nz&pageNo=ú<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36r   ú/col/colz/index.htmlz&application/json, text/javascript, */*ÚXMLHttpRequest)ÚHostú
User-AgentÚRefererÚAcceptzX-Requested-With©Úheadersé   ©ÚtimeoutÚcontextúutf-8ÚdataÚhtmlÚ z  [API ERROR] page ú: )Úfiler   )ÚAPI_URLÚurllibÚrequestÚRequestÚHOSTÚCOL_IDÚurlopenÚssl_ctxÚjsonÚloadsÚreadÚdecodeÚgetÚ	ExceptionÚprintÚsysÚstderrÚ	tracebackÚ	print_exc)Úpage_noÚurlÚreqÚrespr   ÚresultÚer-   s           úcrawl_sxepb_spgs.pyÚ	fetch_apir6   -   sö   € ÜˆI�X˜g˜YÐ
'€CÜ
�.‰.×
 Ñ
  ÜØTØœT˜F (¬6¨(°+Ð>Ø:Ø,ñ/Ð
 ó €Cð	Ü�~‰~×%Ñ% c°2¼wÐ%ÓGˆÜ�z‰z˜$Ÿ)™)›+×,Ñ,¨WÓ5Ó6ˆØ—‘˜& "Ó%×)Ñ)¨&°"Ó5ˆØˆøÜò ÜÐ# G 9¨B¨q¨cÐ2¼¿¹ÕDÛØ×Ñ¤§¡ÐÔ,Üûð	ús   ÁA;C Ã	DÃADÄDc                 ó0  — t         j                  j                  | t        d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)zFetch a regular HTML pager	   )r   r   r   r   r   r   Úreplace)Úerrorsz  [FETCH ERROR] r   N)
r   r   r   r    r"   r#   r&   r'   r)   r*   )r0   r1   r2   r4   s       r5   Ú
fetch_pager:   B   s‹   € ä
�.‰.×
 Ñ
  ÜØTñ/Ð
 ó €CðÜ�~‰~×%Ñ% c°2¼wÐ%ÓGˆØ�y‰y‹{×!Ñ! '°)Ð!Ó<Ð<øÜò ÜÐ    R¨ sÐ+Ô,Üûðús   ªAA1 Á1	BÁ:BÂBc                 óÎ  — g }d}t        j                  || t         j                  «      D ]¸  }|j                  d«      j	                  «       }|j                  d«      j	                  «       }|j                  d«      j	                  «       }|j                  d«      r|}n0|j                  d«      rdt        › |› �}ndt        › dt        › d|› �}|j                  |||d	œ«       Œº |S )
zParse list API response HTMLzk<a[^>]+href="([^"]+)"[^>]*title="([^"]*)"[^>]*>.*?<span class="dwebhjcfdc">\[?(\d{4}-\d{2}-\d{2})\]?</span>é   é   é   Úhttpú/r   r
   )Útitler0   Údate)	ÚreÚfinditerÚDOTALLÚgroupÚstripÚ
startswithr    r!   Úappend)r   ÚitemsÚpatternÚmÚhrefrA   rB   Úfull_urls           r5   Ú
parse_listrO   P   sÑ   € à€EØ|€GÜ�[‰[˜ $¬¯	©	Ó2ò FˆØ�w‰w�q‹z×ÑÓ!ˆØ—‘˜“
× Ñ Ó"ˆØ�w‰w�q‹z×ÑÓ!ˆð �?‰?˜6Ô"Ø‰HØ�_‰_˜SÔ!Ø ¤  t fÐ-‰Hà ¤  h¬v¨h°a¸°vÐ>ˆHà�‰˜u¨X¸tÑDÕEðFð €Ló    c                 ó  — dg dœ}t        j                  d| t         j                  «      }|r"|j                  d«      j	                  «       |d<   t        j                  d| t         j                  «      }|s%t        j                  d| t         j                  «      }|r˜|j                  d«      }t        |«      |d<   t        j                  d	|«      D ]_  }|j                  d
«      j	                  «       }|j                  d«      j	                  «       }|sŒD|sŒG|d   j                  |› d|› �«       Œa nt        d|› �«       d|vs|j                  d«      s,t        j                  d| «      }|r|j                  d«      |d<   |S )zParse detail pager   )ÚcontentÚattachmentsz6<h1[^>]*class="[^"]*ewiunfjtitle[^"]*"[^>]*>(.*?)</h1>r<   rA   zj<div[^>]*class="[^"]*wenzhangzwendnrong[^"]*"[^>]*>(.*?)</div>\s*<div[^>]*class="[^"]*poiiuygvncdssd[^"]*"zA<div[^>]*class="[^"]*wenzhangzwendnrong[^"]*"[^>]*>(.*?)</div>\s*rR   z3<a[^>]+href="([^"]*download[^"]*)"[^>]*>([^<]*)</a>r=   rS   z](z!  [WARN] No content div found in rB   z2meta[^>]+PubDate[^>]+content="(\d{4}-\d{2}-\d{2})")
rC   ÚsearchrE   rF   rG   Úhtml_to_markdownrD   rI   r*   r(   )r   r0   r3   rL   Úcontent_htmlÚamÚfnameÚfurls           r5   Úparse_detailrZ   f   sr  € à¨BÑ/€Fô 	�	‰	ÐKÈTÔSU×S\ÑS\Ó]€AÙØŸ'™' !›*×*Ñ*Ó,ˆˆw‰ô 	�	‰	Ðð  BFô  HJ÷  HQñ  HQó  	R€AÙä�I‰IÐZÐ\`Ôbd×bkÑbkÓlˆáØ—w‘w˜q“zˆÜ,¨\Ó:ˆˆyÑô —+‘+ÐTÐVbÓcò 	AˆBØ—H‘H˜Q“K×%Ñ%Ó'ˆEØ—8‘8˜A“;×$Ñ$Ó&ˆDÚšØ�}Ñ%×,Ñ,°¨w°b¸¸Ð-?Õ@ñ		Aô 	Ð1°#°Ð7Ô8ð �VÑ 6§:¡:¨fÔ#5Ü�I‰IÐKÈTÓRˆÙØŸW™W Q›ZˆF�6‰Nà€MrP   c                 ó¸  ‡— g Šˆfd„}t        j                  d|| t         j                  ¬«      } t        j                  dd| t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|«      }t        j                  d	d
|«      }t        j                  dd|«      }t        j                  dd|«      }dD ]  \  }}|j                  ||«      }Œ t        j                  dd
|«      }t        j                  dd|«      }t	        ‰«      D ]  \  }}|j                  d|z  |«      }Œ |j                  «       S )u8   æ��å�–æ­£æ–‡ï¼šæ®µè�½å�–æ–‡æœ¬ï¼Œè¡¨æ ¼ä¿�ç•™åŽŸå§‹ HTMLc                 óf   •— ‰j                  | j                  d«      «       dt        ‰«      dz
  z  S )Nr   z
@@TABLE_%d@@
r<   )rI   rF   Úlen)rL   Útabless    €r5   Úkeepzhtml_to_markdown.<locals>.keepŽ   s*   ø€ Ø�‰�a—g‘g˜a“jÔ!Ø!¤S¨£[°1¡_Ñ5Ð5rP   z<table[^>]*>.*?</table>)Úflagsz<script[^>]*>.*?</script>r   z<style[^>]*>.*?</style>z	<br\s*/?>ú
z</p>z

z</div>z<[^>]+>))z&nbsp;ú )z&lt;ú<)z&gt;ú>)z&amp;ú&)z&#39;ú')z&quot;ú")z&mdash;u   â€”)z&middot;õ   Â·z\n{3,}z3(?<=[\u4e00-\u9fff])[ \t\u3000]+(?=[\u4e00-\u9fff])z@@TABLE_%d@@)rC   ÚsubrE   r8   Ú	enumeraterG   )r   r_   Útextr4   ÚrÚiÚtr^   s          @r5   rU   rU   ‹   s*  ø€ à€Fô6ô �6‰6Ð,¨d°DÄÇ	Á	ÔJ€Dô �6‰6Ð.°°DÄÇ	Á	ÔJ€DÜ�6‰6Ð,¨b°$¼b¿i¹iÔH€DÜ�6‰6�,  dÓ+€DÜ�6‰6�'˜6 4Ó(€DÜ�6‰6�)˜T 4Ó(€DÜ�6‰6�*˜b $Ó'€Dð[ò "‰ˆˆ1à�|‰|˜A˜qÓ!‰ð"ô �6‰6�)˜V TÓ*€Dä�6‰6ÐHÈ"ÈdÓS€Dä˜&Ó!ò 3‰ˆˆ1Ø�|‰|˜N¨QÑ.°Ó2‰ð3à�:‰:‹<ÐrP   c                 óÌ  — dd l }|j                  t        d¬«      }|j                  «       }|j	                  d«       d}d}| D ]¼  }dj                  |j                  dg «      «      }	 |j	                  d|j                  dd	«      |j                  d
d	«      t        |j                  dd	«      |j                  dd	«      ||j                  d
d	«      |j                  dd	«      f«       |j                  dkD  r|dz  }n|dz  }Œ¾ |j                  «        |j                  «        ||fS # t        $ r4}t        d|j                  dd	«      d d › d|› �«       |dz  }Y d }~�Œd }~ww xY w)Nr   é   ©r   zPRAGMA busy_timeout=30000ra   rS   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))
            rA   r   r0   rB   rR   r<   z  [DB ERROR] r   )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚjoinr(   Ú	SITE_NAMEÚrowcountr)   r*   ÚcommitÚclose)	rJ   rr   ÚconnÚcÚinsertedÚskippedÚitemrS   r4   s	            r5   Úinsert_to_dbr�   ¦   sZ  € ÛØ�?‰?œ7¨Bˆ?Ó/€DØ�‰‹€AØ‡I�IÐ)Ô*à€HØ€GØò ˆØ—i‘i §¡¨¸Ó ;Ó<ˆð	Ø�I‰Ið ð
 —‘˜ "Ó%Ø—‘˜ Ó#ÜØ—‘˜ Ó$Ø—‘˜ BÓ'ØØ—‘˜ Ó#Ø—‘˜ Ó$ð	ô	ð �z‰z˜AŠ~Ø˜A‘‘à˜1‘�øð)ð2 	‡K�K„MØ‡J�J„LØ�WÐÐøô ò 	Ü�M $§(¡(¨7°BÓ"7¸¸Ð"<Ð!=¸RÀ¸sÐCÔDØ�q‰LŽGûð	ús   Á(BD&Ä&	E#Ä/)EÅE#c            
      óÜ  — t         } t        j                  dd  D ]  }|j                  «       sŒt	        |«      } Œ  t        dt        › d| › �«       g }d}d}d }t        d| dz   «      D �]z  }t        d|› d�«       t        |«      }|st        d|› �«       Œ/|dk(  r|}n||k(  rt        d|› d	�«        �n0t        |«      }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   «      }|j                  dd«      |	d<   d|v r|d   |	d<   |j                  dg «      |	d<   d|v r|d   |	d<   |j                  |	«       ŒÈ |s�ŒOt!        |«      \  }}||z  }||z  }t        d|› d|› d�«       g }�Œ} |rt!        |«      \  }}||z  }||z  }t        d|› d|› �«       |dkD  rXdd l}|j%                  t&        d¬ «      }|j)                  d!«       |j+                  «        |j-                  «        t        d"«       y y )#Nr<   z[INFO] u    - çˆ¬è™«, pages=r   z	
  [Page z] Fetching API...z  [SKIP] Failed page z  [STOP] Page z0 same as page 1 (AJAX returns identical content)z  Found z itemsz  [STOP] No itemsrB   z  [STOP] Date z < z    rb   rA   é2   z...r0   z    [SKIP] Cannot fetchrR   r   rS   z  [DB] +z new, z	 existingu   
[DONE] æ–°å¢ž: u
   , è·³è¿‡: rp   rq   uB   SELECT 1 /* noop: gov_search ç”±è§¦å�‘å™¨ç»´æŠ¤, æ— éœ€ rebuild */zFTS rebuilt)ÚPAGES_DEFAULTr+   ÚargvÚisdigitÚintr*   rx   Úranger6   rO   r]   ÚCUTOFF_DATEr:   rZ   r(   rI   r�   rr   rs   rt   rv   rz   r{   )Ú	max_pagesÚargÚ	all_itemsÚ	total_newÚ	total_oldÚ
first_htmlr/   r   rJ   r€   Údetail_htmlÚdetailÚnewÚoldrr   r|   s                   r5   Úmainr”   Ì   sÀ  € Ü€IÜ�x‰x˜˜ˆ|ò !ˆØ�;‰;�=Ü˜C›‰Ið!ô 
ˆG”I�;Ð/°	¨{Ð
;Ô<à€IØ€IØ€Ià€JÜ˜˜I¨™MÓ*ó /ˆÜ�
˜7˜)Ð#4Ð5Ô6Ü˜Ó!ˆÙÜÐ)¨'¨Ð3Ô4Øà�aŠ<Ø‰JØ�ZÒÜ�N 7 )Ð+[Ð\Ô]Úä˜4Ó ˆÜ�œ˜U›˜ FÐ+Ô,áÜÐ%Ô'Ùàò 	#ˆDØ�F‰|œkÒ)Ü˜ t¨F¡| n°C¼°}ÐEÔFÙä�D˜˜f™˜ a¨¨W©°c°rÐ(:Ð';¸3Ð?Ô@Ü$ T¨%¡[Ó1ˆKÙÜÐ/Ô1Ø˜Q‘�	Øä! +¨t°E©{Ó;ˆFØ$Ÿj™j¨°BÓ7ˆD�‰OØ˜&Ñ Ø & w¡��W‘Ø"(§*¡*¨]¸BÓ"?ˆD�ÑØ˜ÑØ% f™~��V‘Ø×Ñ˜TÕ"ð'	#ó, Ü# IÓ.‰HˆC�Ø˜ÑˆIØ˜ÑˆIÜ�H˜S˜E ¨ u¨IÐ6Ô7ØŠIð_/ñb Ü 	Ó*‰ˆˆSØ�SÑˆ	Ø�SÑˆ	ä	Ð˜i˜[¨
°9°+Ð
>Ô?à�1‚}ÛØ�‰œw°ˆÓ3ˆØ�‰ÐYÔZØ�‰ŒØ�
‰
ŒÜˆmÕð rP   Ú__main__)!Ú__doc__Úurllib.requestr   Úurllib.errorr$   rC   r+   ÚosÚsslrx   r    ÚIPÚBASEr!   ÚWEB_IDr   rt   r‰   r„   ÚROWS_PER_PAGEÚcreate_default_contextr#   Úcheck_hostnameÚ	CERT_NONEÚverify_moder6   r:   rO   rZ   rU   r�   r”   Ú__name__© rP   r5   ú<module>r¥      sÝ   ðñó Û Û Û 	Û 
Û 	Û 
ð @€	Ø€Ø€Ø	��€~€Ø	€Ø	€ØˆVð +Ø+1¨(ðà�Xð	€ð
 €Ø€Ø€Ø€à
$ˆ#×
$Ñ
$Ó
&€Ø€Ô Ø—m‘m€Ô òò*òò,"òJò6#òLKð\ ˆzÒÙ…Fð rP   