Ë
    †É…jÀ  ã                   óî  — 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Z e j                  dd«      Z	dZ
dZedz   Z ej                  «        ed¬	«      z
  j                  d
«      ZddiZdadada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dd„Zd„ Zd„ Z d„ Z!e"dk(  r e!«        yy)é    N)ÚdatetimeÚ	timedeltaÚ	SEARCH_DBz/root/search.dbu%   å�‰æž—çœ�ç”Ÿæ€�çŽ¯å¢ƒåŽ…-å�—ç�†å…¬ç¤ºzhttp://sthjt.jl.gov.cnz/ywdt/gkgs/gszx/slgs/iG  )Údaysz%Y-%m-%dú
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36é   z[AutoPg] max_pages=c                  ó  — t         �t         S ddlm}   | «       j                  «       }|j                  j                  ddg¬«      at        j                  t        d   ddd	œ¬
«      a	t        j                  «       a t         S )Nr   )Úsync_playwrightTz--disable-dev-shm-usage)ÚheadlessÚargsr   i€  i8  )ÚwidthÚheight)Ú
user_agentÚviewport)Ú_pw_pageÚplaywright.sync_apir
   ÚstartÚchromiumÚlaunchÚ_pw_browserÚnew_contextÚHEADERSÚ_pw_contextÚnew_page)r
   Ú_pw_plays     ú /root/gov_crawler/crawl_jilin.pyÚ_get_pw_sessionr      sz   € äÐÜˆÝ3ÙÓ ×&Ñ&Ó(€HØ×#Ñ#×*Ñ*°DÐ@YÐ?ZÐ*Ó[€KÜ×)Ñ)Ü˜<Ñ(Ø¨4Ñ0ð *ó €Kô ×#Ñ#Ó%€HÜ€Oó    c                  ó¦   — t         r t         j                  j                  «        d a t        rt        j                  «        d ay y #  Y Œ$xY w#  Y ŒxY w)N)r   ÚcontextÚcloser   © r   r   Ú	_close_pwr#   (   sF   € åÜ×Ñ×#Ñ#Ô%àˆÝÜ×ÑÔ à‰ð øð 	‘ûð 	‘ús   ‡A ­A ÁA	ÁAc                 ó2  — 	 t        j                  | t        d¬«      }d|_        |j                  }d|dd vr|S 	 t        d«      D ]€  }	 t        «       }|j                  | dd	¬
«       t        j                  d«       |j                  «       }d|v sd|v sd|v r|c S d|v r#t        dd¬«       t        j                  d«       Œ~|c S  y# t
        $ r Y Œšw xY w# t
        $ r4}t        d|dz   |fz  d¬«       t        j                  d«       Y d}~ŒËd}~ww xY w)zETry requests first, fall back to Playwright if WAF challenge detectedé   )ÚheadersÚtimeoutzutf-8õ   æµ�è§ˆå™¨çŽ¯å¢ƒæ£€æŸ¥Néô  é   Únetworkidlei0u  )Ú
wait_untilr'   r   Úcurrency_ul_listÚTRS_UEDITORÚArticleTitlez  WAF still active, retrying...T©Úflushé   z  PW attempt %d error: %sÚ )ÚrequestsÚgetr   ÚencodingÚtextÚ	ExceptionÚranger   ÚgotoÚtimeÚsleepÚcontentÚprint)ÚurlÚis_listÚrÚhtmlÚattemptÚpageÚes          r   Ú
fetch_pagerF   3   s  € ðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
Ø�v‰vˆØ"¨$¨t°¨*Ñ4ØˆKð 5ô ˜“8ò ˆð	Ü"Ó$ˆDØ�I‰I�c m¸UˆIÔCÜ�J‰J�qŒMØ—<‘<“>ˆDØ! TÑ)¨]¸dÑ-BÀnÐX\ÑF\Ø’Ø&¨$Ñ.ÜÐ7¸tÕDÜ—
‘
˜1”ØØŠKðð  øô) ò Ùðûô" ò 	ÜÐ-°¸±¸A°Ñ>ÀdÕKÜ�J‰J�q�M‰Mûð	ús6   ‚7C
 Á
ACÂ&CÃCÃ
	CÃCÃ	DÃ"*DÄDc                 óð  — | dk(  r
t         dz   }nt         d| z  z   }t        |«      }|rd|vrt        d| z  d¬«       g dfS g }t        j                  d	|t        j
                  «      D ]É  }|j                  d
