Ë
    }�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mZ ddlm	Z	 dZ
e
dz   ZdZdZd	d
dddœZddddddddœZd„ Zd+d„Zd,d„Zd„ Zd„ Zd„ Zd-d„Zedk(  ržddlZ ej2                  d¬ «      Zej7                  d!edd"¬#«       ej7                  d$edd%¬#«       ej7                  d&d'd(¬)«       ej;                  «       Zej>                  rej>                  nej@                  Z! ee!ejD                  ¬*«       yy).uÌ   é¾™æ¸¯å¸‚äººæ°‘æ”¿åºœ - è¡Œæ”¿è®¸å�¯ï¼ˆç”Ÿæ€�çŽ¯å¢ƒé¢†åŸŸï¼‰çˆ¬è™«
ç«™ç‚¹: www.zjlg.gov.cn
æ �ç›®: /col/col1229549231/index.html (è¡Œæ”¿è®¸å�¯ - ç”Ÿæ€�çŽ¯å¢ƒåŸºå±‚æ”¿åŠ¡å…¬å¼€)
æ•°æ�®é€šè¿‡JCMS APIåŠ è½½
é    N)Údatetime)ÚBeautifulSoupzhttp://www.zjlg.gov.cnz7/api-gateway/jpaas-publish-server/front/page/build/unitz/root/search.dbzwww.zjlg.gov.cn-xzxkzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36z*/*zzh-CN,zh;q=0.9,en;q=0.8z3http://www.zjlg.gov.cn/col/col1229549231/index.html)ú
User-AgentÚAcceptúAccept-LanguageÚRefererÚbulidstaticÚ2016ÚtfABXwWYi3U9Vix6VgDl6Úcolumnu   é‡�ç‚¹é¢†åŸŸå�³åˆ—è¡¨ÚnullÚ
1229549231)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚeditTypeÚpageIdc                  óZ   — t        j                  t        «      } | j                  d«       | S )NzPRAGMA journal_mode=WAL)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    ú$/root/gov_crawler/crawl_zjlg_xzxk.pyÚinit_dbr   '   s"   € Ü�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø€Kó    c                 ó”  — t        t        «      }t        j                  | |dœd¬«      |d<   	 t	        j
                  t        t        |dd¬«      }|j                  dk(  r6|j                  «       }|j                  d«      r|d	   j                  d
d«      S y# t        $ r(}t        d|› �t        j                  ¬«       Y d}~yd}~ww xY w)u    è°ƒç”¨JCMS APIèŽ·å�–åˆ—è¡¨æ•°æ�®)ÚpageNoÚpageSizeF©Úensure_asciiÚ	paramJsoné   )ÚheadersÚparamsÚtimeoutÚverifyéÈ   ÚsuccessÚdataÚhtmlÚ Nz  [ERROR] API call failed: ©Úfile)ÚdictÚ
API_PARAMSÚjsonÚdumpsÚrequestsÚgetÚAPI_URLÚHEADERSÚstatus_codeÚ	ExceptionÚprintÚsysÚstderr)Úpage_noÚ	page_sizer'   Úrespr,   Úes         r   Ú	fetch_apirB   ,   s«   € ä”*Ó€FÜŸ*™*°ÀYÑ%OÐ^cÔd€Fˆ;Ñð	Ü�|‰|œG¬W¸VÈRÐX]Ô^ˆØ×Ñ˜sÒ"Ø—9‘9“;ˆDØ�x‰x˜	Ô"Ø˜F‘|×'Ñ'¨°Ó3Ð3ØøÜò ÜÐ+¨A¨3Ð/´c·j±jÕAÜûðús   ®A&B Â	CÂCÃCc                 óú   — 	 t        j                  | t        d   dddœ|d¬«      }d|_        |j                  dk(  r|j
                  S y # t        $ r(}t        d	|› �t        j                  ¬
