Ë
    ¸¬uj×   ã                   óÚ  — 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 dlmZm	Z	 dZ
dZdZ e j                  dd«      Zd	Ze› d
�ZddddddddœZdeez   dœZ ej&                  «        e	d¬«      z
  j)                  d«      Zd„ Zd„ Zd"d„Zd„ Zd#d„Zedk(  rRdej8                  v ZdZej8                  dd D ]%  ZejA                  «       r
 e!e«      Z ned k(  sŒ#dZ n  eee¬!«       yy)$é    N)Úurljoin)ÚdatetimeÚ	timedeltau   æµŽå�—å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€zhttps://jnepb.jinan.gov.cnz/col/col10489/index.htmlÚ	SEARCH_DBz/root/search.dbé�   z7/api-gateway/jpaas-publish-server/front/page/build/unitÚ21Ú10489ÚbulidstaticÚcolumnu   ä¿¡æ�¯åˆ—è¡¨ÚnullÚpMB9pkaz19HYYbLAOTZtY)ÚwebIdÚpageIdÚ	parseTypeÚpageTypeÚtagIdÚeditTypeÚtplSetIdz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36)z
User-AgentÚRefereriG  )Údaysz%Y-%m-%dc                 óÂ  — t        t        «      }t        j                  |ddœd¬«      |d<   	 | j	                  t
        |t        d¬«      }|j                  dk7  ry	|j                  «       }|j	                  d
«      sy	|d   d   }t        j                  d|«      }|rt        |j                  d«      «      nd}||fS # t        $ r}t        d|› �«       Y d }~y	d }~ww xY w)Né   )ÚpageNoÚpageSizeF)Úensure_asciiÚ	paramJsoné   )ÚparamsÚheadersÚtimeoutéÈ   )Nr   ÚsuccessÚdataÚhtmlzcount="(\d+)"é   r   z    API error: )ÚdictÚ
API_PARAMSÚjsonÚdumpsÚgetÚAPI_URLÚHEADERSÚstatus_codeÚreÚsearchÚintÚgroupÚ	ExceptionÚprint)	ÚsessionÚpager   Úrr#   r$   ÚmÚtotalÚes	            ú$/root/gov_crawler/crawl_jinan_hbj.pyÚ
fetch_listr;   '   sË   € Ü”*Ó€FÜŸ*™*°À"Ñ%EÐTYÔZ€Fˆ;ÑðØ�K‰Kœ¨¼ÈˆKÓLˆØ�=‰=˜CÒØØ�v‰v‹xˆØ�x‰x˜	Ô"ØØ�F‰|˜FÑ#ˆÜ�I‰IÐ&¨Ó-ˆÙ#$”�A—G‘G˜A“J”¨!ˆØ�Uˆ{ÐøÜò Ü� ˜sÐ#Ô$Üûðús#   ®,B= Á!B= Á=?B= Â=	CÃCÃCc                 óˆ  — g }t        j                  dt         j                  «      }|j                  | «      D ]‡  }|j	                  d«      }|j                  d«      st        t        |«      }|j	                  d«      j                  «       }|j	                  d«      j                  «       }|j                  |||dœ«       Œ‰ |S )z{Extract items from list HTML.
    <li><a href="..." title="...">title</a><span readexclude="">[YYYY-MM-DD]</span></li>
    zi<a[^>]*href="([^"]+)"[^>]*title="([^"]*)"[^>]*>.*?</a>\s*<span[^>]*>\[(\d{4}-\d{1,2}-\d{1,2})\]\s*</span>r%   Úhttpé   é   )ÚurlÚtitleÚdate)
