Ë
    ¸¬ujh  ã                   óN  — 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Zd dl Z d dl	Z	d dl
m
Z
mZ d dlmZ d dlZ eej                   «      dkD  r2ej                   d   j#                  «       r eej                   d   «      ndZe� ed ee«      z   «       dZdZ e
j0                  «        ed¬	«      z
  j3                  d
«      ZdZdZ e j:                  dd«      Z e	j>                  «       Z de _!        e	jD                  e _#        dd„Z$d„ Z%d„ Z&d„ Z'd„ Z(d„ Z)e*dk(  r e)«        yy)é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoupé   z[AutoPg] max_pages=zhttps://www.ry.gov.cn/ryzx/gsggu   æ±�é˜³åŽ¿æ”¿åºœ-å…¬ç¤ºå…¬å‘ŠiG  )Údaysz%Y-%m-%dé7   g      ð?Ú	SEARCH_DBz/root/search.dbFc                 óÖ  — t        |«      D ]x  }	 t        j                  j                  | ddi¬«      }t        j                  j	                  |t
        d¬«      5 }|j                  «       j                  dd¬«      cd d d «       c S  y # 1 sw Y   nxY wŒ‰# t        $ rJ}||d	z
  k  r$t        j                  t        |d	z   z  «       Y d }~Œ¾t        d
| › d|› �d¬«       Y d }~ y d }~ww xY w)Nz
User-AgentzBMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36)Úheadersé   )ÚcontextÚtimeoutzutf-8Úreplace)Úerrorsr   z  [WARN] fetch failed: ú - T©Úflush)ÚrangeÚurllibÚrequestÚRequestÚurlopenÚctxÚreadÚdecodeÚ	ExceptionÚtimeÚsleepÚDELAYÚprint)ÚurlÚretriesÚiÚreqÚrÚes         ú/root/gov_crawler/crawl_ry.pyÚfetchr(      sæ   € Ü�7‹^ò 
ˆð		Ü—.‘.×(Ñ(¨°|ð  FJð  7KÐ(ó  LˆCÜ—‘×'Ñ'¨´SÀ"Ð'ÓEð BÈØ—v‘v“x—‘ w°y�ÓA÷Bó Bñ
÷Bð Búð Bøäò 	Ø�7˜Q‘;ŠÜ—
‘
œ5 A a¡C™=Ô)ÜÜÐ+¨C¨5°°A°3Ð7¸tÕDÝûð	ús6   �A	BÁ!BÁ:	BÂB	ÂBÂ	C(Â'C#Ã
C#Ã#C(c                 óP  — t        | d«      }g }|j                  d«      D �]  }|j                  d«      }t        |«      dk\  sŒ$|d   j	                  d«      }|d   j	                  d«      }|sŒO|j                  d	«      sŒa|sŒd|d	   j                  «       }|j                  d
«      rd|z   }n|j                  d«      rd|z   }|j                  d|j                  d¬«      «      }|j                  d¬«      }	t        j                  d|	«      sŒï|j                  |||	f«       �Œ |S )z)Extract (url, title, date) from list pageúhtml.parserztable trÚtdé   r   Úar   ÚspanÚhrefú/úhttps://www.ry.gov.cnú//úhttps:ÚtitleT©Ústripz\d{4}-\d{2}-\d{2})r   ÚselectÚfind_allÚlenÚfindÚgetr6   Ú
startswithÚget_textÚreÚmatchÚappend)
ÚhtmlÚsoupÚitemsÚtrÚtdsr-   Ú	date_spanr!   r4   Údates
             r'   Ú
parse_listrH   (   s	  € ä˜˜}Ó-€DØ€EØ�k‰k˜*Ó%ó 5ˆØ�k‰k˜$ÓˆÜˆs‹8�q‹=Ø�A‘—‘˜CÓ ˆAØ˜A™Ÿ™ FÓ+ˆIÚ�Q—U‘U˜6•]¢yØ˜‘i—o‘oÓ'�Ø—>‘> #Ô&Ø1°CÑ7‘CØ—^‘^ DÔ)Ø" S™.�CØŸ™˜g q§z¡z¸ zÓ'=Ó>�Ø ×)Ñ)°Ð)Ó5�Ü—8‘8Ð0°$Õ7Ø—L‘L # u¨dÐ!3Ö4ð5ð €Ló    c                 óØ  — t        | d«      }|j                  d«      }|r|j                  d¬«      nd}|j                  dt	        j
                  d«      ¬«      }d}|r7t	        j                  d	|j                  «       «      }|r|j                  d