«       Y d }~y d }~ww xY w)Nr   z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9)r   r   r   F)r&   r(   r)   zutf-8r*   z  [ERROR] fetch failed: r/   )
r5   r6   r8   Úencodingr9   Útextr:   r;   r<   r=   )Úurlr(   r@   rA   s       r   Ú
fetch_pagerG   ;   s~   € ðÜ�|‰|˜CÜ! ,Ñ/ØWØ/ñ*
ð  5ô	*ˆð
  ˆŒØ×Ñ˜sÒ"Ø—9‘9ÐØøÜò ÜÐ(¨¨Ð,´3·:±:Õ>Üûðús   ‚AA	 Á		A:ÁA5Á5A:c                 óN  — g }t        | d«      }|j                  d«      D �]  }|j                  d«      }|r|j                  d«      sŒ)|d   j	                  «       }|j                  d«      sŒN|j                  d«      r
t        |z   }n|j                  d«      st        dz   |z   }|j                  d¬	«      }|sŒ›|j                  d
«      }|r|j                  d¬	«      nd}t        j                  d|«      }	|	r|	j                  d«      nd}|j                  |||dœ«       �Œ |S )u   è§£æž�APIè¿”å›žçš„HTMLåˆ—è¡¨úhtml.parserÚliÚaÚhrefz.htmlú/ÚhttpT©ÚstripÚspanr.   ú(\d{4}-\d{2}-\d{2})é   )rF   ÚtitleÚpub_date)r   Úfind_allÚfindr6   rP   ÚendswithÚ
startswithÚBASE_URLÚget_textÚreÚsearchÚgroupÚappend)
Ú	html_textÚitemsÚsouprJ   rK   rL   rT   Ú	date_spanrU   Ú
date_matchs
             r   Ú
parse_listre   J   s  € à€EÜ˜ MÓ2€DØ�m‰m˜DÓ!ó JˆØ�G‰G�C‹LˆÙ˜Ÿ™˜fœØØ�‰y�‰Ó ˆØ�}‰}˜WÔ%ØØ�?‰?˜3ÔÜ˜d‘?‰DØ—‘ Ô(Ü˜c‘> DÑ(ˆDà—
‘
 �
Ó&ˆÙØà—G‘G˜F“Oˆ	Ù5>�9×%Ñ%¨DÐ%Ô1ÀBˆÜ—Y‘YÐ5°xÓ@ˆ
Ù*4�:×#Ñ# AÔ&¸"ˆØ�‰˜T¨E¸xÑHÖIð)Jð* €Lr   c                 óÖ  — t        | d«      }d}|j                  d«      }|r9|j                  d¬«      }t        j                  dd|«      j                  «       }|}d}t        j                  d| «      D ]  }|j                  d«      } n |j                  d	d
¬«      }g }	d}
|�r|j                  ddg«      D ]  }|j                  «        Œ d}t        «       }|j                  d«      D ]e  }|j                  d«      }|rt        d„ |D «       «      nd}|sŒ-|j                  d¬«      }||v rŒD|j                  |«       |t        |«      dz   z  }Œg t        t        |«      d«      }|j                  d«      D ]  }|j                  «        Œ |j                  dd¬«      }
t        j                  dd|
«      }
|r|
d|z   z  }
t        |
j                  «       «      dk  r	d|› d|› d�}
||
||	fS )u   è§£æž�è¯¦æƒ…é¡µrI   r.   rT   TrO   z\s*[-|]\s*.*$rR   rS   ÚdivÚzoom)ÚidÚscriptÚstyleÚtableÚtrc              3   óV   K  — | ]!  }t        |j                  d «      «      dk\  –— Œ# y­w)Útdé   N)ÚlenrV   )Ú.0Úrows     r   ú	<genexpr>zparse_detail.<locals>.<genexpr>…   s#   è ø€ ÒH¸Cœ3˜sŸ|™|¨DÓ1Ó2°aÕ7ÑHùs   ‚')Fz

)Ú	separatorrP   z\n{4,}u   

