Ë
    ¸¬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mZmZ ddl	m
Z
 ddlmZ  ej                  dd«      ZdZd	Zd
Ze› d�ZdddddddœZddiZdZd„ Zd„ Zd„ Zd„ Zd„ Zd*d„Zd„ Zedk(  r� eej>                  «      dkD  rej>                  d   ndZ e dk(  r e«        ye d k(  r e«        ye d!k(  r; e«       Z! ed" ee!«      › d#�«       e!dd$ D ]  Z" e#d%e"d&   › d'e"d(   dd) › �«       Œ yyy)+uC   
Crawler: æ¹–å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€é•¿å…´åˆ†å±€ (zjcx.gov.cn JPAAS)
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)ÚurljoinÚ	SEARCH_DBz/root/search.dbu   é•¿å…´åŽ¿ç”Ÿæ€�çŽ¯å¢ƒåˆ†å±€u   ä¿¡æ�¯å…¬å¼€zhttps://www.zjcx.gov.cnz7/api-gateway/jpaas-publish-server/front/page/build/unitÚbulidstaticÚ3645Ú8kDHhxYDq8SLXt9vSDiY9Úcolumnu   ç»„é…�åˆ†ç±»listÚQIrUapMnq9Avhahnnyp8M)Ú	parseTypeÚwebIdÚpageIdÚpageTypeÚtagIdÚtplSetIdz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36)
z.docz.docxz.pdfz.xlsz.xlsxz.pptz.pptxz.zipz.rarz.7zc                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚSITE)Úmsgs    ú"/root/gov_crawler/crawl_zjcx_hb.pyÚlogr      s   € Ü	ˆAŒdˆV�2�c�UÐ
 4Ö(ó    c                  óÄ  — t        j                  t        t        t        dd¬«      } | j                  «       }|d   d   }g }t        «       }t        j                  d|t        j                  «      D ]í  }|j                  d«      }t        j                  d|t        j                  «      D ]²  }|j                  d«      }t        j                  d	|«      }	t        j                  d
|«      }
|	sŒC|	j                  d«      }|	j                  d«      j                  «       }|
r|
j                  d«      nd}||vsŒ�|j                  |«       |j                  |||dœ«       Œ´ Œï |S )zDFetch all items from JPAAS API (returns all sub-categories at once).é<   F)ÚparamsÚheadersÚtimeoutÚverifyÚdataÚhtmlz<ul class="ajax-ul">(.*?)</ul>é   z"<li[^>]*class="cf"[^>]*>(.*?)</li>z)<a[^>]*href="([^"]*)"[^>]*title="([^"]*)"z$<span class="fr">(\d{4}-\d{2}-\d{2})é   Ú )ÚtitleÚurlÚdate)ÚrequestsÚgetÚAPI_URLÚ
API_PARAMSÚHEADERSÚjsonÚsetÚreÚfinditerÚDOTALLÚgroupÚsearchÚstripÚaddÚappend)Úrr"   r#   ÚitemsÚ	seen_urlsÚulÚul_htmlÚliÚli_htmlÚa_mÚd_mÚhrefr'   Údate_strs                 r   Ú
fetch_listrD      s%  € ä�‰”W¤Z¼È"ÐUZÔ[€AØ�6‰6‹8€DØ�‰<˜Ñ€Dà€EÜ“€IÜ�k‰kÐ;¸TÄ2Ç9Á9ÓMò RˆØ—(‘(˜1“+ˆÜ—+‘+ÐCÀWÌbÏiÉiÓXò 
	RˆBØ—h‘h˜q“kˆGÜ—)‘)ÐHÈ'ÓRˆCÜ—)‘)ÐCÀWÓMˆCÚØ—y‘y “|�ØŸ	™	 !›×*Ñ*Ó,�Ù+.˜3Ÿ9™9 Qœ<°B�Ø˜yÒ(Ø—M‘M $Ô'Ø—L‘L¨5¸ÀxÑ!PÕQñ
	RðRð €Lr   c                 óä  — 	 t        j                  | t        dd¬«      }d|_        t	        |j
                  d«      }d}|j                  d«      }|r|j                  d	¬
«      }|s%|j                  d«      }|r|j                  d	¬
«      }d}|j                  dddi¬«      }|r|j                  d«      r|d   dd }d}|j                  dd¬«      }	|	rt        |	«      }|||fS # t        $ r Y yw xY w)z3Fetch detail page, extract content from div.zhengw.é   F)r   r    r!   zutf-8úhtml.parser)r&   r&   r&   r&   Úh1T©r6   r'   ÚmetaÚnameÚPubDate)ÚattrsÚcontentNé
   ÚdivÚzhengw)Úclass_)
