Ë
    ¸¬uj2   ã                   ó”  — 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m	Z	m
Z
 ddlmZmZ ddlmZ  eej                   «       dZdZdZej(                  j+                  d	d
«      Z ej.                  e	j0                  «       e
d¬«      z
  j3                  d«      ZddiZdZdZdZdZdd„Z d„ Z!d„ Z"d„ Z#d„ Z$e%dk(  r e$«        yy)uU  é‡‘æºªåŽ¿äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Š (jinxi.gov.cn col10560) çˆ¬è™«

CMS: æµ™æ±Ÿæ”¿ä¼�CMS (ZJEG)
åˆ—è¡¨: /col/col10560/index.html  (XML datastore åµŒå…¥é¡µé�¢)
è¯¦æƒ…: /art/YYYY/M/D/art_XXXXX_XXXXXXX.html
      title: <!--<$[æ ‡é¢˜]>begin-->TITLE<!--<$[æ ‡é¢˜]>end-->
      content: <!--ZJEG_RSS.content.begin-->...<!--ZJEG_RSS.content.end-->
é    N)ÚdatetimeÚtimezoneÚ	timedelta)Údisable_warningsÚ
exceptions)Úunquoteu   é‡‘æºªåŽ¿-å…¬ç¤ºå…¬å‘Šz0https://www.jinxi.gov.cn/col/col10560/index.htmlzhttps://www.jinxi.gov.cnÚDB_PATHz/root/search.dbiG  )Údaysz%Y-%m-%dz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36é   Ú65057Ú10560i?
  c                 ó  — t        |«      D ]D  }	 t        j                  | t        dd¬«      }d|_        |j
                  dk(  r|j                  c S ŒF y # t        $ r'}||dz
  k  rt        j                  d«       Y d }~Œsd }~ww xY w)Né   F)ÚheadersÚtimeoutÚverifyzutf-8éÈ   é   é   )
ÚrangeÚrequestsÚgetÚHEADERSÚencodingÚstatus_codeÚtextÚ	ExceptionÚtimeÚsleep)ÚurlÚ	max_retryÚattÚrÚes        ú#/root/gov_crawler/crawl_jinxi_gg.pyÚfetchr&      s   € Ü�YÓò ˆð	Ü—‘˜S¬'¸2ÀeÔLˆAØ ˆAŒJØ�}‰} Ò#Ø—v‘v’ð $ð	ð øô ò 	Ø�Y ‘]Ò"Ü—
‘
˜1”ÿøð	ús   �>AÁ	BÁA?Á?Bc           	      ó4  — g }t        j                  d| t         j                  «      D �]l  }|j                  d«      }d|vrŒt        j                  d|t         j                  «      D �]*  }|j                  d«      }t        j                  d|«      }t        j                  d|t         j                  «      }|sŒS|sŒVt
        dz   |j                  d«      z   }t        j                  dd	|j                  d«      «      j                  «       }	t        j                  d