[è¡¨æ ¼]
é   z<p><a href="z">z</a></p>)r   rW   r[   r\   ÚsubrP   Úfinditerr^   rV   Ú	decomposeÚsetÚanyÚaddÚstrrq   )r-   rF   rb   rT   Ú	title_tagÚtrU   ÚmÚcontent_divÚattachmentsÚcontentÚtagÚtables_htmlÚ
seen_textsrl   ÚrowsÚhas_dataÚtxtÚcontent_div_cleans                      r   Úparse_detailr‹   e   s	  € ä˜˜}Ó-€Dð €EØ—	‘	˜'Ó"€IÙØ×Ñ TÐÓ*ˆÜ�F‰FÐ# R¨Ó+×1Ñ1Ó3ˆØˆð €HÜ�[‰[Ð/°Ó6ò ˆØ—7‘7˜1“:ˆÙðð
 —)‘)˜E f�)Ó-€KØ€KØ€GâØ×'Ñ'¨°7Ð(;Ó<ò 	ˆCØ�M‰M�Oð	ð ˆÜ“Uˆ
Ø ×)Ñ)¨'Ó2ò 		/ˆEØ—>‘> $Ó'ˆDÙLP”sÑHÀ4ÔHÔHÐV[ˆHÙØØ—.‘. t�.Ó,ˆCØ�jÑ ØØ�N‰N˜3ÔØœ3˜u›:¨Ñ.Ñ.‰Kð		/ô *¬#¨kÓ*:¸MÓJÐØ$×-Ñ-¨gÓ6ò 	ˆCØ�M‰M�Oð	ð $×,Ñ,°vÀTÐ,ÓJˆÜ—&‘&˜ F¨GÓ4ˆÙØÐ'¨+Ñ5Ñ5ˆGä
ˆ7�=‰=‹?Ó˜bÒ Ø    R¨ w¨hÐ7ˆà�'˜8 [Ð0Ð0r   c                 ó
  — |rt        j                  |d¬«      nd}t        j                  «       j	                  d«      }t        t        |«      «      dz  dz   }	| j                  d|||||||||	f	«       | j                  «        y )NFr"   z[]z%Y-%m-%d %H:%M:%Sé
   rS   uû   
        INSERT OR REPLACE INTO gov_raw 
        (page_url, site_name, source_url, title, publish_date, summary, content, attachments, date_rank, status, category, visits)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'published', 'è¡Œæ”¿è®¸å�¯', 0)
    )	r3   r4   r   ÚnowÚstrftimeÚabsÚhashr   Úcommit)
r   Úpage_urlrT   Úsummary_textÚpublish_dater‚   Ú	site_nameÚattachments_jsonrŽ   Úlevels
             r   Úsave_articler™   �   s~   € ÙFQ”t—z‘z +¸EÕBÐW[ÐÜ
�,‰,‹.×
!Ñ
!Ð"5Ó
6€CÜ”�X“Ó "Ñ$ qÑ(€EØ‡L�Lð ð �I˜x¨°¸lÈLÐZjÐlqÐ	rô	tð
 	‡K�K…Mr   é   c                 ó~  — t        «       }d}d}t        «       }t        | «      D �]p  }t        d|dz   › d|dz   › �«       t	        |dz   d¬«      }|rt        |«      dk  rt        d«        �n+t        |«      }|D �	cg c]  }	|	d	   |vsŒ|	‘Œ }
}	|D ]  }	|j                  |	d	   «       Œ t        d
t        |«      › dt        |
«      › d�«       |
s nÆ|
D ]¾  }|d	   }|d   }|d   }|r$|j                  d|f«      j                  «       }|rŒ8t        d|d d › d�«       t        |«      }|s|dz  }t        d|› �«       Œkt        ||«      \  }}}}|s|r|}|r0t        ||||||t        «       |dz  }t        d|› d|d d › d�«       Œ´t        d«       ŒÀ �Œs |j                  «        t        d|› d|› �«       y c c}	w )Nr   z[PAGE rS   z] API pageNo=rv   )r>   r?   éd   z  [WARN] No more data, stoppingrF   z  Found z articles (z new)rT   rU   z/SELECT page_url FROM gov_raw WHERE page_url = ?z
  [FETCH] é2   z...z#  [ERROR] detail page unreachable: u       âœ“ saved [z] u       âœ— empty title, skippedz