«      j                  «       }|j                  d«      j                  «       }|j                  d«      j                  «       }|j                  d«      sA|j                  d«      rt         |dd  z   }n#|j                  d«      r	t        |z   nt         |z   }|j                  |d d ||dœ«       ŒË d }t        j                  d|«      }|rt        |j                  d
«      «      }|r| d
z   |k  nd}	||	fS )Nr   z
index.htmlzindex_%d.htmlr-   z  List page %d empty (WAF?)Tr0   FzW<li[^>]*>\s*<a\s+href="([^"]+)"[^>]*title="([^"]*)"[^>]*>.*?</a>\s*<span>([^<]+)</span>r   r2   r*   Úhttpz./ú/r)   )Útitler?   Údatezvar countPage\s*=\s*(\d+))ÚLIST_PREFIXrF   r>   ÚreÚfinditerÚDOTALLÚgroupÚstripÚ
startswithÚBASE_URLÚappendÚsearchÚint)
rD   r?   rB   ÚitemsÚmrJ   rK   Útotal_pagesÚpmÚhas_mores
             r   Úget_list_pager\   Q   sn  € Øˆq‚yÜ˜LÑ(‰ä˜O¨dÑ2Ñ2ˆÜ�c‹?€DÙÐ%¨TÑ1ÜÐ+¨dÑ2¸$Õ?Ø�5ˆyÐØ€EÜ�[‰[ÐsÐuyÔ{}÷  |Eñ  |Eó  Fò 	GˆØ�g‰g�a‹j×ÑÓ ˆØ—‘˜“
× Ñ Ó"ˆØ�w‰w�q‹z×ÑÓ!ˆØ�~‰~˜fÔ%Ø�~‰~˜dÔ#Ü! C¨¨ GÑ+‘à(+¯©°sÔ(;”h ’nÄÈsÑAR�Ø�‰˜u T c˜{°3ÀÑEÕFð	Gð €KÜ	�‰Ð/°Ó	6€BÙ	Ü˜"Ÿ(™( 1›+Ó&ˆÙ)4ˆt�a‰x˜+Ò%¸$€HØ�(ˆ?Ðr   c                 ó  — t        j                  d| t         j                  «      }|r|j                  d«      j	                  «       S t        j                  d| t         j                  «      }|r|j                  d«      j	                  «       S y)NzK<div\s+class="trs_editor_view\s+TRS_UEDITOR[^"]*"[^>]*>(.*?)</div>\s*</div>r   z&id="content"[^>]*>(.*?)</div>\s*</div>r3   )rM   rU   rO   rP   rQ   )rB   rX   Úm2s      r   Úextract_contentr_   l   sk   € Ü
�	‰	Ð`ÐbfÔhj×hqÑhqÓr€AÙØ�w‰w�q‹z×ÑÓ!Ð!Ü	�‰Ð<¸dÄBÇIÁIÓ	N€BÙ	Ø�x‰x˜‹{× Ñ Ó"Ð"Ør   c                  ó  — t        dt        z  d¬«       t        dt        z  d¬«       g } d}	 t        |«      \  }}|s|dk(  rt        dd¬«       y nr|D ]   }|d   t        k\  sŒ| j	                  |«       Œ" |d   d   }|t        k  s|sn9|d	z  }t
        r
|t
        k\  rn$|d
z  dk(  rt        d|t        | «      fz  d¬«       Œ–t        dt        | «      z  d¬«       t        j                  t        d¬«      }|j                  «       }d}d}	t        | «      D �]Ÿ  \  }
}t        |d   «      }|rd|d d v r"|	d	z  }	t        d|d   d d ›d|d   ›�d¬«       Œ@|d   }t        j                  d|«      }|rA|j                  d	«      j!                  «       r"|j                  d	«      j!                  «       d d }|d   }t        j                  d|«      }|r&|j                  d	«      j!                  «       d d }|r|}t#        |«      }|s|	d	z  }	t        d|d d ›d|›�d¬«       �Œt%        d«      D ]5  }	 |j'                  d|d   |d   t        |||d   |k7  r|d   nd|df«        n |d	z  }|
d	z   dz  dk(  s�Œ`t%        d«      D ]  }	 |j1                  «         n t        d |
d	z   t        | «      fz  d¬«       �Œ¢ |j1                  «        |j3                  «        t5        «        t        d!||	fz  d¬«       y # t        j(                  $ r3}dt+        |«      v r |dk  rt-        j.                  d	«       Y d }~�Œ
‚ d }~ww xY w# t        j(                  $ r-}dt+        |«      v rt-        j.                  d	«       Y d }~Œø‚ d }~ww xY w)"Nz
=== %s ===Tr0   z
Cutoff: %sr   z  First page empty, aborting!rK   éÿÿÿÿr   é   z&  Scanned page %d (%d items so far)...zItems in 3yr range: %dé<   )r'   r?   r(   r)   z  FAIL rJ   é(   z | z/<meta\s+name="ArticleTitle"\s+content="([^"]*)"z*<meta\s+name="PubDate"\s+content="([^"]*)"é
   z  EMPTY r*   zªINSERT OR REPLACE INTO gov_raw
                (source_url, page_url, site_name, title, content, summary, publish_date, category)
                VALUES (?,?,?,?,?,?,?,?)r3   ÚeiaÚlockedr2   z  Progress: %d/%dzDone: %d inserted, %d empty)r>   Ú	SITE_NAMEÚCUTOFFr\   rT   Ú_MAX_PGÚlenÚsqlite3Úconnectr   ÚcursorÚ	enumeraterF   rM   rU   rP   rQ   r_   r9   ÚexecuteÚOperationalErrorÚstrr;   r<   Úcommitr!   r#   )Ú	all_itemsrD   rW   r[   ÚitemÚ	last_dateÚconnÚcÚinsertedÚemptyÚidxrB   rJ   ÚmtrK   ÚmdÚdr=   rC   rE   Ú_s                        r   Úcrawlr€   u   s“  € Ü	ˆ,œÑ