r.   ÚcompileÚDOTALLÚfinditerr1   Ú
startswithr   ÚBASEÚstripÚappend)r$   ÚitemsÚpatternr7   r@   rA   Údate_strs          r:   Ú
parse_listrM   :   sª   € ð €EÜ�j‰jØtÜ
�	‰	ó€Gð ×Ñ˜dÓ#ò EˆØ�g‰g�a‹jˆØ�~‰~˜fÔ%Üœ$ Ó$ˆCØ—‘˜“
× Ñ Ó"ˆØ—7‘7˜1“:×#Ñ#Ó%ˆØ�‰˜S¨5¸(ÑCÕDðEð €Ló    c                 ó"  — d}t        j                  d| «      }|r|j                  d«      j                  «       }|s[t        j                  d| t         j                  «      }|r4t        j
                  dd|j                  d«      j                  «       «      }|s|}d}t        j                  d| «      }|r|j                  d«      }d}t        j                  d| t         j                  «      }|s%t        j                  d| t         j                  «      }|s%t        j                  d	| t         j                  «      }|r|j                  d«      j                  «       }|r®t        j
                  d
d|t         j                  t         j                  z  ¬«      }t        j
                  dd|t         j                  t         j                  z  ¬«      }t        j
                  dd|«      }t        j
                  dd|«      }|j                  «       }|||fS )NÚ z3<meta[^>]*name="ArticleTitle"[^>]*content="([^"]*)"r%   z<title>(.*?)</title>z_[^_]+$z,PubDate[^>]*content="(\d{4}-\d{1,2}-\d{1,2})z&<div[^>]*id="zoom"[^>]*>(.*?)</div>\s*z/<div[^>]*class="TRS_Editor"[^>]*>(.*?)</div>\s*z.<div[^>]*id="UCAP-CONTENT"[^>]*>(.*?)</div>\s*z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z\s*style="[^"]*"z
