Ë
    †É…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Zd dlmZmZ d dl	m
Z
 	 d dlmZ dZdZe› d	�Z e j&                  d
d«      ZdZddiZ ej.                  «        ed¬«      z
  j1                  d«      Zd„ Zdd„Zd„ Zd„ Zdd„Zedk(  rRdej@                  v Z!dZ"ej@                  dd D ]%  Z#e#jI                  «       r
 e%e#«      Z" ne#dk(  sŒ#dZ" n  ee"e!¬«       yy# e$ r  ed«        ej                  d«       Y ŒÖw xY w)é    N)ÚdatetimeÚ	timedelta)Úurljoin)Úsync_playwrightuH   éœ€è¦� playwright: pip install playwright && playwright install chromiumé   u   ä¸‡å�ŽåŒ–å­¦zhttps://www.whchem.comz/column/123/Ú	SEARCH_DBz/root/search.dbé   z
User-Agentú[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36iG  )Údaysú%Y-%m-%dc                 óp   — 	 t        j                  | t        d¬«      }d|_        |j                  S #  Y yxY w)z-Fetch detail page with requests (plain HTML).é   )ÚheadersÚtimeoutzutf-8N)ÚrequestsÚgetÚHEADERSÚencodingÚtext)ÚurlÚrs     ú!/root/gov_crawler/crawl_whchem.pyÚ
get_detailr   "   s3   € ðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
Ø�v‰vˆøðÙús   ‚.1 ±5c                 ó¤  — d}t        j                  d| t         j                  «      }|r4t        j                  dd|j	                  d«      «      j                  «       }|s[t        j                  d| t         j                  «      }|r4t        j                  dd|j	                  d«      «      j                  «       }|s|}d}t        j                  d| «      }|rAt        |j	                  d«      «      dz  }t        j                  |«      j                  d«      }|s9t        j                  d	| «      }|r!|j	                  d«      j                  d
d«      }|s2dD ]-  }t        j                  || «      }|sŒ|j	                  d«      } n d}	dD ]N  }
t        j                  d|
› d�| t         j                  «      }|sŒ/|j	                  d«      j                  «       }	 n |	sFt        j                  d| t         j                  «      }|r|j	                  d«      j                  «       }	|	s^t        j                  d| «      }|rFt        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|	«      }	t        j                  dd|	«      }	|	j                  «       }	|||	fS )z.Extract title, date, content from detail page.Ú z.<h1[^>]*class="big_title[^"]*"[^>]*>(.*?)</h1>z<[^>]+>r   z<h1[^>]*>(.*?)</h1>zpubTime=(\d{13})iè  r   z(\d{4}[-/]\d{1,2}[-/]\d{1,2})ú/ú-)u,   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{1,2}-\d{1,2})u,   å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}-\d{1,2}-\d{1,2})z(<em class="date">(\d{4}-\d{1,2}-\d{1,2}))zarticle fnt_16Úarticlez<div[^>]*class="z$"[^>]*>(.*?)</div>\s*</div>\s*</div>z7<div[^>]*class="article[^"]*"[^>]*>(.*?)</div>\s*</div>z!<div[^>]*class="ty-content"[^>]*>uB   <div[^>]*class="ty-content"[^>]*>(.*?)</div>\s*<!--\s*æ­£æ–‡ç»“æ�Ÿz<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z<p>\s*<br\s*/?>\s*</p>z\s*style="[^"]*"z
<!--.*?-->)ÚreÚsearchÚDOTALLÚsubÚgroupÚstripÚintr   ÚfromtimestampÚstrftimeÚreplaceÚI)ÚhtmlÚfallback_titleÚtitleÚtmÚdate_strÚdmÚtsÚpÚmÚcontentÚclsÚcms               r   Úparse_detailr7   ,   s»  € à€Eä	�‰ÐDÀdÌBÏIÉIÓ	V€BÙ	Ü—‘�z 2 r§x¡x°£{Ó3×9Ñ9Ó;ˆÙÜ�Y‰YÐ-¨t´R·Y±YÓ?ˆÙÜ—F‘F˜: r¨2¯8©8°A«;Ó7×=Ñ=Ó?ˆEÙØˆð €HÜ	�‰Ð&¨Ó	-€BÙ	Ü�—‘˜!“Ó Ñ$ˆÜ×)Ñ)¨"Ó-×6Ñ6°zÓBˆÙÜ�Y‰YÐ7¸Ó>ˆÙØ—x‘x “{×*Ñ*¨3°Ó4ˆHÙð?ò 	ˆAô —	‘	˜!˜TÓ"ˆAÚØŸ7™7 1›:�Ùð	ð €GØ,ò ˆÜ�Y‰YÐ)¨#¨Ð.TÐUÐW[Ô]_×]fÑ]fÓgˆÚØ—h‘h˜q“k×'Ñ'Ó)ˆGÙð	ñ
 Ü�Y‰YÐQÐSWÔY[×YbÑYbÓcˆÙØ—h‘h˜q“k×'Ñ'Ó)ˆGÙä�Y‰YÐ;¸TÓBˆÙÜ—‘Ð`ÐbfÔhj×hqÑhqÓrˆBÙØŸ(™( 1›+×+Ñ+Ó-�áÜ—&‘&Ð5°r¸7Ì"Ï)É)ÔVX×VZÑVZÑJZÔ[ˆÜ—&‘&Ð3°R¸ÌÏ	É	ÔTV×TXÑTXÑHXÔYˆÜ—&‘&Ð2°B¸Ó@ˆÜ—&‘&Ð,¨b°'Ó:ˆÜ—&‘&˜¨¨GÓ4ˆØ—-‘-“/ˆà�(˜GÐ#Ð#ó    c                 ó„  — t         › d|› �}t        d|› d|› �«       |dk(  r| j                  t         dd¬«       n| j                  |dd¬«       t        j                  d«       g }	 | j                  d	«      }|s| j                  d
«      }|s| j                  d«      }|D ]t  }|j                  d«      xs d}|j                  «       j                  «       }|r|sŒ;|dv rŒ@|j                  d«      st        t        |«      }|j                  ||dœ«       Œv 	 |S # t        $ r}t        d|› d|› �«       Y d}~|S d}~ww xY w)z1Scrape article list from a page using Playwright.z0#c_portalResGroupNewsNew_list-16139644893080064-z    Loading page z: r   Únetworkidlei0u  )Ú
wait_untilr   é   zO#c_portalResGroupNewsNew_list-16139644893080064 .p_news a[href*='/cmscontent/']zG#c_portalResGroupNewsNew_list-16139644893080064 a[href*='/cmscontent/']za[href*='/cmscontent/']Úhrefr   )u   æ³•å¾‹å£°æ˜Žu   éš�ç§�ä¿�æŠ¤u   ç½‘ç«™å£°æ˜Žu   å…³äºŽæˆ‘ä»¬u   è�”ç³»æˆ‘ä»¬Úhttp©r   r-   z    Error scraping page N)ÚLIST_URLÚprintÚgotoÚtimeÚsleepÚquery_selector_allÚget_attributeÚ
inner_textr%   Ú
startswithr   ÚBASEÚappendÚ	Exception)	Úpw_pageÚpage_numÚhash_urlÚarticlesÚlinksÚlinkr=   r-   Úes	            r   Úscrape_listrS   k   sQ  € ä�ÐKÈHÈ:ÐV€HÜ	Ð˜h˜Z r¨(¨Ð
4Ô5à�1‚}Ø�‰”X¨-ÀˆÕGà�‰�X¨-ÀˆÔGä‡J�Jˆq„Mð €Hð:à×*Ñ*Ð+|Ó}ˆÙà×.Ñ.Ð/xÓyˆEÙà×.Ñ.Ð/HÓIˆEàò 		;ˆDØ×%Ñ% fÓ-Ò3°ˆDØ—O‘OÓ%×+Ñ+Ó-ˆEÙ™uØØÐhÑhØØ—?‘? 6Ô*Üœt TÓ*�Ø�O‰O D°5Ñ9Õ:ñ		;ð €Oøô ò :ÜÐ(¨¨
°"°Q°CÐ8×9Ð9à€Oûð:ús   Á'B0D Ä	D?Ä#D:Ä:D?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_nameéÈ   Ú
source_urlÚpage_urlr-   Úpublish_dateÚsummaryr4   ÚstatusÚcategoryÚtagsr   )ÚexecuteÚtotal_changes)ÚdbÚrecordsÚinsertedÚskippedÚitems        r   Ú
push_to_dbre   •   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                 óN  ‡— | €t         } t        j                  t        d¬«      }|j	                  d«       t        d„ |j	                  dt        f«      j                  «       D «       «      Št        dt        ‰«      › �«       g }t        «       5 }|j                  j                  ddd	g¬
«      }|j                  d¬«      }|j                  «       }	 t        d| dz   «      D ]ï  }t!        ||«      }	t        «       }
|	D ]%  }|d   |
v s|d   ‰v rŒ|
j#                  |d   «       Œ' t        dt        |	«      › dt        |
«      › �«       |	st        d|› d�«        ny|j%                  ˆfd„|	D «       «       |r3t        |	«      dkD  r%t'        ˆfd„|	D «       «      rt        d|› d�«        n*t        |	«      dk  sŒ×t        dt        |	«      › d�«        n |j)                  «        	 d d d «       |st        d«       |j)                  «        y t        dt        |«      › d�«       g }t+        |«      D ]µ  \  }}t-        |d   «      }|st        d|dz   › dt        |«      › d �«       Œ5t/        ||d!   «      \  }}}|j1                  t        |d   d d" |d   |xs |d!   d d" |r|d d# nd$|xs |d!   d d" |d%d$d$d&œ
«       |dz   d#z  dk(  sŒ˜t        d|dz   › dt        |«      › d'�«       Œ· |D �cg c]  }|d(   r|d(   t2        k\  s|d(   rŒ|‘Œ }}t5        ||«      \  }}|j7                  «        |j	                  d)t        f«       |j7                  «        |j)                  «        t        d*|› d+|› d,t        |«      › �«       y # |j)                  «        w xY w# 1 sw Y   �Œ´xY wc c}w )-Né<   )r   z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: Tz--no-sandboxz--disable-setuid-sandbox)ÚheadlessÚargsr
   )Ú
user_agentr   r   z
    Found z articles, new: z    No articles on page z
, stoppingc              3   óB   •K  — | ]  }|d    ‰vr|d    |d   dœ–— Œ y­w)r   r-   r?   Nri   ©rj   ÚartÚknowns     €r   rk   zrun.<locals>.<genexpr>Û   s2   øè ø€ ò !àØ˜5‘z¨Ñ.ð   ™J°°W±Õ>ñ!ùs   ƒr   c              3   ó,   •K  — | ]  }|d    ‰v –— Œ y­w)r   Nri   rp   s     €r   rk   zrun.<locals>.<genexpr>ã   s   øè ø€ ÒC°3˜3˜u™:¨Ô.ÑCùs   ƒz    All articles on page z already in DB, stoppingé   z    Last page reached (z < 8)z  No new items to processz  Fetching details for z articles...z    [r   z] SKIP (fetch failed)r-   iô  é
   r   Úactive)
rU   rW   rX   r-   rY   rZ   r4   r[   r\   r]   ú]rY   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=z, date_filtered=)Ú	MAX_PAGESÚsqlite3Úconnectr   r^   ÚsetÚ	SITE_NAMEÚfetchallrA   Úlenr   ÚchromiumÚlaunchÚnew_contextÚnew_pageÚrangerS   ÚaddÚextendÚallÚcloseÚ	enumerater   r7   rJ   ÚCUTOFFre   Úcommit)Ú	max_pagesÚincrementalr`   Ú	all_itemsr2   ÚbrowserÚcontextÚpageÚpgrO   Ú	seen_urlsrq   ÚresultsÚird   r+   r-   r/   r4   r   rb   rc   rr   s                         @r   Úrunr•   ´   sâ  ø€ ØÐÜˆ	ä	�‰œ¨BÔ	/€BØ‡J�JÐ(Ô)äñ à—‘Ø<¼y¸ló
ç
‰(‹*ô	ó €Eô 
ˆOœC ›J˜<Ð
(Ô)à€Iä	Ó	ð (˜aØ—*‘*×#Ñ#¨T¸ÐIcÐ8dÐ#ÓeˆØ×%Ñ%Øtð &ó 
ˆð ×ÑÓ!ˆð!	Ü˜A˜y¨1™}Ó-ò �Ü& t¨RÓ0�ä›E�	Ø#ò .�CØ˜5‘z YÑ.°#°e±*ÀÑ2EØ Ø—M‘M # e¡*Õ-ð.ô ˜
¤3 x£= /Ð1AÄ#ÀiÃ.ÐAQÐRÔSáÜÐ4°R°D¸
ÐCÔDÙà× Ñ ó !à'ô!ô ñ ¤3 x£=°1Ò#4äÓC¸(ÔCÔCÜÐ 9¸"¸Ð=UÐVÔWÙô �x“= 1Ó$ÜÐ3´C¸³M°?À%ÐHÔIÙð;ð@ �M‰M�O÷Q(ñT ÜÐ)Ô*Ø
�‰Œ
Øä	Ð#¤C¨	£NÐ#3°<Ð
@ÔAà€GÜ˜YÓ'ò 3‰ˆˆ4Ü˜$˜u™+Ó&ˆÙÜ�E˜!˜A™#˜˜a¤ I£Ð/Ð/DÐEÔFØÜ#/°°d¸7±mÓ#DÑ ˆˆx˜Ø�‰ä&Ø" 5™k¨$¨3Ð/Ø  ™KØÒ0 4¨¡=°$°3Ð7Ù19 ¨¨"¡¸rØ!Ò2 T¨'¡]°D°SÐ9Ø"Ø"ØØñô	
ð �‰E�R‰<˜1ÓÜ�E˜!˜A™#˜˜a¤ I£Ð/¨qÐ1Õ2ð+3ð0 "Ör�Q a¨Ò&7¸A¸nÑ<MÔQWÒ<WÐ`aÐbpÓ`qŠqÐr€GÐrä" 2 wÓ/Ñ€HˆgØ‡I�I„Kð ‡J�Jð	ô
 