«      }|j                  dd¬«      }|r0|j                  d¬«      j                  dd«      j                  «       nd}	|j                  d«      }
d}|
rt        |
«      }g }|j                  d«      }|r·|j                  d«      D ]£  }|j                  dd«      }|j                  d¬«      }|sŒ*|sŒ-|j                  d«      rd|z   }nH|j                  d«      rd|z   }n1|j                  d«      s t        j                  j!                  ||«      }|j#                  d|› d|› d�«       Œ¥ |}|r|ddj%                  |«      z   dz   z  }|||	|fS )z Extract content from detail pager*   z.content_top h3Tr5   Ú r.   u   æ—¥æœŸ)Ústringz(\d{4}-\d{2}-\d{2})r   Útest)Úidõ	   æ�¥æº�ï¼šz.mailbox_content_wznrsz.attachmentBoxr-   r/   r0   r1   r2   r3   Úhttpz	<a href="z">z</a>z<div class="attachments">z<br/>z</div>)r   Ú
select_oner=   r:   r>   ÚcompileÚsearchÚgroupr   r6   Ústrr8   r;   r<   r   ÚparseÚurljoinr@   Újoin)rA   r!   rB   Útitle_elr4   Údate_elrG   ÚmÚ	source_elÚsourceÚcontent_divÚcontentÚattachmentsÚ
attach_divr-   r/   ÚnameÚfull_contents                     r'   Úparse_detailrd   =   sæ  € ä˜˜}Ó-€Dð �‰Ð0Ó1€HÙ-5ˆH×Ñ DÐÔ)¸2€Eð �i‰i˜¤r§z¡z°)Ó'<ˆiÓ=€GØ€DÙÜ�I‰IÐ,¨g×.>Ñ.>Ó.@ÓAˆÙØ—7‘7˜1“:ˆDð —	‘	˜& V�	Ó,€IÙPYˆY×Ñ dÐÓ+×3Ñ3°KÀÓD×JÑJÔLÐ_a€Fð —/‘/Ð":Ó;€KØ€GÙÜ�kÓ"ˆð €KØ—‘Ð!1Ó2€JÙØ×$Ñ$ SÓ)ò 
	CˆAØ—5‘5˜ Ó$ˆDØ—:‘: D�:Ó)ˆDÚšØ—?‘? 3Ô'Ø2°TÑ9‘DØ—_‘_ TÔ*Ø# d™?‘DØŸ™¨Ô0Ü!Ÿ<™<×/Ñ/°°TÓ:�DØ×"Ñ" Y¨t¨f°B°t°f¸DÐ#AÕBð
	Cð €LÙØÐ3°g·l±lÀ;Ó6OÑOÐRZÑZÑZˆà�$˜ Ð,Ð,rI   c                 óÐ  — t        j                  t        «      }|j                  «       }d}| D ]l  \  }}}}}	 |rd|› �nd}	|j	                  d|||t
        ||	|f«       |j                  dkD  r|dz  }n(|j	                  d||f«       |j                  dkD  r|dz  }Œn |j                  «        |j                  «        |S # t        $ r}
t        d|› d|
› �d	¬
«       Y d }
~
Œ²d }
~
ww xY w)Nr   rO   rK   zÂ
                INSERT OR IGNORE INTO gov_raw 
                (page_url, title, publish_date, site_name, source_url, summary, content)
                VALUES (?, ?, ?, ?, ?, ?, ?)
            r   zQUPDATE gov_raw SET content=? WHERE page_url=? AND (content IS NULL OR content='')z  [ERROR] DB insert: r   Tr   )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚ	SITE_NAMEÚrowcountr   r    ÚcommitÚclose)rC   ÚconnÚcÚinsertedr!   r4   rG   r]   r_   Úsummaryr&   s              r'   Ú