<!--.*?-->)r.   r/   r1   rH   rD   ÚsubÚI)r$   Úfallback_titlerA   r7   rL   ÚcontentÚcms          r:   Úparse_detailrW   M   sœ  € à€EÜ
�	‰	ÐHÈ$ÓO€AÙØ—‘˜“
× Ñ Ó"ˆÙÜ�I‰IÐ-¨t´R·Y±YÓ?ˆÙÜ—F‘F˜: r¨1¯7©7°1«:×+;Ñ+;Ó+=Ó>ˆEÙØˆð €HÜ
�	‰	ÐAÀ4ÓH€AÙØ—7‘7˜1“:ˆð €GÜ	�‰Ð<¸dÄBÇIÁIÓ	N€BÙÜ�Y‰YÐIÈ4ÔQS×QZÑQZÓ[ˆÙÜ�Y‰YÐHÈ$ÔPR×PYÑPYÓZˆÙ	Ø—(‘(˜1“+×#Ñ#Ó%ˆáÜ—&‘&Ð5°r¸7Ì"Ï)É)ÔVX×VZÑVZÑJZÔ[ˆÜ—&‘&Ð3°R¸ÌÏ	É	ÔTV×TXÑTXÑHXÔYˆÜ—&‘&Ð,¨b°'Ó:ˆÜ—&‘&˜¨¨GÓ4ˆØ—-‘-“/ˆà�(˜GÐ#Ð#rN   c                 óè   — d}d}|D ]Z  }	 | j                  d|d   d d |d   |d   |d   |d   |d	   |d
   |d   |d   |d   f
«       | j                  dkD  r|dz  }n|dz  }Œ\ ||fS #  |dz  }Y ŒjxY w)Nr   z»INSERT OR IGNORE INTO gov_raw
                (site_name, source_url, page_url, title, publish_date, summary, content, status, category, tags)
                VALUES (?,?,?,?,?,?,?,?,?,?)Ú	site_namer!   Ú
source_urlÚpage_urlrA   Úpublish_dateÚsummaryrU   ÚstatusÚcategoryÚtagsr%   )ÚexecuteÚtotal_changes)ÚdbÚrecordsÚinsertedÚskippedÚitems        r:   Ú
push_to_dbrh   t   sÊ   € Ø€HØ€GØò ˆð	Ø�J‰Jð0ð ˜Ñ% d sÐ+Ø˜Ñ&Ø˜Ñ$Ø˜‘MØ˜Ñ(Ø˜‘OØ˜‘OØ˜‘NØ˜Ñ$Ø˜‘Lðô	ð" ×Ñ !Ò#Ø˜A‘‘à˜1‘�øð-ð2 �WÐÐøð	Ø�q‰LŠGús   ‹AA(Á(A1c                 ó¸  ‡— | €t         } t        j                  t        «      }|j	                  d«       t        d„ |j	                  dt        f«      j                  «       D «       «      Št        dt        ‰«      › �«       t        j                  «       }|j                  j                  t        «       t        dd¬«       t        |d«      \  }}|st        d	«       y t!        |«      }t#        | |r|d
z   dz  n| «      }t        dt        |«      › d|› d�«       g }|r|d   d   nd}	|r |	‰v rt        d«       |j%                  «        y |j'                  |«       t)        d|dz   «      D ]×  }
t        d|
› d�d¬«       t        ||
«      \  }}|st        d	«        n¨t!        |«      }t        t        |«      › d�«       |s n‚|rNt+        ˆfd„|D «       «      rt        d«        n_|D �cg c]  }|d   ‰vsŒ|‘Œ }}|s nD|j'                  |«       n|j'                  |«       t+        d„ |D «       «      sŒÌt        d«        n |D �cg c]  }|d   t,        k\  s|d   rŒ|‘Œ }}|st        d«       |j%                  «        y t        dt        |«      › d�«       g }t/        |«      D ]¸  \  }}	 |j1                  |d   t        d¬ «      }d!|_        |j4                  }t7        ||d"   «      \  }}}|j9                  t        |d   d d# |d   |xs |d"   d d# |xs |d   d d$ |xs |d"   d d# |d%ddd&œ
«       |dz   dz  dk(  sŒ›t        d'|dz   › d(t        |«      › d)�«       Œº t;        ||«      \  }}|j=                  «        |j	                  d*t        f«       |j=                  «        |j%                  «        t        d+|› d,|› �«       y c c}w c c}w #  Y �Œ2xY w)-NzPRAGMA journal_mode=WALc              3   ó&   K  — | ]	  }|d    –— Œ y­w)r   N© )Ú.0r6   s     r:   ú	<genexpr>zrun.<locals>.<genexpr>š   s   è ø€ ò àð 	
ˆ!�ñùs   ‚z.SELECT page_url FROM gov_raw WHERE site_name=?z  Known in DB: z  Fetching page 1...ú )Úendr%   ÚFAILé   r   zOK - z items, z total pagesr   r@   rP   z  No new datar>   z  Page z...z itemsc              3   ó,   •K  — | ]  }|d    ‰v –— Œ y­w)r@   Nrk   )rl   rg   Úknowns     €r:   rm   zrun.<locals>.<genexpr>Ä   s   øè ø€ Ò?¨D�4˜‘; %Ô'Ñ?ùs   ƒz    All known, stoppingc              3   ó4   K  — | ]  }|d    t         k  –— Œ y­w)rB   N)ÚCUTOFF)rl   Úis     r:   rm   zrun.<locals>.<genexpr>Ï   s   è ø€ Ò6 aˆq�‰yœ6Õ!Ñ6ùs   ‚z    Before cutoff, stoppingrB   z  No items to processz  Fetching z details...r   )r   r    zutf-8rA   iô  é
   Úactive)
