Ë
    ¸¬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dl	m	Z	  ej                  «       Zde_        ej                  e_        dZdZdZdd	iZd
ZdZdej*                  v Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uµ   Crawler for æƒ æ°´åŽ¿-é€šçŸ¥å…¬å‘Š (gzhs.gov.cn)
   https://www.gzhs.gov.cn/xwdt/tzgg/
   CMS: TRS, pagination: index_{N}.html
   Detail: div#Zoom > .trs_editor_view or raw content
é    N)ÚdatetimeFzhttps://www.gzhs.gov.cnz/xwdt/tzgg/u   æƒ æ°´åŽ¿äººæ°‘æ”¿åºœz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36z/root/search.dbé   z--incrementalc                 óÚ   — t         j                  j                  | t        ¬«      }t         j                  j	                  |t
        d¬«      }|j                  «       j                  dd¬«      S )N)Úheadersé   )ÚcontextÚtimeoutzutf-8Úreplace)Úerrors)ÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚssl_ctxÚreadÚdecode)ÚurlÚreqÚresps      ú/root/gov_crawler/crawl_gzhs.pyÚfetchr      sR   € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CÜ�>‰>×!Ñ! #¬wÀÐ!ÓC€DØ�9‰9‹;×Ñ˜g¨iÐÓ8Ð8ó    c                 ó®  — g }t        j                  d| t         j                  «      D ]ª  }|j                  d«      j	                  «       }|j                  d«      j	                  «       }|j                  d«      j	                  «       }|j                  d«      r|n#t        j                  j                  t        |«      }|j                  |||f«       Œ¬ |S )z.Extract (page_url, title, date) from list pagez`<li>\s*<a[^>]*href="([^"]*)"[^>]*title="([^"]*)"[^>]*>.*?</a>\s*<span>(\d{4}-\d{2}-\d{2})</span>é   é   é   Úhttp)ÚreÚfinditerÚDOTALLÚgroupÚstripÚ