save_to_dbrs   m   s  € Ü�?‰?œ7Ó#€DØ�‰‹€AØ€HØ-2ò CÑ)ˆˆU�D˜& 'ð	Cá.4˜	 & Ñ*¸"ˆGØ�I‰Ið ð �u˜d¤I¨s°G¸WÐEô	Gð
 �z‰z˜AŠ~Ø˜A‘‘ð —	‘	ÐmØ! 3˜ô)à—:‘: ’>Ø ‘M�Høð!Cð& 	‡K�K„MØ‡J�J„LØ€Oøô	 ò 	CÜÐ)¨#¨¨c°!°Ð5¸T×BÒBûð	Cús   ¸A#B?Â?	C%ÃC Ã C%c                  óÈ   — t        j                  t        «      } | j                  «       }	 |j	                  d«       | j                  «        | j                  «        y#  Y Œ%xY w)z)Rebuild FTS index for this site's recordsz‡
            INSERT INTO gov_search(gov_search, rowid, title, site_name, summary)
            VALUES('rebuild', 0, '', '', '')
        N)rf   rg   rh   ri   rj   rm   rn   )ro   rp   s     r'   Úrebuild_ftsru   ˆ   sO   € ä�?‰?œ7Ó#€DØ�‰‹€AðØ	�	‰	ð ô 	ð 	‡K�K„MØ‡J�J…LøðÙús   «A ÁA!c                  óV  — t        dt        › �d¬«       g } t        t        dt        xs d«      «      D �]8  }|dk(  r
t
        › d�}nt
        › d|› d�}t        d	|d