|«      }
d	}|
rOt        |
j                  d«      «      t        |
j                  d«      «      }}|
j                  d«      › d|d›d|d›�}|	s�Œ|s�Œ|j                  |	||dœ«       �Œ- �Œo |S )z9Parse records from the embedded XML datastore in the pagez/<script[^>]*type="text/xml"[^>]*>(.*?)</script>r   z<recordset>z<record>(.*?)</record>zhref=[\'"]/(art/[^\'"]+)[\'"]z<a[^>]*>(.*?)</a>ú/ú<[^>]+>Ú z/art/(\d{4})/(\d+)/(\d+)/r   é   ú-Ú02d)Útitler    Úpub_date)
ÚreÚfinditerÚSÚgroupÚsearchÚBASEÚsubÚstripÚintÚappend)ÚhtmlÚrecordsÚmÚscriptÚrecÚrec_htmlÚa_mÚtitle_mr    r.   Údate_mÚdate_strÚm_Úd_s                 r%   Úparse_records_from_pagerF   ,   sZ  € à€Gä�[‰[ÐKÈTÔSU×SWÑSWÓXó WˆØ—‘˜“ˆØ Ñ&ØÜ—;‘;Ð8¸&Ä"Ç$Á$ÓGó 	WˆCØ—y‘y “|ˆHä—)‘)Ð<¸hÓGˆCÜ—i‘iÐ 4°hÄÇÁÓEˆGÚ’wÜ˜S‘j 3§9¡9¨Q£<Ñ/�ÜŸ™˜z¨2¨w¯}©}¸QÓ/?Ó@×FÑFÓH�äŸ™Ð#?ÀÓJ�Ø�ÙÜ  §¡¨a£Ó1´3°v·|±|ÀA³Ó3G˜�BØ"(§,¡,¨q£/Ð!2°!°B°s°8¸1¸RÀ¸HÐE�HÛ›SØ—N‘N¨U¸3ÈHÑ#UÖVò	Wð	Wð( €Nó    c                 óÔ   — t        j                  d| t         j                  «      }|rAt        j                  d|j                  d«      «      }|rt	        |j                  d«      «      S y)z0Extract the next page URL from the XML datastorez<nextgroup>(.*?)</nextgroup>zhref="([^"]+)"r   N)r0   r4   r2   r3   r   )r:   r<   Úhref_ms      r%   Úextract_nextpage_urlrJ   G   sN   € ä
�	‰	Ð1°4¼¿¹Ó>€AÙÜ—‘Ð,¨a¯g©g°a«jÓ9ˆÙÜ˜6Ÿ<™<¨›?Ó+Ð+ØrG   c                 óh  ‡— t        | «      }|syd}t        j                  d|«      }|r|j                  d«      j	                  «       }|s[t        j                  d|t        j
                  «      }|r4t        j                  dd|j                  d«      «      j	                  «       }|s7t        j                  d|«      }|r|j                  d«      j	                  «       }t        j                  dd|«      j	                  «       }d}t        j                  d	|t        j
                  «      }|r|j                  d«      j	                  «       }|sFt        j                  d
|t        j
                  «      }|r|j                  d«      j	                  «       }t        j                  dd|t        j
                  ¬«      }t        j                  dd|t        j
                  ¬«      }d}t        j                  d|«      D ]l  }|j                  d«      j                  dd«      }|t        d|j                  «       dz
  «      |j                  «       dz    Št        ˆfd„dD «       «      sŒj|} n |s…t        j                  d|«      D ]l  }|t        d|j                  «       dz
  «      |j                  «       dz    Šd‰v sd‰j                  «       v sŒK|j                  d«      j                  dd«      } n |s=t        j                  d|«      D ]$  }|j                  d«      j                  dd«      } n |||fS )z-Extract full title + content from detail page)r*   r*   r*   uK   <!--<\$\[(?:æ ‡é¢˜|title)\]>begin-->(.*?)<!--<\$\[(?:æ ‡é¢˜|title)\]>end-->r   z*class="[^"]*con-title[^"]*"[^>]*>(.*?)</p>r)   z<title>(.*?)</title>zbegin-->|end-->zA<!--ZJEG_RSS\.content\.begin-->(.*?)<!--ZJEG_RSS\.content\.end-->z#<div[^>]*id="zoom"[^>]*>(.*?)</div>z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z(\d{4}[-/]\d{2}[-/]\d{2})r(   r,   r   éP   r   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w)N© )Ú.0ÚkwÚctxs     €r%   ú	<genexpr>zfetch_detail.<locals>.<genexpr>w   s   øè ø€ Òe˜Rˆr�SŒyÑeùs   ƒ)Údateu   æ—¶é—´u   å�‘å¸ƒu   æ—¥æœŸÚpublishu   ç”Ÿæˆ�æ—¥æœŸé   é
   Úsp_timer   )r&   r0   r4   r3   r7   r2   r6   r1   ÚreplaceÚmaxÚstartÚendÚanyÚlower)	r    r:   r.   r<   ÚcontentrC   ÚdÚd_cleanrR   s	           @r%   Úfetch_detailrb   Q   s¬  ø€ ä�‹:€DÙØð €EÜ