ˆôð ‡I�I„KØ‡H�H„Jä	ˆL˜˜
 '¨'¨Ð2BÄ3ÀwÃ<À.Ð
QÕRøðg �M‰M�Oú÷Q(ñ (üòT ss8   ÂANÃC%N Æ7N ÇNË*N"ÌN"Î NÎNÎNÚ__main__z--incrementalz--test)r‹   rŒ   )r   )NF)&ÚosÚsysr    ry   rC   Újsonr   r   r   Úurllib.parser   Úplaywright.sync_apir   ÚImportErrorrA   Úexitr|   rI   r@   Úgetenvr   rx   r   Únowr(   r‰   r   r7   rS   re   r•   Ú__name__ÚargvrŒ   ÚmpÚaÚisdigitr&   ri   r8   r   ú<module>r¥      s?  ðã 	ð÷ $× #Ó #Û ß (Ý  ðÝ3ð
 €	Ø€ØˆV�<Ð €ØˆB�I‰I�kÐ#4Ó5€	Ø€	ð ð 3ð€ð
 ˆ(�,‰,‹.™9¨'Ô2Ñ
2×	<Ñ	<¸ZÓ	H€òó<$ò~'òTó>lSð^ ˆzÒØ! S§X¡XÐ-€KØ	€BØ�X‰X�a�bˆ\ò ˆØ�9‰9Œ;Ù�Q“ˆBÙØ�‹=ØˆBÙðñ �" +Ö.ð øðg ò Ù	Ð
TÔUØ€C‡H�HˆQ†Kðús   ­C( Ã(D
Ä	D
