Ë
    ¸¬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	Z	ddl
m
Z
 dZdZdddd	d
dddœZdd„Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)uÀ   é€šå·žåŒºäººæ°‘æ”¿åºœ - å…¬å‘Šå…¬ç¤º çˆ¬è™«
ç«™ç‚¹: http://www.tongzhou.gov.cn/tzqrmzf/gsgg/gsgg.html
CMS: truecmsï¼Œå­�æ �ç›®å…±7ä¸ªï¼Œæ¯�é¡µ30æ�¡åµŒå…¥é¡µé�¢ï¼Œclient-sideåˆ†é¡µ(3é¡µ*10æ�¡)
é    N)Údatetimez/root/search.dbzhttp://www.tongzhou.gov.cnu   é‡�è¦�å…¬ç¤ºu   ä¸¤ä¼šå…¬å‘Šu   æ‹›è�˜æ‹›è€ƒu   å®¡æ‰¹å…¬ç¤ºu   è§„åˆ’å…¬ç¤ºu   å®¡è®¡å…¬ç¤ºu   å…¶ä»–å…¬å‘Š)ÚzygsÚlhggÚzpzkÚspgsÚghgsÚsjgsÚqtggc                 ó¨  — t        |«      D ]i  }	 t        j                  j                  | ddi¬«      }t        j                  j	                  |d¬«      }|j                  «       j                  dd¬«      c S  y # t        $ rO}||d	z
  k  rt        j                  d
«       n't        d| › d|› �t        j                  ¬«       Y d }~ y Y d }~ŒÀd }~ww xY w)Nz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36)Úheadersé   )Útimeoutzutf-8Úreplace)Úerrorsé   é   z
  [ERROR] z: )Úfile)ÚrangeÚurllibÚrequestÚRequestÚurlopenÚreadÚdecodeÚ	ExceptionÚtimeÚsleepÚprintÚsysÚstderr)ÚurlÚretriesÚiÚreqÚrespÚes         ú#/root/gov_crawler/crawl_tongzhou.pyÚfetchr(      sÀ   € Ü�7‹^ò ˆð	Ü—.‘.×(Ñ(¨ØÐ\ð7Ð(ó ˆCô —>‘>×)Ñ)¨#°rÐ)Ó:ˆDØ—9‘9“;×%Ñ% g°iÐ%Ó@Ò@ñøô ò 	Ø�7˜Q‘;ŠÜ—
‘
˜1•ä˜
 3 % r¨!¨Ð-´C·J±JÕ?Ýô ûð	ús   �A$A9Á9	CÂ?CÃCc                 ón  — g }t        j                  d| t         j                  «      }|s|S |j                  d«      }t        j                  d|t         j                  «      }|D ]Î  }t        j                  d|«      }t        j
                  dd|«      j                  «       }t        j                  d|«      }	t        j
                  dd|«      j                  «       }
