Ë
    ­�jð$  ã                   ó
  — 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ZdZdZ ej                  «        ed¬	«      z
  j                  d
«      ZdZdZdZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zedk(  r e«        yy)u°  ç®€é˜³å¸‚äººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Šæ �ç›®çˆ¬è™«
ç«™ç‚¹: https://www.scjy.gov.cn (å››å·�æˆ�éƒ½, /jianyang/ ç«™ç¾¤)
æ �ç›®: /jianyang/c123218/list_more.shtml (å…¬ç¤ºå…¬å‘Š, å½“å‰� 5 æ�¡é�™æ€�)
WAF: ç‘žæ•°4ä»£ JS æŒ‘æˆ˜ (412, $_ts) â†’ Playwright è¿‡æŒ‘æˆ˜
åˆ—è¡¨: list_more.shtml é�™æ€�æ�¡ç›® <a class="special_content_list" href="...">æ ‡é¢˜</a> (æ— æ—¥æœŸ, æ ‡é¢˜å�¯èƒ½æˆªæ–­å¸¦...)
è¯¦æƒ…: fetch â†’ meta ArticleTitle(å®Œæ•´æ ‡é¢˜)/PubDate + div.main_bd æ­£æ–‡ (å›¾ç‰‡åž‹å…¬å‘Š img ç›¸å¯¹è·¯å¾„ç»�å¯¹åŒ–)
å…¥åº“: è‡ªåŠ¨æ£€æµ‹ /root/search.db å­˜åœ¨åˆ™ INSERT OR IGNORE ç›´æ�’ gov_raw (FTS è§¦å�‘å™¨è‡ªåŠ¨å�Œæ­¥ gov_search)
è¿�è¡Œ: python3 crawl_jianyang_gsgg.py [--no-db] [--sync-only]
é    N)ÚdatetimeÚ	timedelta)Úsync_playwrightu   ç®€é˜³å¸‚-å…¬ç¤ºå…¬å‘Šzhttps://www.scjy.gov.cnz8https://www.scjy.gov.cn/jianyang/c123218/list_more.shtmliG  )Údaysz%Y-%m-%dzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z/tmp/jianyang_gsgg.jsonlz/root/search.dbu   å…¬ç¤ºå…¬å‘Šc                 óæ   — t        j                  dd| xs d«      j                  «       } | j                  dd«      j                  dd«      } t        j                  dd| «      j                  «       } | S )Nu   ^[â€¢Â·Â·.\s]+Ú u   â€‹u   ï»¿z\.{3,}$)ÚreÚsubÚstripÚreplace©Úts    ú(/root/gov_crawler/crawl_jianyang_gsgg.pyÚclean_titler      s_   € Ü
�‰Ð  " a¢g¨2Ó.×4Ñ4Ó6€AØ	�	‰	�(˜BÓ×'Ñ'¨°"Ó5€AÜ
�‰ˆz˜2˜qÓ!×'Ñ'Ó)€AØ€Hó    c                 ó  — ddl m}  || d«      }|j                  d„ «      D ]  }|j                  «        Œ |j                  ddg«      D ]  }|j	                  «        Œ 	 |j                  d«      D �cg c]  }|j                  d«      sŒ|‘Œ }}|sn|d   j	                  «        ŒG|j                  d«      D ]?  }|j                  d«      sŒ|j                  d	«      rd	|j                  d	«      ini |_        ŒA t        |«      S c c}w )
u@   æ­£æ–‡æ¸…æ´—: span/font unwrap + åµŒå¥—pæ‰�å¹³åŒ– + ä¿�ç•™è¡¨æ ¼r   )ÚBeautifulSoupzhtml.parserc                 ó:   — | j                   xr d| j                   v S )Nú:)Únamer   s    r   ú<lambda>zclean_content.<locals>.<lambda>#   s   €  q§v¡vÒ'?°#¸¿¹°-€ r   ÚspanÚfontÚpÚstyleÚalign)	Úbs4r   Úfind_allÚ	decomposeÚunwrapÚfindÚgetÚattrsÚstr)Úhtmlr   ÚsoupÚtagr   Únesteds         r   Úclean_contentr)      sø   € å!Ù˜˜}Ó-€DØ�}‰}Ñ?Ó@ò ˆØ�‰�ðà�}‰}˜f fÐ-Ó.ò ˆØ�
‰
�ðð Ø!Ÿ]™]¨3Ó/Ö?˜°1·6±6¸#µ;’!Ð?ˆÐ?ÙØØˆq‰	×ÑÔð	 ð
 �]‰]˜3Óò JˆØ�5‰5��>Ø34·5±5¸´>�w §¡ g£Ñ/ÀrˆA�GðJô ˆt‹9Ðùò @s   Á3DÂ