rY   rZ   r[   rA   r\   r]   rU   r^   r_   r`   z    [ú/ú]zÔINSERT INTO gov_search(rowid,title,site_name,summary)
        SELECT r.id, r.title, r.site_name, r.summary
        FROM gov_raw r
        WHERE r.id NOT IN (SELECT rowid FROM gov_search)
        AND r.site_name=?z  Done: new=z, skip=)Ú	MAX_PAGESÚsqlite3Úconnectr   ra   ÚsetÚ	SITE_NAMEÚfetchallr3   ÚlenÚrequestsÚSessionr   Úupdater,   r;   rM   ÚminÚcloseÚextendÚrangeÚallru   Ú	enumerater*   ÚencodingÚtextrW   rI   rh   Úcommit)Ú	max_pagesÚincrementalrc   r4   r$   r8   rJ   Útotal_pagesÚ	all_itemsÚ
newest_urlr5   Ú_Ú
page_itemsrv   Ú	new_itemsÚresultsrg   r6   rA   rL   rU   re   rf   rs   s                          @r:   Úrunr—   “   sè  ø€ ØÐÜˆ	ä	�‰œÓ	#€BØ‡J�JÐ(Ô)äñ à—‘Ø<¼y¸ló
ç
‰(‹*ô	ó €Eô 
ˆOœC ›J˜<Ð
(Ô)ä×ÑÓ €GØ‡O�O×Ñœ7Ô#ô 
Ð  sÕ+Ü˜W aÓ(�K€Dˆ%ÙÜˆfŒØÜ�tÓ€EÜ�i±u %¨"¡*°Ò!3À)ÓL€KÜ	ˆE”#�e“*�˜X k ]°,Ð
?Ô@à€IÙ$)��q‘˜%’¨r€JÙ�z UÑ*Ü�ÔØ
�‰Œ
Øà×Ñ�UÔä�a˜ q™Ó)ò ˆÜ�˜�v˜SÐ! sÕ+Ü˜W dÓ+‰ˆˆaÙÜ�&ŒMÙÜ Ó%ˆ
Ü”�Z“Ð! Ð(Ô)ÙÙáÜÓ?°JÔ?Ô?ÜÐ/Ô1ÙØ$.ÖH˜q°!°E±(À%Ò2GšÐHˆIÐHÙÙØ×Ñ˜ZÕ(à×Ñ˜ZÔ(ô Ñ6¨:Ô6Õ6ÜÐ/Ô1Ùð3ð8 &ÖN�q¨¨6©´fÒ)<ÀAÀfÃI’ÐN€IÐNáÜÐ%Ô&Ø
�‰Œ
Øä	ˆKœ˜I›Ð' {Ð
3Ô4à€GÜ˜YÓ'ò 3‰ˆˆ4ð	Ø—‘˜D ™K´À"�ÓEˆAØ ˆAŒJØ—6‘6ˆDô $0°°d¸7±mÓ#DÑ ˆˆx˜Ø�‰ä&Ø" 5™k¨$¨3Ð/Ø  ™KØÒ0 4¨¡=°$°3Ð7Ø!)Ò!9¨T°&©\¸3¸BÐ ?Ø!Ò2 T¨'¡]°D°SÐ9Ø"Ø"ØØñô	
ð �‰E�R‰<˜1ÓÜ�E˜!˜A™#˜˜a¤ I£Ð/¨qÐ1Õ2ð/3ô2 # 2 wÓ/Ñ€HˆgØ‡I�I„Kà‡J�Jð	ô
 
ˆôð ‡I�I„KØ‡H�H„Jä	ˆL˜˜
 '¨'¨Ð
3Õ4ùò} Iùò Oøð	Úús$   Ç(O
Ç5O
ÉOÉOÊ..OÏOÚ__main__z--incrementalr%   z--test)rŽ   r�   )rP   )NF)"ÚosÚsysr.   r|   r(   r‚   Úurllib.parser   r   r   r   rG   ÚCOLUMNÚgetenvr   r{   r+   r'   r,   ÚnowÚstrftimeru   r;   rM   rW   rh   r—   Ú__name__Úargvr�   ÚmpÚaÚisdigitr0   rk   rN   r:   ú<module>r¥      s-  ðã 	ð÷ × Û Ý  ß (à&€	Ø#€Ø	#€ØˆB�I‰I�kÐ#4Ó5€	Ø€	àˆFÐIÐ
J€àØØØØØØ'ñ€
ð QØ�f‰}ñ€ð
 ˆ(�,‰,‹.™9¨'Ô2Ñ
2×	<Ñ	<¸ZÓ	H€òò&ó&$$òNó>r5ðj ˆzÒØ! S§X¡XÐ-€KØ	€BØ�X‰X�a�bˆ\ò ˆØ�9‰9Œ;Ù�Q“ˆBÙØ�‹=ØˆBÙðñ �" +Ö.ð rN   