startswithr   ÚparseÚurljoinÚBASEÚappend)ÚhtmlÚitemsÚmÚhrefÚtitleÚdateÚfull_urls          r   Úget_list_itemsr0      s­   € à€EÜ�[‰[ØkØŒb�i‰ióò .ˆð �w‰w�q‹z×ÑÓ!ˆØ—‘˜“
× Ñ Ó"ˆØ�w‰w�q‹z×ÑÓ!ˆØŸ?™?¨6Ô2‘4¼¿¹×8LÑ8LÌTÐSWÓ8XˆØ�‰�h  tÐ,Õ-ð.ð €Lr   c                 ó0  — | }t        j                  d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|«      }t        j                  dd|«      }d„ }t        j                  d||t         j                  ¬«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }|j	                  «       S )z7Clean HTML content preserving <p>, <table>, <img>, <br>z<script[^>]*>.*?</script>Ú )Úflagsz<style[^>]*>.*?</style>z0</?(?:span|font|strong|b|em|i|u|a|s|o:p)\b[^>]*>z<h[1-6][^>]*>ú<p>z	</h[1-6]>ú</p>z\s+style="[^"]*"z\s+style='[^']*'z
<p\s[^>]*>c                 óz   — t        j                  dd| j                  d«      «      }d|j                  «       z   dz   S )Nú\s+ú r   r4   r5   )r   Úsubr"   r#   )r+   Úinners     r   Ú
collapse_pz!clean_content.<locals>.collapse_p=   s2   € Ü—‘�v˜s A§G¡G¨A£JÓ/ˆØ�u—{‘{“}Ñ$ vÑ-Ð-r   z<p>(.*?)</p>z<p>\s*(?:<br>\s*)*</p>z	<br\s*/?>z<br>z&nbsp;r8   z>\s+<z>
<zC\s+(data-\w+|class|id|width|height|border|alt|srcset|sizes)="[^"]*")r   r9   r!   ÚIr#   )Úraw_htmlÚcontentr;   s      r   Úclean_contentr?   -   s;  € à€Gä�f‰fÐ1°2°wÄbÇiÁiÔP€GÜ�f‰fÐ/°°WÄBÇIÁIÔN€Gä�f‰fÐHÈ"ÈgÔ]_×]aÑ]aÔb€Gä�f‰fÐ% u¨gÓ6€GÜ�f‰f�\ 6¨7Ó3€Gä�f‰fÐ(¨"¨gÓ6€GÜ�f‰fÐ(¨"¨gÓ6€GÜ�f‰f�] E¨7Ó3€Gò.ô �f‰f�_ j°'ÄÇÁÔK€Gä�f‰fÐ.°°GÓ<€GÜ�f‰f�\ 6¨7Ó3€GÜ�f‰f�Y  WÓ-€GÜ�f‰f�X˜v wÓ/€Gä�f‰fÐ[Ð]_ÐahÓi€GØ�=‰=‹?Ðr   c                 ó:  — t        | «      }t        j                  d|t        j                  «      }|r|j	                  d«      j                  «       nd}t        j                  d|«      }|r|j	                  d«      nd}|s+t        j                  d|«      }|r|j	                  d«      nd}d}t        j                  d|t        j                  «      }|s%t        j                  d|t        j                  «      }|r|j	                  d«      }t        |«      }|||fS )z%Fetch and extract detail page contentz<h1[^>]*>(.*?)</h1>r   r2   u(   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{2}-\d{2})z!(\d{4}-\d{2}-\d{2})\s+\d{2}:\d{2}z5<div[^>]*id="Zoom"[^>]*>(.*?)</div>\s*</div>\s*</div>z#<div[^>]*id="Zoom"[^>]*>(.*?)</div>)r   r   Úsearchr!   r"   r#   r?   )	r   r)   Úh1r-   ÚdÚpub_dateÚd2Úcontent_htmlÚcs	            r   Ú
get_detailrH   K   sé   € ä�‹:€Dô 
�‰Ð)¨4´·±Ó	;€BÙ#%ˆB�H‰H�Q‹K×ÑÔ¨2€Eô 	�	‰	Ð=¸tÓD€AÙˆq�w‰w�qŒz B€HÙÜ�Y‰YÐ;¸TÓBˆÙ"$�2—8‘8˜A”;¨"ˆð €LÜ
�	‰	ÐJÈDÔRT×R[ÑR[Ó\€AÙÜ�I‰IÐ<¸dÄBÇIÁIÓNˆÙØ—w‘w˜q“zˆÜ$ \Ó2ˆà�(˜LÐ(Ð(r   c                  ó˜  — t        j                  t        «      } | j                  «       }d}d}t        rt
        nd}t        d|dz   «      D �]Ð  }|dk(  rt        t        z   }nt        › t        › d|dz
  › d�}t        dt        j                  «       j                  d«      › d|› d	�d
d¬«       	 t        |«      }t#        |«      }	|	st        d«        �nKt        t%        |	«      › d�«       |	D �]+  \  }
}}|j'                  d|
f«       |j)                  «       r|dz  }Œ1	 t+        |
«      \  }}}|rt%        |«      dk  rt        d|d d › �«       |dz  }Œh|xs |}|xs |}t-        j.                  dd
|«      }t-        j.                  dd
|«      j1                  «       d d }|j'                  d|
t        ||||t2        df«       |j4                  dkD  r#|dz  }|dk  s|dz  dk(  rt        d|d d › �«       | j7                  «        t        j                   d«       �Œ. �ŒÓ | j;                  «        t        d!|› d"|› d#�«       y # t        $ r.}t        d|› �«       t        j                   d«       Y d }~�Œ)d }~ww xY w# t        $ rD}t        d|d d › d |› �«       | j9                  «        t        j                   d«       Y d }~�Œ×d }~ww xY w)$Nr   iç  r   Úindex_z.htmlú[z%H:%M:%Sz] Page z...r8   T)ÚendÚflushzERROR: r   zNo items, stoppingz itemsz)SELECT id FROM gov_raw WHERE page_url = ?é2   z  SKIP (short): é(   z<[^>]+>r7   i,  z�INSERT OR IGNORE INTO gov_raw (page_url, source_url, title, publish_date, content, summary, site_name, category) VALUES (?, ?, ?, ?, ?, ?, ?, ?)u   é€šçŸ¥å…¬å‘Šr   é
   z  + g333333Ó?z	  ERROR: r   z - z