"¨$Õ/Ü	ˆ,œÑ
 tÕ,Ø€IØ€DØ
Ü'¨Ó-‰ˆˆxÙØ�qŠyÜÐ5¸TÕBØØØò 	'ˆDØ�F‰|œvÓ%Ø× Ñ  Õ&ð	'ð ˜"‘I˜fÑ%ˆ	Ø”vÒ¡XØØ�‰	ˆÝ�tœw’¨Ø�!‰8�qŠ=ÜÐ:¸dÄCÈ	ÃNÐ=SÑSÐ[_Õ`ð! ô" 
Ð
"¤S¨£^Ñ
3¸4Õ@Ü�?‰?œ9¨bÔ1€DØ�‰‹€AØ€HØ€EÜ˜yÓ)ó /O‰	ˆˆTÜ˜$˜u™+Ó&ˆÙÐ.°$°t¸°*Ñ<Ø�Q‰JˆEÝ d¨7¡m°C°RÒ&8¸$¸vº,ÐGÈtÕTØØ�W‘ˆÜ�Y‰YÐIÈ4ÓPˆÙ�"—(‘(˜1“+×#Ñ#Ô%Ø—H‘H˜Q“K×%Ñ%Ó'¨¨Ð-ˆEØ�F‰|ˆÜ�Y‰YÐDÀdÓKˆÙØ—‘˜“×!Ñ!Ó# C RÐ(ˆAÙØ�Ü! $Ó'ˆÙØ�Q‰JˆEÝ u¨S¨b¢z±4Ð8ÀÕEÙÜ˜Q“xò 	ˆGðØ—	‘	ð ,ð ˜‘K  e¡¬i¸ÀØ%)¨'¡]°eÒ%;�D˜’MÀØ˜%ð.ôñ ð	ð 	�A‰ˆØ�!‰G�r‰>˜QÔÜ˜1“Xò �ðØ—K‘K”MÙðô Ð%¨¨q©´#°i³.Ð(AÑAÈ×Nð_/Oð` 	‡K�K„MØ‡J�J„LÜ„KÜ	Ð
'¨8°UÐ*;Ñ
;À4ÖHøô) ×+Ñ+ò Øœs 1›vÑ%¨'°Aª+Ü—J‘J˜q”MÝØûð	ûô ×/Ñ/ò Ø¤3 q£6Ñ)ÜŸ
™
 1œÜ Øûð	ús<   È11K7ÊM Ë7L=Ì
'L8Ì7L8Ì8L=Í N Í"M;Í:M;Í;N Ú__main__)F)#ÚosÚsysrM   r4   r;   r   r   rl   Úgetenvr   rh   rS   rL   ÚnowÚstrftimeri   r   r   r   r   Ú_SYSrk   ÚargvÚisdigitrV   rj   r>   rr   r   r#   rF   r\   r_   r€   Ú__name__r"   r   r   ú<module>r‹      s  ðã 	Ø Eß "× "Ó "ß (Û àˆB�I‰I�kÐ#4Ó5€	Ø3€	Ø#€ØÐ0Ñ0€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€ØÐWÐ
X€ð €Ø€Ø€Û Ù" 4§9¡9›~°Ò1°d·i±iÀ±l×6JÑ6JÔ6L‰#ˆd�i‰i˜‰lÔ
ÐRV€Ø
ÐÙ	Ð
¡# g£,Ñ
.Ô/òò	óò<ò6òNIð` ˆzÒÙ	…Gð r   