r*   r+   r.   Úencodingr   ÚtextÚ	ExceptionÚfindÚget_textÚstr)
r(   r9   Úsoupr'   rH   ÚtÚpub_daterJ   Úcontent_htmlÚzws
             r   Úfetch_detailr^   7   sÿ   € ðÜ�L‰L˜¤g°rÀ%ÔHˆØˆŒ
Ü˜QŸV™V ]Ó3ˆð
 €EØ	�‰�4‹€BÙ	Ø—‘ $�Ó'ˆÙØ�I‰I�gÓˆÙØ—J‘J T�JÓ*ˆEð €HØ�9‰9�V F¨IÐ#6ˆ9Ó7€DÙ�—‘˜Ô#Ø˜	‘? 3 BÐ'ˆð €LØ	�‰�5 ˆÓ	*€BÙ	Ü˜2“wˆà�, Ð(Ð(øô3 ò Ùðús   ‚:C# Ã#	C/Ã.C/c                 ó  — | syt        | d«      }|j                  dd¬«      D ]T  }|j                  dd«      }|j                  d¬«      xs d}t	        t
        |«      }d	|› d
|› d�}|j                  |«       ŒV |j                  g d¢«      D ]  }|j                  «        Œ g }|j                  d«      D ])  }	|	j                  dd¬«      }
|
sŒ|j                  |
«       Œ+ |rdj                  |«      S | j                  «       S )z1Clean HTML content to text with attachment links.r&   rG   ÚaT)rB   rB   rI   u   é™„ä»¶r   z](ú))ÚspanÚbÚstrongÚfontÚemÚiÚuÚsÚp)Ú	separatorr6   z

)r   Úfind_allr+   rW   r   ÚBASE_URLÚreplace_withÚunwrapr8   Újoinr6   )r\   rY   Úa_tagrB   rT   Úfull_urlÚmdÚtagÚ
paragraphsrj   rZ   s              r   Úextract_contentrv   Y   s  € áØÜ˜ }Ó5€Dð —‘˜s¨�Ó.ò ˆØ�y‰y˜ Ó$ˆØ�~‰~ Dˆ~Ó)Ò5¨XˆÜœ8 TÓ*ˆØ���b˜˜
 !Ð$ˆØ×Ñ˜2Õðð �}‰}ÒQÓRò ˆØ�
‰
�ðð €JØ�]‰]˜3Óò !ˆØ�J‰J ¨4ˆJÓ0ˆÚØ×Ñ˜aÕ ð!ñ
 '1ˆ6�;‰;�zÓ"ÐJ°l×6HÑ6HÓ6JÐJr   c                 ó  — dd l }|j                  t        «      }|j                  d«       |j                  d«       |j	                  «       }d}d}| D ]a  }	 |j                  dt
        › dt        › �|d   |d   |d   |d   |d	   |d	   xs d
d d t        f«       |j                  dkD  r|dz  }n|dz  }Œc |j                  «        |j                  «        ||fS # t        $ r}t        d|› �«       |dz  }Y d }~Œ©d }~ww xY w)Nr   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=10000z‰INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, content, summary, category) VALUES (?,?,?,?,?,?,?,?)ú-r(   r'   r)   rN   r&   iô  r$   z
DB error: )Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorr   ÚCOLUMNÚrowcountrU   r   ÚcommitÚclose)r:   ry   ÚconnÚcÚ	new_countÚ
skip_countÚitemÚes           r   Ústore_itemsrˆ   t   s  € ÛØ�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø�‰‹€AØ€IØ€JØò ˆð	Ø�I‰Ið,ô �f˜Aœf˜XÐ&Ø˜‘K  e¡Ø˜‘M 4¨¡<Ø˜‘OØ˜)‘_Ò*¨¨D¨SÐ1Üðô	ð �z‰z˜AŠ~Ø˜Q‘‘	à˜a‘�
øð%ð, 	‡K�K„MØ‡J�J„LØ�jÐ Ð øô ò 	Ü�*˜Q˜CÐ Ô!Ø˜!‰O�Jûð	ús   ÁACÃ	D Ã#C;Ã;D c           	      ó€  — t        j                  «       t        | dz  ¬«      z
  j                  d«      }t	        d|› d�«       t        «       }t	        dt        |«      › d�«       g }|D ]"  }|d   sŒ	|d   |k\  sŒ|j                  |«       Œ$ t	        d	t        |«      › d�«       t        |d