�	‰	Ð`ÐbfÓg€AÙØ—‘˜“
× Ñ Ó"ˆÙÜ�I‰IÐCÀTÌ2Ï4É4ÓPˆÙÜ—F‘F˜: r¨1¯7©7°1«:Ó6×<Ñ<Ó>ˆEÙÜ�I‰IÐ-¨tÓ4ˆÙØ—G‘G˜A“J×$Ñ$Ó&ˆEÜ�F‰FÐ% r¨5Ó1×7Ñ7Ó9€Eð €GÜ
�	‰	ÐVÐX\Ô^`×^bÑ^bÓc€AÙØ—'‘'˜!“*×"Ñ"Ó$ˆÙÜ�I‰IÐ<¸dÄBÇDÁDÓIˆÙØ—g‘g˜a“j×&Ñ&Ó(ˆGÜ�f‰fÐ1°2°wÄbÇdÁdÔK€GÜ�f‰fÐ/°°WÄBÇDÁDÔI€Gð €HÜ�[‰[Ð5°tÓ<ò ˆØ—'‘'˜!“*×$Ñ$ S¨#Ó.ˆØ”3�q˜Ÿ™› 2™Ó& q§u¡u£w¨r¡zÐ2ˆÜÓeÐ#dÔeÕeØˆHÙðñ Ü—‘Ð9¸4Ó@ò 	ˆAØ”s˜1˜QŸW™W›Y r™\Ó*¨1¯5©5«7°2©:Ð6ˆCØ˜CÑ 6¨S¯Y©Y«[Ò#8ØŸ7™7 1›:×-Ñ-¨c°3Ó7�Ùð		ñ
 Ü—‘Ð9¸4Ó@ò 	ˆAØ—w‘w˜q“z×)Ñ)¨#¨sÓ3ˆHÙð	ð �'˜8Ð#Ð#rG   c                  óØ  — dt         j                  v } | rdnd}t        dt        › d|› d�d¬«       t	        t
        «      }|st        d	«       y t        |«      }t        d
t        |«      › d�d¬«       d}t        |«      }|re|dz  }t	        |«      }|snRt        |«      }|snD|j                  |«       t        |«      }|dz  dk(  rt        d|› dt        |«      › d�d¬«       |rŒet        dt        |«      › d|› d�d¬«       |D �cg c]  }|d   r|d   t        k\  sŒ|‘Œ }}t        dt        |«      › d�d¬«       |st        d«       y | r|d d }t        dt        |«      › d�d¬«       | rd nt        j                  t        «      }	|	r|	j                  «       nd }
d}d}t        |«      D ]î  \  }}t        d|dz   › dt        |«      › d|d   d d › d �d!d¬"«       t!        |d#   «      \  }}}|s|d   }|s|d   }| r!t        d$|d d › d%t        |«      › d&|› �«       Œs	 |
j#                  d't        |d d( |d#   ||d!d)f«       |
j$                  dkD  r|dz  }t        t        |«      › d*�«       nt        d+«       |dz  }|d-z  dk(  sŒÜ|	sŒß|	j)                  «        Œð |	r¡|	j)                  «        |	j#                  d.t        f«       |	j)                  «        |	j#                  d/t        f«      }|j+                  «       d   }|	j-                  «        t        d0d¬«       t        d1|› d2�d¬«       t        d3|› d2�d¬«       y y c c}w # t&        $ r}t        d,|› �«       Y d }~Œèd }~ww xY w)4Nz--testÚTESTÚFULLz
=== z (z) ===T)Úflushz  [FAIL] Cannot fetch list pagez
  Page 1: z recordsr   r   r   z  Page z: z totalz	  Total: z
 records, z pagesr/   z  Within 3yr: z itemsz  No items to crawlr+   z  TEST mode: z  [r(   z] r.   é(   z... r*   )r\   rf   r    ztitle=z	 content=zB date=zwINSERT OR IGNORE INTO gov_raw (site_name, title, page_url, content, publish_date, summary, tags) VALUES (?,?,?,?,?,?,?)iô  u   å…¬ç¤ºå…¬å‘ŠÚBÚskipz
DB error: é2   z½INSERT INTO gov_search(rowid, title, site_name, summary) SELECT r.rowid, r.title, r.site_name, r.summary FROM gov_raw r WHERE r.rowid NOT IN (SELECT rowid FROM gov_search) AND r.site_name=?z.SELECT COUNT(*) FROM gov_raw WHERE site_name=?u   
=== å®Œæˆ� ===u
     æ–°å¢ž: u   æ�¡u
     ç´¯è®¡: )ÚsysÚargvÚprintÚ	SITE_NAMEr&   ÚLIST_URLrF   ÚlenrJ   ÚextendÚCUTOFFÚsqlite3Úconnectr	   ÚcursorÚ	enumeraterb   ÚexecuteÚrowcountr   ÚcommitÚfetchoneÚclose)ÚtestÚmoder:   Ú	all_itemsÚpageÚnext_urlr;   ÚitÚitemsÚconnru   Ú	total_newÚdoneÚiÚitemr.   r_   r/   r$   ÚcÚcnts                        r%   ÚmainrŠ   ˆ   s›  € Ø”s—x‘xÐ€DÙ‰6˜v€DÜ	ˆF”9�+˜R ˜v UÐ