Dc                 ó
  — g }t        j                  d| t         j                  t         j                  z  «      D �]  }|j	                  d«      j                  «       |j	                  d«      }}|r|j                  d«      rŒHt        j                  d|t         j                  «      sŒnt        j                  dd|«      j                  «       dd	 }|j                  d
«      r
t        |z   }n,|j                  d«      s|j                  d
d«      d   d
z   |z   }|j                  |xs |j                  d
«      d   |dœ«       �Œ	 t        «       }g }|D ]/  }	|	d   |vsŒ|j                  |	d   «       |j                  |	«       Œ1 |S )u>   æ­£æ–‡å†…é™„ä»¶: <a href="*.doc/pdf..."> ç›¸å¯¹è·¯å¾„ç»�å¯¹åŒ–z$<a[^>]+href="([^"]+)"[^>]*>(.*?)</a>é   é   Ú
javascriptz#\.(pdf|docx?|xlsx?|zip|rar|7z|doc)$ú<[^>]+>r   Néd   ú/Úhttpr   éÿÿÿÿ)r   Úurlr3   )r	   ÚfinditerÚIÚSÚgroupr   Ú
startswithÚsearchr
   ÚBASEÚrsplitÚappendÚsplitÚsetÚadd)
Ú	html_fragÚ
detail_urlÚattsÚmÚhrefÚ	name_htmlr   ÚseenÚuniqÚas
             r   Úextract_attachmentsrI   3   sO  € à€DÜ�[‰[Ð@À)ÌRÏTÉTÔTV×TXÑTXÉ[ÓYó 
LˆØŸ'™' !›*×*Ñ*Ó,¨a¯g©g°a«jˆiˆÙ�t—‘ |Ô4ØÜ�9‰9Ð;¸TÄ2Ç4Á4ÕHÜ—6‘6˜* b¨)Ó4×:Ñ:Ó<¸T¸cÐBˆDØ�‰˜sÔ#Ü˜d‘{‘Ø—_‘_ VÔ,Ø!×(Ñ(¨¨aÓ0°Ñ3°cÑ9¸DÑ@�Ø�K‰K Ò!<¨¯©°C«¸Ñ)<ÀTÑJÖKð
Lô ‹5€DØ€DØò ˆØˆU‰8˜4ÒØ�H‰H�Q�u‘XÔØ�K‰K˜�Nðð €Kr   c                 ó”   — t        d«      D ]  }	 | j                  d|«      c S  y# t        $ r t        j                  d«       Y Œ:w xY w)u   é¡µé�¢å†… fetch, å¤±è´¥é‡�è¯•r,   zAasync (u) => { const r = await fetch(u); return await r.text(); }N)ÚrangeÚevaluateÚ	ExceptionÚtimeÚsleep)Úpager3   Ú_s      r   Ú
fetch_htmlrR   I   sN   € ä�1‹Xò ˆð	Ø—=‘=Ð!hÐjmÓnÒnðð
 øô ò 	Ü�J‰J�qŽMð	ús   �&¦AÁAc                 ó´  — | syt         j                  j                  t        «      st	        dt        › d�d¬«       yt        j                  t        d¬«      }|j                  d«       d	x}}|j                  «       }| D ]�  }	 |j                  d