«      D ]j  \  }}t        |d   «      \  }}}|r||d<   |r||d<   t        |«      |d<   |dz  dk(  rt	        d|› dt        |«      › �«       t        j                  d«       Œl t        |«      \  }	}
t	        d|	› d|
› d�«       y )NrF   ©Údaysú%Y-%m-%dzFull crawl (cutoff: ra   zList API returned ú itemsr)   zAfter cutoff filter: r$   r(   r'   rN   rO   r   z  Progress: ú/ç      à?úResult: ú new, ú skipped)r   Únowr   Ústrftimer   rD   Úlenr8   Ú	enumerater^   rv   ÚtimeÚsleeprˆ   )Úmonths_backÚcutoffr:   Úfilteredr†   Úidxr'   r\   rC   ÚnewÚskips              r   Ú	crawl_allrŸ   —   sO  € Ü�l‰l‹nœy¨k¸BÑ.>Ô?Ñ?×IÑIÈ*ÓU€FÜÐ
˜v˜h aÐ(Ô)ä‹L€EÜÐ
œS ›Z˜L¨Ð/Ô0ð €HØò "ˆØ�‹<˜D ™L¨FÓ2Ø�O‰O˜DÕ!ð"ô Ð
¤ H£˜¨fÐ5Ô6ô ˜x¨Ó+ò 	‰	ˆˆTÜ(4°T¸%±[Ó(AÑ%ˆˆ|˜XÙØ!ˆD�‰MÙØ#ˆD�‰LÜ)¨,Ó7ˆˆY‰Ø�‰8�qŠ=Ü�,˜s˜e 1¤S¨£] OÐ4Ô5Ü�
‰
�3�ð	ô ˜HÓ%�I€CˆÜˆ(�3�%�v˜d˜V 8Ð,Õ-r   c                  óô  — t        j                  «       t        d¬«      z
  j                  d«      } t	        d«       t        «       }|D �cg c]  }|d   sŒ	|d   | k\  sŒ|‘Œ }}t	        t        |«      › d| › �«       t        |d«      D ]H  \  }}t        |d   «      \  }}}|r||d	<   |r||d<   t        |«      |d
<   t        j                  d«       ŒJ t        |«      \  }	}
t	        d|	› d|
› d�«       y c c}w )Né   rŠ   rŒ   zIncremental (last 7 days)r)   z items since r$   r(   r'   rN   r�   r�   r‘   r’   )r   r“   r   r”   r   rD   r•   r–   r^   rv   r—   r˜   rˆ   )rš   r:   Úitr›   rœ   r†   r'   r\   rC   r�   rž   s              r   Úcrawl_incrementalr£   µ   sø   € Ü�l‰l‹nœy¨aÔ0Ñ0×:Ñ:¸:ÓF€FÜÐ
#Ô%ä‹L€EØ"ÖJ�r b¨£j°R¸±ZÀ6Ó5I’ÐJ€HÐJÜŒ3ˆx‹=ˆ/˜ v hÐ/Ô0ä˜x¨Ó+ò ‰	ˆˆTÜ(4°T¸%±[Ó(AÑ%ˆˆ|˜XÙ %�$�w‘-Ù H�T˜&‘\Ü)¨,Ó7ˆˆY‰Ü�
‰
�3�ðô ˜HÓ%�I€CˆÜˆ(�3�%�v˜d˜V 8Ð,Õ-ùò Ks   Á

C5ÁC5ÁC5Ú__main__r$   ÚincrementalÚfullÚlistzTotal: r�   é   z  r)   z | r'   é2   )é$   )$Ú__doc__ÚsysÚosr/   r1   r—   r*   r   r   Úbs4r   Úurllib.parser   Úgetenvr{   r   r~   rm   r,   r-   r.   ÚATTACH_EXTSr   rD   r^   rv   rˆ   rŸ   r£   Ú__name__r•   ÚargvÚmoder:   r¢   r   © r   r   ú<module>r¶      sG  ðñ÷ )× (× (ß (Ý Ý  à
ˆ"�)‰)�KÐ!2Ó
3€Ø$€Ø	€Ø$€ØˆJÐMÐ
N€àØØ%ØØ+Ø'ñ€
ð ÐWÐ
X€Ø`€ò)òò0)òDKò6 !óF.ò<.ð& ˆzÒÙ˜cŸh™h›-¨!Ò+ˆ3�8‰8�AŠ;°€DØˆ}ÒÙÕØ	�ŠÙ�Ø	�ŠÙ“ˆÙˆg‘c˜%“j�\ Ð(Ô)Ø˜˜�)ò 	:ˆBÙ�B�r˜&‘z�l # b¨¡k°#°2Ð&6Ð%7Ð8Õ9ñ	:ð 
ð r   