Ë
    ¸¬ujr  ã                   óº  — 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d
e
ez   d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j2                  v ZdZej2                  dd D ]%  Zej;                  «       r
 ee«      Z nedk(  sŒ#dZ n  eee¬«       yy)é    N)Úurljoin)ÚdatetimeÚ	timedeltau%   æ˜Œå�‰å·žç”Ÿæ€�çŽ¯å¢ƒå±€-é€šçŸ¥å…¬å‘Šzhttps://www.cj.gov.cnz
/p122/tzggÚ	SEARCH_DBz/root/search.dbé2   z<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36ú.html)z
User-AgentÚRefereriG  )Údaysz%Y-%m-%dc                 óÔ   — |dk(  rt         › t        › d�nt         › t        › d|› d�}	 | j                  |t        d¬«      }|j                  dk7  ryd|_        |j                  S #  Y yxY w)	zFetch a list page.é   r   Ú_é   ©ÚheadersÚtimeoutéÈ   Núutf-8)ÚBASEÚ	LIST_PATHÚgetÚHEADERSÚstatus_codeÚencodingÚtext)ÚsessionÚpageÚurlÚrs       ú"/root/gov_crawler/crawl_changji.pyÚ
fetch_listr       sn   € à'+¨q¢yŒTˆF”9�+˜UÑ
#¼¸¼y¸kÈÈ4È&ÐPUÐ6V€CðØ�K‰K˜¤W°bˆKÓ9ˆØ�=‰=˜CÒØØˆŒ
Ø�v‰vˆøðÙús   ¨'A# ÁA# Á#A'c                 óˆ  — g }t        j                  dt         j                  «      }|j                  | «      D ]‡  }|j	                  d«      j                  «       }|j	                  d«      }|j                  d«      st        t        |«      }|j	                  d«      j                  «       }|j                  |||dœ«       Œ‰ |S )z›Extract article items from list HTML.
    Format: <li class="subtitle"><a target="_blank" title="..." href="...">title</a><span>YYYY-MM-DD</span></li>
    zk<a\s+target="_blank"\s+title="([^"]*)"\s+href="([^"]+)"[^>]*>.*?</a>\s*<span>(\d{4}-\d{1,2}-\d{1,2})</span>r   é   Úhttpé   )r   ÚtitleÚdate)
ÚreÚcompileÚDOTALLÚfinditerÚgroupÚstripÚ
startswithr   r   Úappend)ÚhtmlÚitemsÚpatternÚmr%   r   Údate_strs          r   Ú
parse_listr4   )   sª   € ð €EÜ�j‰jØvÜ
�	‰	ó€Gð ×Ñ˜dÓ#ò EˆØ—‘˜“
× Ñ Ó"ˆØ�g‰g�a‹jˆØ�~‰~˜fÔ%Üœ$ Ó$ˆCØ—7‘7˜1“:×#Ñ#Ó%ˆØ�‰˜S¨5¸(ÑCÕDðEð €Ló    c                 ój  — d}t        j                  d| t         j                  «      }|r4t        j                  dd|j	                  d«      «      j                  «       }|s7t        j                  d| «      }|r|j	                  d«      j                  «       }|s|}d}t        j                  d| «      }|r|j	                  d«      }|s)t        j                  d| «      }|r|j	                  d«      }d}t        j                  d| t         j                  «      }|r |j	                  d«      j                  «       }nFt        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 )z.Extract title, date, content from detail page.Ú z+<div\s+class="title"[^>]*>\s*(.*?)\s*</div>z<[^>]+>r   z3<meta[^>]*name="ArticleTitle"[^>]*content="([^"]*)"z=<meta[^>]*name="PubDate"[^>]*content="(\d{4}-\d{1,2}-\d{1,2})uI   <span\s+class="fbrq"[^>]*>\s*å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}-\d{1,2}-\d{1,2})z#<font\s+id="Zoom"[^>]*>(.*?)</font>zT<div\s+class="body_content"[^>]*>.*?<div\s+class="content"[^>]*>(.*?)</div>\s*</div>z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z\s*style="[^"]*"z
<!--.*?-->)r'   Úsearchr)   Úsubr+   r,   ÚI)r/   Úfallback_titler%   r2   r3   ÚcontentÚcms          r   Úparse_detailr?   <   sÁ  € ð €EÜ
�	‰	Ð@À$ÌÏ	É	ÓR€AÙÜ—‘�z 2 q§w¡w¨q£zÓ2×8Ñ8Ó:ˆÙÜ�I‰IÐLÈdÓSˆÙØ—G‘G˜A“J×$Ñ$Ó&ˆEÙØˆð €HÜ
�	‰	ÐRÐTXÓY€AÙØ—7‘7˜1“:ˆÙÜ�I‰IÐbÐdhÓiˆÙØ—w‘w˜q“zˆHð €GÜ	�‰Ð9¸4ÄÇÁÓ	K€BÙ	Ø—(‘(˜1“+×#Ñ#Ó%‰ô �Y‰YØcØ”"—)‘)ó
ˆñ Ø—h‘h˜q“k×'Ñ'Ó)ˆGáÜ—&‘&Ð5°r¸7Ì"Ï)É)ÔVX×VZÑVZÑJZÔ[ˆÜ—&‘&Ð3°R¸ÌÏ	É	ÔTV×TXÑTXÑHXÔYˆÜ—&‘&Ð,¨b°'Ó:ˆÜ—&‘&˜¨¨GÓ4ˆØ—-‘-“/ˆà�(˜GÐ#Ð#r5   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_urlr%   Úpublish_dateÚsummaryr=   ÚstatusÚcategoryÚtagsr   )ÚexecuteÚtotal_changes)ÚdbÚrecordsÚinsertedÚskippedÚitems        r   Ú
push_to_dbrP   l   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                 óP  ‡— | €t         } t        j                  t        «      }|j	                  d«       t        d„ |j	                  dt        f«      j                  «       D «       «      Št        dt        ‰«      › �«       t        j                  «       }g }t        d| dz   «      D ]ç  }t        d|› d�d¬	«       t        ||«      }|st        d
«        n»t        |«      }|st        d«        n¡t        t        |«      › d�«       |rNt        ˆfd„|D «       «      rt        d«        ng|D �cg c]  }|d   ‰vsŒ|‘Œ }	}|	s nL|j!                  |«       n|j!                  |«       t        d„ |D «       «      sŒÔt        dt"        › d�«        n |st        d«       |j%                  «        y |D �cg c]  }|d   t"        k\  s|d   rŒ|‘Œ }}t        dt        |«      › d�«       g }
t'        |«      D ]¸  \  }}	 |j)                  |d   t*        d¬«      }d|_        |j.                  }t1        ||d   «      \  }}}|
j3                  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$�«       Œº t5        ||
«      \  }}|j7                  «        |j	                  d%t        f«       |j7                  «        |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© )Ú.0r   s     r   ú	<genexpr>zrun.<locals>.<genexpr>’   s   è ø€ ò àð 	
ˆ!�ñùs   ‚z.SELECT page_url FROM gov_raw WHERE site_name=?z  Known in DB: r   z  Page z...ú )Úendz404/FAILÚemptyz itemsc              3   ó,   •K  — | ]  }|d    ‰v –— Œ y­w)r   NrS   )rT   rO   Úknowns     €r   rU   zrun.<locals>.<genexpr>ª   s   øè ø€ Ò:¨D�4˜‘; %Ô'Ñ:ùs   ƒz    All known, stoppingr   c              3   ó4   K  — | ]  }|d    t         k  –— Œ y­w)r&   N)ÚCUTOFF)rT   Úis     r   rU   zrun.<locals>.<genexpr>µ   s   è ø€ Ò1 aˆq�‰yœ6Õ!Ñ1ùs   ‚z    All dates before z
, stoppingz  No items to processr&   z
  Fetching z details...r   r   r   r%   iô  é
   Úactiver7   )