[DONE] Total: z articles, Errors: )r   rz   Úranger;   rB   rq   re   r|   r   ÚfetchonerG   r‹   r™   Ú	SITE_NAMEÚclose)Ú	max_pagesÚincrementalr   ÚtotalÚerrorsÚ	seen_urlsÚpager`   ra   ÚitÚunique_itemsÚitemrF   rT   Ú	list_dateÚexistingÚdetail_htmlÚdetail_titlerƒ   rU   r‚   s                        r   Úcrawlr¯   ©   s
  € Ü‹9€DØ€EØ€FÜ“€Iä�iÓ ó ,7ˆÜ��t˜A‘v�h˜m¨D°©F¨8Ð4Ô5Ü d¨1¡f¸Ô;ˆ	ÙœC 	›N¨SÒ0ÜÐ3Ô5Úä˜9Ó%ˆØ%*ÖI˜r¨b°©i¸yÒ.HšÐIˆÐIØò 	%ˆBØ�M‰M˜"˜U™)Õ$ð	%ä�œ˜U›˜ K´°LÓ0AÐ/BÀ%ÐHÔIáÙà ò 	7ˆDØ�u‘+ˆCØ˜‘MˆEØ˜ZÑ(ˆIáØŸ<™<ØEÈÀvóç‘(“*ð ñ Øä�J˜u S b˜z˜l¨#Ð.Ô/Ü$ S›/ˆKÙØ˜!‘�ÜÐ;¸C¸5ÐAÔBØä;GÈÐUXÓ;YÑ8ˆL˜' 8¨[Ù¡	Ø$�áÜ˜T 3¨°g¸xÈÔV_Ô`Ø˜‘
�Ü˜¨ z°°LÀÀ"Ð4EÐ3FÀcÐJÕKäÐ4Õ6ò9	7ð!,7ð\ 	‡J�J„LÜ	Ð˜U˜GÐ#6°v°hÐ
?Õ@ùòO Js   Á<F:Â	F:Ú__main__u'   é¾™æ¸¯å¸‚ç”Ÿæ€�çŽ¯å¢ƒè¡Œæ”¿è®¸å�¯çˆ¬è™«)Údescriptionz--max-pagesu   æœ€å¤§çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultÚhelpz--pagesu#   æœ€å¤§çˆ¬å�–é¡µæ•°(å…¼å®¹è°ƒåº¦å™¨)z--incrementalÚ
store_trueu   å¢žé‡�æ¨¡å¼�)Úactionr´   )r¢   r£   )rS   rv   )r%   )rš   F)#Ú__doc__r5   r   r\   r<   Úosr3   r   Úbs4r   rZ   r7   r   r    r8   r2   r   rB   rG   re   r‹   r™   r¯   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚintÚ
parse_argsÚargsÚpagesr¢   Úmpr£   © r   r   ú<module>rÅ      s5  ðñó Û Û 	Û 
Û 	Û Ý Ý à#€Ø
ÐNÑ
N€Ø
€Ø"€	ð DØØ0ØDñ	€ð ØØ'ØØ$ØØñ€
òó
óòò651òp	ó5Aðp ˆzÒÛØ$ˆX×$Ñ$Ð1ZÔ[€FØ
×Ñ˜¨C¸ÐAUÐÔVØ
×Ñ˜	¨°TÐ@eÐÔfØ
×Ñ˜°À>ÐÔRØ×ÑÓ€DØ—z’zˆ�Š t§~¡~€BÙ	�B D×$4Ñ$4Ö5ð r   