+°4Õ8ô ”‹?€DÙÜÐ/Ô0Øô (¨Ó-€IÜ	ˆJ”s˜9“~Ð& hÐ
/°tÕ<ð €DÜ# DÓ)€HÙ
Ø�‰	ˆÜ�X‹ˆÙØÜ)¨$Ó/ˆÙØØ×Ñ˜Ô!Ü'¨Ó-ˆØ�"‰9˜Š>Ü�G˜D˜6 ¤C¨	£NÐ#3°6Ð:À$ÕGò ô 
ˆI”c˜)“nÐ% Z°¨v°VÐ
<ÀDÕIð $ÖV�B¨2¨jª>¸RÀ
¹^ÌvÓ=UŠRÐV€EÐVÜ	ˆNœ3˜u›:˜, fÐ
-°TÕ:áÜÐ#Ô$ØáØ�b�q�	ˆÜ�œc %›j˜\¨Ð0¸Õ=ñ ‰4œWŸ_™_¬WÓ5€DÙ"ˆT�[‰[Œ]¨€FØ€IØ€Dä˜UÓ#ò ‰ˆˆ4Ü��A�a‘C�5˜œ#˜e›*˜ R¨¨W©°c°rÐ(:Ð';¸4Ð@ÀbÐPTÕUÜ#/°°U±Ó#<Ñ ˆˆw˜ÙØ˜‘MˆEÙØ˜JÑ'ˆHáÜ�F˜5  "˜:˜, i´°G³¨~¸WÀXÀJÐOÔPØð	$Ø�N‰Nð JÜ˜E $ 3˜K¨¨e©°g¸xÈÈ^Ð\ôð �‰ Ò"Ø˜Q‘�	Üœ˜W›˜ aÐ(Õ)ä�f”ð 	�‰	ˆØ�"‰9˜‹>šdØ�K‰K�Mð7ñ: Ø�‰ŒØ�‰ðcô ˆLô		
ð 	�‰ŒØ�L‰LÐIÌIÈ<ÓXˆØ�j‰j‹l˜1‰oˆØ�
‰
ŒÜÐ ¨Õ.Ü�
˜9˜+ SÐ)°Õ6Ü�
˜3˜%˜sÐ#¨4Ö0ð ùò] WøôN ò 	$Ü�J˜q˜cÐ"×#Ñ#ûð	$ús%   ÄMÄMÈ"AMÍ	M)ÍM$Í$M)Ú__main__)r+   )&Ú__doc__Úosrs   r0   r   r   rk   Újsonr   r   r   Úurllib3r   r   Úurllib.parser   ÚInsecureRequestWarningrn   ro   r5   Úenvironr   r	   ÚnowÚutcÚstrftimerr   r   ÚMAX_WORKERSÚUNIT_IDÚ	COLUMN_IDÚTOTAL_RECORDSr&   rF   rJ   rb   rŠ   Ú__name__rO   rG   r%   ú<module>r›      sÐ   ðñ÷ 2× 1× 1Ó 1ß 2Ñ 2ß 0Ý  Ù �×2Ñ2Ô 3à$€	Ø=€Ø!€Ø
�*‰*�.‰.˜Ð$5Ó
6€Ø
ˆ(�,‰,�x—|‘|Ó
$¡y°eÔ'<Ñ
<×	FÑ	FÀzÓ	R€ØÐWÐ
X€Ø€ð €Ø€	Ø€ó
òò6ò4$òn^1ðB ˆzÒÙ…Fð rG   