rA   rB   rC   r%   rD   rE   r=   rF   rG   rH   é   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   rI   ÚsetÚ	SITE_NAMEÚfetchallÚprintÚlenÚrequestsÚSessionÚranger    r4   ÚallÚextendr\   ÚcloseÚ	enumerater   r   r   r   r?   r.   rP   Úcommit)Ú	max_pagesÚincrementalrK   r   Ú	all_itemsr   r/   r0   r]   Ú	new_itemsÚresultsrO   r   r%   r3   r=   rM   rN   rZ   s                     @r   Úrunrx   ‹   s?  ø€ ØÐÜˆ	ä	�‰œÓ	#€BØ‡J�JÐ(Ô)äñ à—‘Ø<¼y¸ló
ç
‰(‹*ô	ó €Eô 
ˆOœC ›J˜<Ð
(Ô)ä×ÑÓ €GØ€Iä�a˜ Q™Ó'ò ˆÜ�˜�v˜SÐ! sÕ+Ü˜' 4Ó(ˆÙÜ�*ÔÙÜ˜4Ó ˆÙÜ�'ŒNÙÜ”�U“�˜FÐ#Ô$áÜÓ:°EÔ:Ô:ÜÐ/Ô1ÙØ$)ÖC˜q¨Q¨u©X¸UÒ-BšÐCˆIÐCÙÙØ×Ñ˜UÕ#à×Ñ˜UÔ#ô Ñ1¨5Ô1Õ1ÜÐ)¬&¨°Ð<Ô=Ùð5ñ8 ÜÐ%Ô&Ø
�‰Œ
Øð &ÖN�q¨¨6©´fÒ)<ÀAÀfÃI’ÐN€IÐNÜ	ˆMœ#˜i›.Ð)¨Ð
5Ô6à€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ùò{ Dùò$ Oøð	Úús$   Ä,LÄ9LÆ1LÇLÇ:.L Ì L%Ú__main__z--incrementalr   z--test)rs   rt   )r7   )NF)ÚosÚsysr'   rd   rk   Úurllib.parser   r   r   rg   r   r   Úgetenvr   rc   r   ÚnowÚstrftimer\   r    r4   r?   rP   rx   Ú__name__Úargvrt   ÚmpÚaÚisdigitÚintrS   r5   r   ú<module>r†      s
  ðã 	ð÷ Ó Û Ý  ß (à3€	Ø€Ø€	ØˆB�I‰I�kÐ#4Ó5€	Ø€	ð QØ�iÑ 'Ñ)ñ€ð
 ˆ(�,‰,‹.™9¨'Ô2Ñ
2×	<Ñ	<¸ZÓ	H€ò
òó&-$ò`ó>_5ðD ˆzÒØ! S§X¡XÐ-€KØ	€BØ�X‰X�a�bˆ\ò ˆØ�9‰9Œ;Ù�Q“ˆBÙØ�‹=ØˆBÙðñ �" +Ö.ð r5   