t        |d   |d   |d   |d   |d   |d   xs dd d t        d|d   |j                  dd«      |j                  dd«      f«       |j                  d	kD  r|dz  }n|dz  }|j                  «        Œ‘ |j                  «        ||fS # t
        j                  $ r}t	        d|› �d¬«       |dz  }Y d }~ŒSd }~ww xY w)N)r   r   u     æœªå�‘çŽ° u   , è·³è¿‡å…¥åº“ (ä»…å†™ JSONL)T©Úflushi"  )ÚtimeoutzPRAGMA busy_timeout=290000r   zçINSERT OR IGNORE INTO gov_raw
                   (site_name, source_url, page_url, title, publish_date, content, summary, category, script_name, attachments, group_name, industry)
                   VALUES (?,?,?,?,?,?,?,?,?,?,?,?)r3   ÚtitleÚpub_dateÚcontentr   iô  zcrawl_jianyang_gsgg.pyÚattachmentsÚ
group_nameõ   å››å·�ÚindustryÚotherr+   z
  DB err: )ÚosÚpathÚexistsÚDB_PATHÚprintÚsqlite3ÚconnectÚexecuteÚcursorÚ	SITE_NAMEÚCATEGORYr"   ÚrowcountÚErrorÚcommitÚclose)ÚresultsÚconnÚaddedÚskippedÚcurÚrÚes          r   Ú