=== Done: New=z, Skip=z ===)Úsqlite3ÚconnectÚDB_PATHÚcursorÚincrementalÚ	MAX_PAGESÚranger'   ÚLIST_DIRÚprintr   ÚnowÚstrftimer   Ú	ExceptionÚtimeÚsleepr0   ÚlenÚexecuteÚfetchonerH   r   r9   r#   Ú	SITE_NAMEÚrowcountÚcommitÚrollbackÚclose)ÚconnrG   Ú	total_newÚ
total_skipÚ	max_pagesÚpager   r)   Úer*   Úpage_urlÚ
list_titleÚ	list_dateÚdetail_titlerD   rF   r-   r.   Úsummarys                      r   Úmainrr   f   s·  € Ü�?‰?œ7Ó#€DØ�‰‹€AØ€IØ€JÝ(•	¨c€Iä�a˜ Q™Ó'ó 6ˆØ�1Š9Üœ‘/‰Cä�Fœ8˜* F¨4°©6¨(°%Ð8ˆCä�”(—,‘,“.×)Ñ)¨*Ó5Ð6°g¸d¸VÀ3ÐGÈSÐX\Õ]ð	Ü˜“:ˆDô ˜tÓ$ˆÙÜÐ&Ô'Úä”�U“�˜FÐ#Ô$à/4ó  	Ñ+ˆH�j )Ø�I‰IÐAÀHÀ;ÔOØ�z‰zŒ|Ø˜a‘�
ØðÜ7AÀ(Ó7KÑ4�˜h¨Ù#¤s¨<Ó'8¸2Ò'=ÜÐ,¨Z¸¸¨_Ð,=Ð>Ô?Ø !‘O�JØà$Ò2¨
�ØÒ, 9�äŸ&™& ¨S°,Ó?�ÜŸ&™& ¨¨gÓ6×<Ñ<Ó>¸tÀÐD�à—	‘	ð gØœt U¨D°,ÀÌÐTbÐcôð —:‘: ’>Ø ‘N�IØ  A’~¨°R©¸1Ò)<Ü  U¨3¨B Z LÐ1Ô2Ø—‘”Ü—
‘
˜3–ò9 	ð-6ðp 	‡J�J„LÜ	Ð˜Y˜K w¨z¨l¸$Ð
?Õ@øô_ ò 	Ü�G˜A˜3�-Ô Ü�J‰J�qŒMÝûð	ûôR ò Ü˜	 *¨S¨b /Ð!2°#°a°SÐ9Ô:Ø—‘”Ü—
‘
˜1—’ûðús7   Â.IÄ5I<ÅCI<É	I9É#I4É4I9É<	K	Ê9KËK	Ú__main__)Ú__doc__Úurllib.requestr   Úurllib.parseÚsslr   rQ   Úsysr]   r   Úcreate_default_contextr   Úcheck_hostnameÚ	CERT_NONEÚverify_moder'   rX   rb   r   rS   rV   ÚargvrU   r   r0   r?   rH   rr   Ú__name__© r   r   ú<module>r€      s¢   ðñ÷
 A× @× @Ó @Ý à
$ˆ#×
$Ñ
$Ó
&€Ø€Ô Ø—m‘m€Ô à €Ø€Ø#€	ØÐWÐ
X€Ø
€Ø€	à §¡Ð)€ò9òòò<)ò6@AðF ˆzÒÙ…Fð r   