z   › d|› �d¬«       t        |«      }|st        dd¬«       ŒPt        |«      }|st        dd¬«        nÐt        t        d„ |D «       «      d¬«      }|rt        d„ |D «       «      nd}|rt        d„ |D «       «      nd}t        dt        |«      › d|› d|› �d¬«       |D ]$  \  }}}	|	t        k\  sŒ| j                  |||	f«       Œ& |t        k  rt        d|› dt        › d�d¬«        nt        j                  t        «       �Œ; t        dt        | «      › d�d¬«       g }
t!        | d
«      D ]Ï  \  }\  }}}	t        d|› dt        | «      › d|d d › d �d¬«       t        |«      }|s$t        d!d¬«       |
j                  |||	d"d"f«       Œ^t#        ||«      \  }}}}|xs |}|xs |	}|rt        |«      nd}t        d#|› d$|xs d%› �d¬«       |
j                  |||||f«       t        j                  t        «       ŒÑ t%        |
«      }t        d&|› d'�d¬«       t'        «        t        d(d¬«       t        d)d¬«       y )*Nu1   [ry] æ±�é˜³åŽ¿å…¬ç¤ºå…¬å‘Šçˆ¬è™« - æˆªæ­¢æ—¥æœŸ: Tr   é.   r   z/index.htmlz/index_z.htmlu   [ry] åˆ—è¡¨é¡µ r   z/46: u     [SKIP] æ— æ³•èŽ·å�–åˆ—è¡¨é¡µu     [SKIP] ç©ºåˆ—è¡¨c              3   ó(   K  — | ]
  \  }}}|–— Œ y ­w©N© ©Ú.0Ú_Úds      r'   ú	<genexpr>zmain.<locals>.<genexpr>­   s   è ø€ Ò0¡  1 Qœ1Ñ0ùó   ‚)Úreversec              3   ó(   K  — | ]
  \  }}}|–— Œ y ­wry   rz   r{   s      r'   r   zmain.<locals>.<genexpr>®   ó   è ø€ Ò*™5˜1˜Q˜q”QÑ*ùr€   z
9999-99-99c              3   ó(   K  — | ]
  \  }}}|–— Œ y ­wry   rz   r{   s      r'   r   zmain.<locals>.<genexpr>¯   rƒ   r€   z
0000-00-00u     â†’ u   æ�¡, æ—¥æœŸèŒƒå›´ z ~ u     [END] é�‡åˆ° u
    < æˆªæ­¢ u   ï¼Œå�œæ­¢åˆ—è¡¨ç¿»é¡µu   
[ry] å…±æ”¶é›† u    æ�¡å¾…æŠ“å�–è¯¦æƒ…u   [ry] è¯¦æƒ… r0   z: é   z...u     [SKIP] è¯¦æƒ…é¡µèŽ·å�–å¤±è´¥rK   u     â†’ æ­£æ–‡ u   å­—, æ�¥æº�: u   (æ— )u   
[ry] âœ… å…¥åº“ u    æ�¡u   [ry] âœ… FTSç´¢å¼•å·²é‡�å»ºu   [ry] âœ… å®Œæˆ�)r    ÚCUTOFF_DATEr   ÚminÚ_MAX_PGÚBASE_URLr(   rH   ÚsortedÚsetÚmaxr9   r@   r   r   r   Ú	enumeraterd   rs   ru   )Ú	all_itemsÚpager!   rA   rC   ÚdatesÚoldestÚnewestr4   rG   Údetailedr#   Údetail_titleÚdetail_dater]   r_   Úfinal_titleÚ
final_dateÚcontent_lenrq   s                       r'   Úmainr™   –   sÍ  € Ü	Ð=¼k¸]Ð
KÐSWÕXà€Iä”c˜"œgšm¨Ó,Ó-ó ˆØ�1Š9Ü�J˜kÐ*‰Cä�J˜g d V¨5Ð1ˆCä�  Q¡˜x u¨S¨EÐ2¸$Õ?Ü�S‹zˆÙÜÐ2¸4Õ@Øä˜4Ó ˆÙÜÐ&¨tÕ4Ùô ”sÑ0¨%Ô0Ó0¸$Ô?ˆÙ.3”Ñ* EÔ*Ô*¸ˆÙ.3”Ñ* EÔ*Ô*¸ˆÜ�”s˜5“z�lÐ"4°V°H¸CÀ¸xÐHÐPTÕUà %ò 	5ÑˆC�˜Ø”{Ó"Ø× Ñ  # u¨dÐ!3Õ4ð	5ð ”KÒÜ�O F 8¨:´k°]ÐBWÐXÐ`dÕeÙä�
‰
”5Öð?ôB 
Ðœc )›nÐ-Ð-@Ð
AÈÕNð €HÜ!*¨9°aÓ!8ò ÑˆÑˆC�˜Ü�˜Q˜C˜q¤ Y£Ð 0°°5¸¸"°:°,¸cÐBÈ$ÕOÜ�S‹zˆÙÜÐ2¸4Õ@Ø�O‰O˜S %¨¨r°2Ð6Ô7Øä5AÀ$ÈÓ5LÑ2ˆ�k 6¨7Ø"Ò+ eˆØ Ò( Dˆ
á&-”c˜'”l°1ˆÜ�˜k˜]¨-¸Ò8IÀ'Ð7JÐKÐSWÕXØ�‰˜˜k¨:°v¸wÐGÔHÜ�
‰
”5Õðô$ ˜(Ó#€HÜ	Ð˜x˜j¨Ð
-°TÕ:ô „MÜ	Ð'°Õ5ä	ˆO DÖ)rI   Ú__main__)é   )+Úosr>   Úsysr   ÚjsonÚurllib.requestr   Úurllib.errorrf   Ússlr   r   Úbs4r   Ú_SYSr9   ÚargvÚisdigitÚintrˆ   r    rU   r‰   rk   ÚnowÚstrftimer†   Ú	MAX_PAGESr   Úgetenvrh   Úcreate_default_contextr   Úcheck_hostnameÚ	CERT_NONEÚverify_moder(   rH   rd   rs   ru   r™   Ú__name__rz   rI   r'   ú<module>r°      s  ðã 	Ø -ß J× J× J× JÓ Jß (Ý ó
 Ù" 4§9¡9›~°Ò1°d·i±iÀ±l×6JÑ6JÔ6L‰#ˆd�i‰i˜‰lÔ
ÐRV€Ø
ÐÙ	Ð
¡# g£,Ñ
.Ô/à,€Ø*€	Øˆx�|‰|‹~¡	¨uÔ 5Ñ5×?Ñ?À
ÓK€Ø€	Ø€à
ˆ"�)‰)�KÐ!2Ó
3€Ø €c× Ñ Ó"€Ø€Ô Ø—-‘-€„óòò*.-ò`ò6òC*ðJ ˆzÒÙ…Fð rI   