push_to_dbru   R   s[  € ÙØÜ�7‰7�>‰>œ'Ô"Ü�œW˜IÐ%BÐCÈ4ÕPØÜ�?‰?œ7¨CÔ0€DØ‡L�LÐ-Ô.ØÐ€EˆGØ
�+‰+‹-€CØò ˆð	Ø�K‰Kð7ô ˜A˜e™H a¨¡h°°'±
¸A¸j¹MÈ1ÈYÉ<Ø�I‘,Ò$ " d sÐ+¬XÐ7OÐQRÐS`ÑQaØ—‘�| XÓ.°·±°jÀ'Ó0JðLô	ð �|‰|˜aÒØ˜‘
‘à˜1‘�ð 	�‰�ð#ð$ 	‡J�J„LØ�'ˆ>Ðøô �}‰}ò 	Ü�J˜q˜cÐ"¨$Õ/Ø�q‰L�Gûð	ús   ÂA<D%Ä%EÄ8EÅEc                  ó¨  ‡— dt         j                  v } dt         j                  v rt        dd¬«       y t        dt        › dt        › �d¬«       g }ddddd	œ}t        «       5 }|j                  j                  dg d
¢¬«      }|j                  t        ddddœd¬«      }|j                  «       }	 |j                  t        dd¬«       d}t        d«      D ]O  }|j                  d«       	 |j!                  «       }	d|	vsŒ*t#        |	«      dkD  sŒ9t        d|dz  › d�d¬«       d} n |s't        dd¬«       |j%                  «        	 d d d «       y t'        j(                  d	t&        j*                  «      }
|
s%t'        j(                  d|	t&        j*                  «      }
t        dt#        |
«      › �d¬«       |
D �]ÿ  \  }}|d xx   d!z  cc<   t-        t'        j.                  d"d#|«      «      }|j1                  d$«      r|nt2        |z   Št5        |‰«      }|st        d%|d d& › �d¬«       Œr|d'xx   d!z  cc<   t'        j6                  d(|«      }|rt-        |j9                  d!«      «      n|}t'        j6                  d)|«      }|r|j9                  d!«      nd#d d* }|r|t        k  r|d+xx   d!z  cc<   Œút'        j6                  d,|t&        j*                  «      }|r|j9                  d!«      nd#}|rt;        |«      nd#}t'        j.                  d"d#|«      j=                  «       }t#        |«      d*k  r&d-|vr"t        d.|d d& › �d¬«       |d/xx   d!z  cc<   �Œœd-|v rt'        j.                  d0ˆfd1„|«      }t?        |‰«      }t        |||‰‰d2d3|rtA        jB                  |d¬4«      nd#d5œ	}|jE                  |«       �Œ |j%                  «        d d d «       tG        ||«       | s"tI        |«      \  }}t        d6|› d7|› d8�d¬«       t        d9|d    › d:|d'   › d;|d/   › d<|d+   › d8�	d¬«       y # t        $ r Y �Œmw xY w# t        $ r Y �Œpw xY w# 1 sw Y   Œ€xY w)=Nz--no-dbz--sync-onlyu2   sync-only: æŠ“å�–+å…¥åº“ä¸€ä½“, æ— éœ€å�•ç‹¬å�Œæ­¥TrT   u   ç«™ç‚¹: z	 CUTOFF: r   )ÚlistÚ	detail_okÚemptyÚcutoff)z--no-sandboxz---disable-blink-features=AutomationControlledz--disable-dev-shm-usage)ÚheadlessÚargszzh-CNiV  i„  )ÚwidthÚheight)Ú
user_agentÚlocaleÚviewportÚignore_https_errorsi`ê  rl   )rV   Ú
wait_untilFé   i¸  z$_tsiˆ  u   ç‘žæ•°æŒ‘æˆ˜é€šè¿‡ é   Úsu   æŒ‘æˆ˜å¤±è´¥!zq<a[^>]+href="(/jianyang/c123218/\d{4}-\d{2}/\d{2}/content_[^"]+)"[^>]*class="special_content_list"[^>]*>(.*?)</a>zW<a[^>]+href="(/jianyang/c123218/[^"]+)"[^>]*class="special_content_list"[^>]*>(.*?)</a>u   åˆ—è¡¨æ�¡ç›®: rw   r+   r.   r   r1   u       è¯¦æƒ…å¤±è´¥: é   rx   z3<meta[^>]+name="ArticleTitle"[^>]+content="([^"]+)"z.<meta[^>]+name="PubDate"[^>]+content="([^"]+)"é
   rz   zA<div[^>]*class="main_bd"[^>]*>(.*?)</div>\s*<div[^>]*class="xgfj"z<imgu       ç©ºæ­£æ–‡è·³è¿‡: ry   z(<img[^>]+src=")([^"]+)(")c                 ór  •— | j                  d«      | j                  d«      j                  d«      r| j                  d«      na| j                  d«      j                  d«      rt        | j                  d«      z   n)‰j                  dd«      d   dz   | j                  d«      z   z   | j                  d«      z   S )Nr+   r,   r1   r0   r   r…   )r7   r8   r:   r;   )ÚmmrA   s    €r   r   zmain.<locals>.<lambda>»   s  ø€ ˜rŸx™x¨›{¸R¿X¹XÀa»[×=SÑ=SÐTZÔ=[¨b¯h©h°q¬kÐxz÷  yAñ  yAð  BCó  yD÷  yOñ  yOð  PSô  yTÔbfÐik×iqÑiqÐrsÓitÒbtð  Zd÷  Zkñ  Zkð  loð  qró  Zsð  tuñ  Zvð  y|ñ  Z|ð  A÷  Gñ  Gð  HIó  Jñ  ZJñ   Lð  OQ÷  OWñ  OWð  XYó  OZñ   Z€ r   r\   r^   ©Úensure_ascii)	Ú	site_namerW   rX   rY   Ú
source_urlr3   r[   r]   rZ   u   === å…¥åº“: æ–°å¢žu    è·³è¿‡z ===u   === å®Œæˆ�: åˆ—è¡¨u	    è¯¦æƒ…OKu    ç©ºu
    CUTOFFæˆª)%ÚsysÚargvrc   rh   ÚCUTOFFr   ÚchromiumÚlaunchÚnew_contextÚUAÚnew_pageÚgotoÚLIST_1rM   rK   Úwait_for_timeoutrY   Úlenrm   r	   Úfindallr6   r   r
   r8   r:   rR   r9   r7   r)   r   rI   ÚjsonÚdumpsr<   Úsave_resultsru   )Úno_dbrn   Ústatsr   ÚbrowserÚctxrP   ÚpassedÚir%   ÚitemsrD   Út_htmlÚ
list_titleÚdetail_htmlrC   rW   rX   Úcontent_htmlrY   ÚtextrB   Úrecrp   rq   rA   s                            @r   Úmainr¬   q   s–  ø€ ØœŸ™Ð!€EØœŸ™Ñ ÜÐBÈ$ÕOØÜ	ˆH”Y�K˜y¬¨Ð
1¸Õ>à€GØ Q°¸aÑ@€EÜ	Ó	ð Q˜aØ—*‘*×#Ñ#ØÚmð $ó oˆð ×!Ñ!¬R¸ÐTXÐdgÑJhð  CÐ!ó  DˆØ�|‰|‹~ˆð	Ø�I‰I”f e¸ˆIÔAð ˆÜ�r“ò 		ˆAØ×!Ñ! $Ô'ðØ—|‘|“~�ð ˜TÒ!¤c¨$£i°$Ó&6ÜÐ+¨A¨a©C¨5°Ð2¸$Õ?Ø�Ùð		ñ Ü�/¨Õ.Ø�M‰MŒOØ÷5Qð Qô: —
‘
ð  Pð  RVô  XZ÷  X\ñ  X\ó  ]ˆÙÜ—J‘JÐyÐ{ô  BD÷  BFñ  BFó  GˆEÜ�œs 5›z˜lÐ+°4Õ8à!ó -	 ‰LˆD�&Ø�&‹M˜QÑ‹MÜ$¤R§V¡V¨J¸¸FÓ%CÓDˆJØ!%§¡°Ô!8™¼dÀT¹kˆJÜ$ T¨:Ó6ˆKÙÜÐ*¨:°c°r¨?Ð*;Ð<ÀDÕIØØ�+Ó !Ñ#Óä—	‘	ÐPÐR]Ó^ˆAÙ/0”K §¡¨£
Ô+°jˆEä—	‘	ÐKÈ[ÓYˆAÙ&'˜Ÿ™ œ
¨R°°"Ð5ˆHÙ˜H¤vÒ-Ø�h“ 1Ñ$“Øä—	‘	Ð^Ð`kÔmo×mqÑmqÓrˆAÙ)*˜1Ÿ7™7 1œ:°ˆLÙ5A”m LÔ1ÀrˆGÜ—6‘6˜* b¨'Ó2×8Ñ8Ó:ˆDÜ�4‹y˜2Š~ &°Ñ"7ÜÐ-¨e°C°R¨j¨\Ð:À$ÕGØ�g“ !Ñ#“Ùà˜Ñ ÜŸ&™&Ø1ó ZØó�ô ' |°ZÓ@ˆDä&ØØ$Ø"Ø(Ø!Ø&Ø#ÙGKœtŸz™z¨$¸UÕCÐQSñ
ˆCð �N‰N˜3Öð[-	 ð^ 	�‰Œ÷cQôf �˜%Ô ÙÜ# GÓ,‰ˆˆwÜÐ" 5 '¨°°	¸Ð>ÀdÕKÜ	Ð˜u V™}˜o¨Y°u¸[Ñ7IÐ6JÈ$ÈuÐU\É~ÐN^Ð^hÐinÐowÑixÐhyÐy}Ð
~ð  GKö  Løô[ ò 	Úð	ûô ò Úðú÷#Qð Qúsh   Á"AQÂ/P(Ã!QÃ)P8Ã9QÃ>QÄ9QÅI:QÐ(	P5Ð1QÐ4P5Ð5QÐ8	QÑQÑQÑQÑQc                 óô   — t        t        dd¬«      5 }| D ]+  }|j                  t        j                  |d¬«      dz   «       Œ- 	 d d d «       t        dt        | «      › dt        › �d	¬
«       y # 1 sw Y   Œ*xY w)NÚwzutf-8)ÚencodingFr‹   ú
u   å·²å†™ u    æ�¡åˆ° TrT   )ÚopenÚOUTÚwriterœ   r�   rc   rš   )rn   r    Úfrs   s       r   rž   rž   Ó   sm   € Ü	Œc�3 Ô	)ð >¨QØò 	>ˆAØ�G‰G”D—J‘J˜q¨uÔ5¸Ñ<Õ=ñ	>÷>ô 
ˆG”C˜“L�> ¬#¨Ð
/°tÖ<÷>ð >ús   “1A.Á.A7Ú__main__)N)Ú__doc__rœ   r_   r	   r�   rN   rd   r   r   Úplaywright.sync_apir   rh   r:   r˜   ÚnowÚstrftimer‘   r•   r²   rb   ri   r   r)   rI   rR   ru   r¬   rž   Ú__name__© r   r   ú<module>r¼      sš   ðñ÷ (× '× 'ß (Ý /à$€	Ø €Ø	C€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Øv€Ø €Ø
€Ø€òòò(ò,òò>`LóD=ð ˆzÒÙ…Fð r   