|sŒ||j                  d«      }|j                  d	«      s	t        |z   }|j                  ||
|	r|	j                  d«      ndd
œ«       ŒÐ |S )z"Extract articles from initData divzid="initData"[^>]*>(.*?)</div>r   z<ul class="list-ul">(.*?)</ul>zhref=["\']([^"\']+)["\']ú<[^>]+>Ú z(\d{4}-\d{2}-\d{2})z\d{4}-\d{2}-\d{2}Úhttp)Úpage_urlÚtitleÚdate)
ÚreÚsearchÚDOTALLÚgroupÚfindallÚsubÚstripÚ
startswithÚBASE_URLÚappend)ÚhtmlÚsub_nameÚitemsÚinitÚcontentÚulsÚulÚhrefÚtxt_allÚdate_mr.   r-   s               r'   Ú
parse_listrD   $   s  € à€EÜ�9‰9Ð6¸¼b¿i¹iÓH€DÙØˆØ�j‰j˜‹m€GÜ
�*‰*Ð6¸ÄÇÁÓ
K€CØò ˆÜ�y‰yÐ4°bÓ9ˆÜ—&‘&˜ R¨Ó,×2Ñ2Ó4ˆÜ—‘Ð1°7Ó;ˆÜ—‘Ð+¨R°Ó9×?Ñ?ÓAˆÚØ—z‘z !“}ˆHØ×&Ñ& vÔ.Ü# hÑ.�Ø�L‰LØ$ØÙ+1˜Ÿ™ Qœ°rñõ ðð €Ló    c                 óÎ  ‡!— t        j                  d| t         j                  «      }|r/|j                  d«      j	                  dd«      j                  «       nd}t        j                  d| «      }d}|rH|j                  d«      j                  «       }t        j                  d|«      }|r|j                  d«      }d}t        j                  d| t         j                  «      }	|	rW|	j                  d«      }
t        j                  d|
t         j                  «      }|r|j                  d«      j                  «       }|s~t        j                  d	| t         j                  «      }|rW|j                  d«      }t        j                  d
|t         j                  «      }|r|j                  d«      j                  «       }g }t        j                  dd|t         j                  ¬«      }t        j                  d|t         j                  «      D ]‘  }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      j                  «       }|sŒYt        j                  dd|«      j                  «       }|sŒ�|j                  |«       Œ“ t        j                  d|t         j                  «      D ]  }|j                  t        |«      «       Œ g }t        j                  d| t         j                  «      D ]>  }|j                  d«      }|j                  d«      s	t        |z   }|j                  |«       Œ@ t        j                  d| t         j                  «      D ]>  }|j                  d«      }|j                  d«      s	t        |z   }|j                  |«       Œ@ g }t        j                  d| t         j                  «      D ]�  }|j                  d«      Š!t        ˆ!fd„dD «       «      rŒ)‰!j                  d«      s	t        ‰!z   Š!t        j                  d|j                  d«      «      }|r|j                  d«      nd}|j                  ‰!|dœ«       Œ’ dj                  |«      }|r"|D ]  }|d   r|d   nd}|d|› d|d   › d �z  }Œ |�rg }|D ]ä  }|j!                  d!«      d"   }|j                  d#«      sd#|v rQt        j                  d$t        j"                  |«      z   d%z   | «      } | rp| j                  d«      j                  «       }nPt        j                  d$t        j"                  |«      z   d&z   | «      } | r| j                  d«      j                  «       }|j                  d'|› d|› d �«       Œæ |d(d)j                  |«      z   z  }|xs$ |j!                  d!«      d"   j	                  d*d«      |||t%        j&                  |d+¬,«      d-œS ).z Extract content from detail pagez<title>(.*?)</title>r   u   -å�—é€šå¸‚é€šå·žåŒºäººæ°‘æ”¿åºœr+   u4   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*<span[^>]*>\s*([^<]+)\s*</span>z(\d{4}-\d{1,2}-\d{1,2})z6class="nr cf">(.*?)</div>\s*<div[^>]*class="[^"]*modalz!class="page-con"[^>]*>(.*?)</div>zclass="nr cf">(.*?)</div>zA</div>\s*</div>\s*<div[^>]*class="[^"]*page-con"[^>]*>(.*?)</div>z<table[^>]*>.*?</table>)Úflagsz<p[^>]*>(.*?)</p>z
<img[^>]*>z<a[^>]*>.*?</a>r*   z;href=["\']([^"\']+\.(?:pdf|doc|docx|xls|xlsx|zip|rar))["\']r,   zs<a[^>]+href=["\']([^"\']*download\.do[^"\']*)["\'][^>]*title=["\']([^"\']+\.(?:pdf|doc|docx|xls|xlsx|zip|rar))["\']z9<img[^>]+src=["\']([^"\']+(?:jpg|jpeg|png|gif|webp))["\']c              3   óB   •K  — | ]  }|‰j                  «       v –— Œ y ­w)N)Úlower)Ú.0ÚxÚimg_urls     €r'   ú	<genexpr>zparse_detail.<locals>.<genexpr>„   s   øè ø€ Ò[¨ˆq�G—M‘M“OÔ#Ñ[ùs   ƒ)ÚiconÚfiletypeÚewmÚlogoÚbannerzalt=["\']([^"\']*)["\']r   )ÚsrcÚaltz

rT   u   å›¾ç‰‡z

![z](rS   ú)ú/éÿÿÿÿzdownload.doz
href=["\']z#["\'][^>]*title=["\']([^"\']+)["\']z["\'][^>]*>([^<]+)<z- [u   

**é™„ä»¶ï¼š**
ú
ú.htmlF)Úensure_ascii)r.   Úpublish_dateÚcontent_htmlÚcontent_renderedÚattachments)r0   r1   r2   r3   r   r6   r5   r4   r9   ÚstrÚfinditerÚIr7   r8   ÚanyÚjoinÚsplitÚescapeÚjsonÚdumps)"r:   r!   Útitle_mr.   Úpub_mr[   Údate_strÚ
date_matchr\   ÚnrcfÚbodyÚpage_conÚnrcf2Úbody2ÚpcÚpartsÚ
clean_htmlÚpÚstrippedÚtextÚtr^   ÚmÚatt_urlÚcontent_imagesÚimg_altÚalt_textÚrenderedÚimgrT   Úatt_markdownÚ	att_titleÚtitle_matchrL   s"                                    @r'   Úparse_detailr‚   <   sD  ø€ ô �i‰iÐ/°´r·y±yÓA€GÙW^ˆG�M‰M˜!Ó×$Ñ$Ð%FÈÓK×QÑQÔSÐdf€Eô �I‰IÐMÈtÓT€EØ€LÙØ—;‘;˜q“>×'Ñ'Ó)ˆÜ—Y‘YÐ9¸8ÓDˆ
ÙØ%×+Ñ+¨AÓ.ˆLð €LÜ�9‰9ÐNÐPTÔVX×V_ÑV_Ó`€DÙØ�z‰z˜!‹}ˆÜ—9‘9ÐAÀ4ÌÏÉÓSˆÙØ#Ÿ>™>¨!Ó,×2Ñ2Ó4ˆLñ Ü—	‘	Ð6¸¼b¿i¹iÓHˆÙØ—K‘K “NˆEä—‘Ð_ÐafÔhj×hqÑhqÓrˆBÙØ!Ÿx™x¨›{×0Ñ0Ó2�ð €Eä—‘Ð2°B¸ÌBÏIÉIÔV€JÜ�Z‰ZÐ,¨j¼"¿)¹)ÓDò 	ˆä—6‘6˜-¨¨QÓ/ˆÜ—6‘6Ð,¨b°(Ó;ˆÜ—6‘6˜* b¨(Ó3×9Ñ9Ó;ˆÙØÜ�v‰v�j " aÓ(×.Ñ.Ó0ˆÚØ�L‰L˜Õð	ô �Z‰ZÐ2°LÄ"Ç)Á)ÓLò ˆØ�‰”S˜“VÕðð €Kä�[‰[ÐWÐY]Ô_a×_cÑ_cÓdò $ˆØ—'‘'˜!“*ˆØ×!Ñ! &Ô)Ü Ñ(ˆGØ×Ñ˜7Õ#ð	$ô �[‰[ð  Pð  RVô  XZ÷  X\ñ  X\ó  ]ò $ˆØ—'‘'˜!“*ˆØ×!Ñ! &Ô)Ü Ñ(ˆGØ×Ñ˜7Õ#ð	$ð €NÜ�[‰[ÐUÐW[Ô]_×]aÑ]aÓbò 	AˆØ—'‘'˜!“*ˆäÓ[Ð-ZÔ[Ô[ØØ×!Ñ! &Ô)Ü Ñ(ˆGÜ—)‘)Ð6¸¿¹À»
ÓCˆÙ'.�7—=‘= Ô#°BˆØ×Ñ g°hÑ?Õ@ð	Að �{‰{˜5Ó!€HÙØ!ò 	6ˆCØ # E¢
�#�e’*°ˆCØ˜&   R¨¨E©
 |°1Ð5Ñ5‰Hð	6ò àˆØ"ò 	?ˆGàŸ™ cÓ*¨2Ñ.ˆIØ×#Ñ# MÔ2°mÀwÑ6Nä Ÿi™i¨¼¿	¹	À'Ó8JÑ(JÐMsÑ(sÐuyÓz�ÙØ +× 1Ñ 1°!Ó 4× :Ñ :Ó <‘Iä Ÿi™i¨¼¿	¹	À'Ó8JÑ(JÐMcÑ(cÐeiÓj�ÙØ +× 1Ñ 1°!Ó 4× :Ñ :Ó <�IØ×Ñ # i [°°7°)¸1Ð =Õ>ð	?ð 	Ð)¨T¯Y©Y°|Ó-DÑDÑDˆð ÒA˜#Ÿ)™) C›.¨Ñ,×4Ñ4°W¸bÓAØ$Ø$Ø$Ü—z‘z +¸EÔBñð rE   c                 óÌ  — t        j                  t        «      }|j                  «       }d}t	        j
                  «       j                  d«      }d}| D ]î  }|d   }|j                  |i «      }	|j                  d||f«       |j                  «       d   dkD  rŒE|	j                  dd«      }
|j                  d||	j                  d	|j                  d	d«      «      ||	j                  d
|j                  dd«      «      |
|	j                  dd«      dt        t	        j
                  «       j                  «       «      f«       |dz  }Œð |j                  «        |j                  «        |S )z!Upsert into gov_raw + sync to FTSu+   å�—é€šå¸‚é€šå·žåŒºäººæ°‘æ”¿åºœ-å…¬å‘Šå…¬ç¤ºz%Y-%m-%d %H:%M:%Sr   r-   z=SELECT COUNT(*) FROM gov_raw WHERE page_url=? AND site_name=?r]   r+   z¦INSERT OR REPLACE INTO gov_raw 
            (page_url, title, site_name, publish_date, content, attachments, category, date_rank)
            VALUES (?,?,?,?,?,?,?,?)r.   r[   r/   r^   z[]u   å…¬ç¤ºå…¬å‘Šr   )Úsqlite3ÚconnectÚDB_PATHÚcursorr   ÚnowÚstrftimeÚgetÚexecuteÚfetchoneÚintÚ	timestampÚcommitÚclose)r<   ÚdetailsÚconnÚcÚ	site_namerˆ   ÚinsertedÚitemÚpuÚdetr>   s              r'   Ú
save_to_dbr™   ¬   s@  € ä�?‰?œ7Ó#€DØ�‰‹€AØ=€IÜ
�,‰,‹.×
!Ñ
!Ð"5Ó
6€CØ€Hàò ˆØ�*ÑˆØ�k‰k˜"˜bÓ!ˆà	�	‰	ÐQÐTVÐXaÐSbÔcØ�:‰:‹<˜‰?˜QÒØØ—'‘'Ð,¨bÓ1ˆØ	�	‰	ð (ð Ø�G‰G�G˜TŸX™X g¨rÓ2Ó3ØØ�G‰G�N D§H¡H¨V°RÓ$8Ó9ØØ�G‰G�M 4Ó(ØÜ”—‘“×(Ñ(Ó*Ó+ð	*
ô	ð 	�A‰‰ð)ð, 	‡K�K„MØ‡J�J„LØ€OrE   c                  ó‚  — dd l } | j                  «       }|j                  dd¬«       |j                  «       }g }t        j                  «       D ]v  \  }}t        › d|› d|› d�}t        d|› d	|› d
�dd¬«       t        |«      }|st        d«       ŒCt        ||«      }t        t        |«      › d�«       |j                  |«       Œx t        dt        |«      › �«       |j                  rt        d«       i }	t        |«      D ]†  \  }
}|d   }t        d|
dz   › dt        |«      › d|d   d d › d�dd¬«       t        |«      }|st        d«       ŒNt        ||«      }||	|<   t        dt        |j                  dd«      «      › d�«       Œˆ t!        ||	«      }t        d|› d�«       t        d t        |«      |z
  › �«       y )!Nr   z--incrementalÚ
store_true)Úactionz	/tzqrmzf/rV   rY   z[LIST] z (z)...ú T)ÚendÚflushÚFAILEDz itemsz
Total items: z)Incremental mode: will skip existing URLsr-   z  [r   z] r.   é(   z...ÚSKIPzOK (r]   r+   z chars)z
Inserted: z
 new itemszSkipped (existing): )ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsÚSUBSr<   r8   r   r(   rD   ÚlenÚextendÚincrementalÚ	enumerater‚   rŠ   r™   )r£   ÚparserÚargsÚ	all_itemsÚsub_keyÚ	sub_labelr!   r:   r<   r‘   r#   r–   r—   r˜   r•   s                  r'   Úmainr±   Î   sÜ  € ÛØ×$Ñ$Ó&€FØ
×Ñ˜°ÐÔ=Ø×ÑÓ€Dð €IÜ"Ÿj™j›lò 	 Ñˆ�Ü�
˜) G 9¨A¨g¨Y°eÐ<ˆÜ�˜	�{ " W I¨TÐ2¸À4ÕHÜ�S‹zˆÙÜ�(ŒOØÜ˜4 Ó)ˆÜ”�U“�˜FÐ#Ô$Ø×Ñ˜Õð	 ô 
ˆOœC 	›NÐ+Ð
,Ô-à×ÒäÐ9Ô;ð €GÜ˜YÓ'ò 	C‰ˆˆ4Ø�*ÑˆÜ��A�a‘C�5˜œ#˜i›.Ð)¨¨D°©M¸#¸2Ð,>Ð+?¸sÐCÈÐTXÕYÜ�R‹yˆÙÜ�&ŒMØÜ˜4 Ó$ˆØˆ�‰Ü�”S˜Ÿ™Ð!3°BÓ7Ó8Ð9¸ÐAÕBð	Cô ˜) WÓ-€HÜ	ˆL˜˜
 *Ð
-Ô.Ü	Ð ¤ Y£°(Ñ!:Ð ;Ð
<Õ=rE   Ú__main__)é   )Ú__doc__r0   r   Úosr   rf   Úurllib.requestr   Úurllib.errorr„   r   r†   r8   r§   r(   rD   r‚   r™   r±   Ú__name__© rE   r'   ú<module>rº      ss   ðñ÷ F× E× E× EÝ à
€Ø'€àØØØØØØñ€óòò0nò` òD)>ðV ˆzÒÙ…Fð rE   