Ë
    ­�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dddd	œd
dddd	œ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edk(  r e«        yy)u  ç®€é˜³å¸‚äººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Š/çŽ¯å¢ƒä¿�æŠ¤ æ �ç›®çˆ¬è™«
ç«™ç‚¹: https://www.scjy.gov.cn (å››å·�æˆ�éƒ½, /jianyang/ ç«™ç¾¤)
æ �ç›®:
  --col=gsgg  å…¬ç¤ºå…¬å‘Š  c123218  es-search lmCode=d622afddb27b43809f0686e7bacb0847 (832æ�¡/42é¡µ)
  --col=hb    çŽ¯å¢ƒä¿�æŠ¤  c123242  es-search lmCode=2bfac8b06c194e76adfff651b2df5fa9 (94æ�¡/5é¡µ)
WAF: ç‘žæ•°4ä»£ JS æŒ‘æˆ˜ (412, $_ts) â†’ Playwright è¿‡æŒ‘æˆ˜ + é¡µé�¢å†… fetch
åˆ—è¡¨: GET /es-search/search/{lmCode}?_template=zhaofa/jian_list&_isAgg=1&_pageSize=20&page=N
      è¿”å›ž HTML: div.gail_content_list > a.gail_list_doctitle[title][href] + div.gail_list_doctime
      å°¾éƒ¨ ejscreatePageHTML("page_div", æ€»é¡µæ•°, å½“å‰�é¡µ, 20, æ€»æ�¡æ•°, callback)
è¯¦æƒ…: fetch â†’ meta ArticleTitle(å®Œæ•´æ ‡é¢˜)/PubDate + div.main_bd æ­£æ–‡ (å›¾ç‰‡åž‹å…¬å‘Š img ç»�å¯¹åŒ–; é™„ä»¶ç›¸å¯¹è·¯å¾„ç»�å¯¹åŒ–)
å…¥åº“: è‡ªåŠ¨æ£€æµ‹ /root/search.db å­˜åœ¨åˆ™ INSERT OR IGNORE ç›´æ�’ gov_raw (FTS è§¦å�‘å™¨è‡ªåŠ¨å�Œæ­¥ gov_search)
è¿�è¡Œ: python3 crawl_jianyang.py [--col=gsgg|hb] [--pages=N] [--no-db]
é    N)ÚdatetimeÚ	timedelta)Úsync_playwrightu   ç®€é˜³å¸‚-å…¬ç¤ºå…¬å‘ŠÚ d622afddb27b43809f0686e7bacb0847u   å…¬ç¤ºå…¬å‘Šz8https://www.scjy.gov.cn/jianyang/c123218/list_more.shtml)Ú	site_nameÚlm_codeÚcategoryÚseedu   ç®€é˜³å¸‚-çŽ¯å¢ƒä¿�æŠ¤Ú 2bfac8b06c194e76adfff651b2df5fa9u   çŽ¯å¢ƒä¿�æŠ¤z:https://www.scjy.gov.cn/jianyang/c123242/zdxxgk_list.shtml)ÚgsggÚhbzhttps://www.scjy.gov.cniG  )Ú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/root/search.dbc                 óæ   — 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.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 )
Nr   )ÚBeautifulSoupzhtml.parserc                 ó:   — | j                   xr d| j                   v S )Nú:)Únamer   s    r   ú<lambda>zclean_content.<locals>.<lambda>0   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_contentr1   -   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                 óÜ   — | r| j                  d«      r| S | j                  «       } | j                  d«      r| S | j                  d«      r	t        | z   S |j                  dd«      d   dz   | z   S )NÚ
javascriptÚhttpú/é   r   )Ú
startswithr   ÚBASEÚrsplit)ÚhrefÚbase_urls     r   Úabsolutize_urlr<   @   sg   € Ù�4—?‘? <Ô0ØˆØ�:‰:‹<€DØ‡��vÔØˆØ‡��sÔÜ�d‰{ÐØ�?‰?˜3 Ó" 1Ñ%¨Ñ+¨dÑ2Ð2r   c                 óŒ  — g }t        j                  d| t         j                  t         j                  z  «      D ]È  }|j	                  d«      j                  «       |j	                  d«      }}|r|j                  d«      rŒGt        j                  d|t         j                  «      sŒmt        j                  dd|«      j                  «       d d }|j                  |xs |j                  d	«      d
   t        ||«      dœ«       ŒÊ t        «       }g }|D ]/  }	|	d   |vsŒ|j                  |	d   «       |j                  |	«       Œ1 |S )Nz$<a[^>]+href="([^"]+)"[^>]*>(.*?)</a>r6   é   r3   z\.(pdf|docx?|xlsx?|zip|rar|7z)$ú<[^>]+>r   éd   r5   éÿÿÿÿ)r   ÚurlrB   )r   ÚfinditerÚIÚSÚgroupr   r7   Úsearchr   ÚappendÚsplitr<   ÚsetÚadd)
Ú	html_fragÚ
detail_urlÚattsÚmr:   Ú	name_htmlr   ÚseenÚuniqÚas
             r   Úextract_attachmentsrT   J   s  € Ø€DÜ�[‰[Ð@À)ÌRÏTÉTÔTV×TXÑTXÉ[ÓYò hˆØŸ'™' !›*×*Ñ*Ó,¨a¯g©g°a«jˆiˆÙ�t—‘ |Ô4ØÜ�9‰9Ð7¸¼r¿t¹tÕDÜ—6‘6˜* b¨)Ó4×:Ñ:Ó<¸T¸cÐBˆDØ�K‰K Ò!<¨¯©°C«¸Ñ)<Ä^ÐTXÐZdÓEeÑfÕgðhô ‹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)Nr>   zAasync (u) => { const r = await fetch(u); return await r.text(); })ÚrangeÚevaluateÚ	ExceptionÚtimeÚsleep)ÚpagerB   Ú_s      r   Ú
fetch_htmlr]   [   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
||d   |d   |d   |d   |d   |d   xs dd d |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 (?,?,?,?,?,?,?,?,?,?,?,?)rB   ÚtitleÚpub_dateÚcontentr   iô  zcrawl_jianyang.pyÚattachmentsÚ
group_nameõ   å››å·�ÚindustryÚotherr6   z
  DB err: )ÚosÚpathÚexistsÚDB_PATHÚprintÚsqlite3ÚconnectÚexecuteÚcursorr*   ÚrowcountÚErrorÚcommitÚclose)	Úresultsr   r	   ÚconnÚaddedÚskippedÚcurÚrÚes	            r   Ú
push_to_dbr~   c   sY  € ÙØÜ�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Ð7JÈAÈmÑL\Ø—‘�| XÓ.°·±°jÀ'Ó0JðLô	ð �|‰|˜aÒØ˜‘
‘à˜1‘�ð 	�‰�ð#ð$ 	‡J�J„LØ�'ˆ>Ðøô �}‰}ò 	Ü�J˜q˜cÐ"¨$Õ/Ø�q‰L�Gûð	ús   ÂA4DÄEÄ0E
Å
Ec                  ó,  ‡'— d} t         j                  D ])  }|j                  d«      sŒ|j                  dd«      d   } Œ+ | t        vr!t        d| › dt        t        «      › �d¬«       y t        |    }|d	   }d
t         j                  v }d }t         j                  D ]2  }|j                  d«      sŒt        |j                  dd«      d   «      }Œ4 t        d|› dt        › �d¬«       g }dddddddœ}d}t        «       5 }	|	j                  j                  dg d¢¬«      }
|
j                  t        ddddœd¬«      }|j                  «       }	 |j                  |d   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 d}	 |r||kD  r�nt,        › d$|d%   › d&|› �}t/        ||«      }|st        d'|› d(�d¬«       �nät1        j2                  d)|«      }|r\|d*   dk(  rTt        |j5                  d«      «      |d+<   t        |j5                  d,«      «      |d*<   t        d-|d*   › d.|d+   › d/�d¬«       t1        j6                  d0|t0        j8                  «      }|st        d'|› d1�d¬«       �n6t        d'|› d2t)        |«      › d3�d¬«       |D �]   \  }}}|d4xx   dz  cc<   t;        |«      }|j=                  d5d6«      Š'|xs d7d d8 }|r|t        k  r|d9xx   dz  cc<   d}ŒVt/        |‰'«      }|st        d:|d d; › �d¬«       Œx|d<xx   dz  cc<   t1        j2                  d=|«      }|rt;        |j5                  d«      «      n|}t1        j2                  d>|«      }|r|j5                  d«      n|d d8 }|r|t        k  r|d9xx   dz  cc<   d}�Œt1        j2                  d?|t0        j8                  «      }|r|j5                  d«      nd7}|rt?        |«      nd7}t1        j@                  d@d7|«      jC                  «       }t)        |«      d8k  r&dA|vr"t        dB|d d; › �d¬«       |dCxx   dz  cc<   �Œ¥t1        j@                  dDˆ'fdE„|«      }tE        |‰'«      } ||||‰'‰'dFdG| rtG        jH                  | d¬H«      nd7dIœ	}!|jK                  |!«       �Œ |rn||d+   k\  rn|dz  }�Œ|
j+                  «        d d d «       dJ| › dK�}"tM        |"dLdM¬N«      5 }#|D ]+  }$|#jO                  tG        jH                  |$d¬H«      dOz   «       Œ- 	 d d d «       t        dPt)        |«      › dQ|"› �d¬«       |s'tQ        |||dR   «      \  }%}&t        dS|%› dT|&› dU�d¬«       t        dV|d4   › dW|d<   › dX|dC   › dY|d9   › dU�	d¬«       y # t         $ r Y �Œˆw xY w# t         $ r Y �Œ‹w xY w# 1 sw Y   ŒãxY w# 1 sw Y   Œ¡xY w)ZNr   z--col=ú=r6   u   æœªçŸ¥æ �ç›® u
   , å�¯é€‰: Tr_   r   z--no-dbz--pages=u   ç«™ç‚¹: z	 CUTOFF: r   )ÚlistÚ	detail_okÚemptyÚcutoffÚpagesÚtotalF)z--no-sandboxz---disable-blink-features=AutomationControlledz--disable-dev-shm-usage)ÚheadlessÚargszzh-CNiV  i„  )ÚwidthÚheight)Ú
user_agentÚlocaleÚviewportÚignore_https_errorsr
   i`ê  ru   )ra   Ú
wait_untilé   i¸  z$_tsiˆ  u   ç‘žæ•°æŒ‘æˆ˜é€šè¿‡ é   Úsu   æŒ‘æˆ˜å¤±è´¥!z/es-search/search/r   z7?_template=zhaofa/jian_list&_isAgg=1&_pageSize=20&page=u     ç¬¬u   é¡µèŽ·å�–å¤±è´¥zIejscreatePageHTML\("page_div",\s*(\d+)\s*,\s*\d+\s*,\s*20\s*,\s*(\d+)\s*,r†   r…   r>   u   å…± u    æ�¡ / u    é¡µzv<a href="([^"]+)"[^>]*class="gail_list_doctitle"[^>]*title="([^"]+)">.*?</a>\s*<div class="gail_list_doctime">([^<]+)<u   é¡µæ— æ�¡ç›®, å�œæ­¢u   é¡µ: u    æ�¡r�   zhttp://zhttps://r   é
   r„   u       è¯¦æƒ…å¤±è´¥: é   r‚   z3<meta[^>]+name="ArticleTitle"[^>]+content="([^"]+)"z.<meta[^>]+name="PubDate"[^>]+content="([^"]+)"zA<div[^>]*class="main_bd"[^>]*>(.*?)</div>\s*<div[^>]*class="xgfj"r?   z<imgu       ç©ºæ­£æ–‡è·³è¿‡: rƒ   z(<img[^>]+src=")([^"]+)(")c                 ó‚   •— | j                  d«      t        | j                  d«      ‰«      z   | j                  d«      z   S )Nr6   r>   r‘   )rF   r<   )ÚmmrM   s    €r   r   zmain.<locals>.<lambda>é   s5   ø€ ˜rŸx™x¨›{¬^¸B¿H¹HÀQ»KÈÓ-TÑTÐWY×W_ÑW_Ð`aÓWbÑb€ r   rg   ri   )Úensure_ascii)	r   rb   rc   rd   Ú
source_urlrB   rf   rh   re   z/tmp/jianyang_z.jsonlÚwzutf-8)Úencodingú
u   å·²å†™ u    æ�¡åˆ° r	   u   === å…¥åº“: æ–°å¢žu    è·³è¿‡z ===u   === å®Œæˆ�: åˆ—è¡¨u	    è¯¦æƒ…OKu    ç©ºu
    CUTOFFæˆª))ÚsysÚargvr7   rI   ÚCOLSrn   r�   ÚintÚCUTOFFr   ÚchromiumÚlaunchÚnew_contextÚUAÚnew_pageÚgotorX   rV   Úwait_for_timeoutrd   Úlenrv   r8   r]   r   rG   rF   ÚfindallrE   r   r   r1   r   r   rT   ÚjsonÚdumpsrH   ÚopenÚwriter~   )(ÚcolrS   Úcfgr   Úno_dbÚ	max_pagesrw   ÚstatsÚ
cutoff_hitr"   ÚbrowserÚctxr[   ÚpassedÚir-   ÚnÚapi_urlÚtxtrO   Úitemsr:   Út_titleÚt_dateÚ
list_titlerc   Údetail_htmlÚm2rb   Úcontent_htmlrd   ÚtextrN   ÚrecÚoutÚfr|   ry   rz   rM   s(                                          @r   ÚmainrÆ   ‚   sŸ  ø€ Ø
€CÜ�X‰Xò %ˆØ�<‰<˜Õ!Ø—'‘'˜#˜q“/ !Ñ$‰Cð%ð ”$�Ü�˜c˜U *¬T´$«Z¨LÐ9ÀÕFØÜ
ˆs‰)€CØ�KÑ €IØœŸ™Ð!€EØ€IÜ�X‰Xò 0ˆØ�<‰<˜
Õ#Ü˜AŸG™G C¨›O¨AÑ.Ó/‰Ið0ô 
ˆH�Y�K˜y¬¨Ð
1¸Õ>à€GØ Q°¸aÈ!ÐVWÑX€EØ€JÜ	Ó	ð f˜aØ—*‘*×#Ñ#ØÚmð $ó oˆð ×!Ñ!¬R¸ÐTXÐdgÑJhð  CÐ!ó  DˆØ�|‰|‹~ˆð	Ø�I‰I�c˜&‘k¨5¸XˆIÔFð ˆÜ�r“ò 		ˆAØ×!Ñ! $Ô'ðØ—|‘|“~�ð ˜TÒ!¤c¨$£i°$Ó&6ÜÐ+¨A¨a©C¨5°Ð2¸$Õ?Ø�Ùð		ñ Ü�/¨Õ.Ø�M‰MŒOØ÷3fð fð6 ˆØÙ˜Q š]ÙÜ˜Ð0°°Y±Ð0@Ð@wÐxyÐwzÐ{ˆGÜ˜T 7Ó+ˆCÙÜ˜˜a˜S Ð0¸Õ=Ùä—	‘	ÐfÐhkÓlˆAÙ�U˜7‘^ qÒ(Ü!$ Q§W¡W¨Q£Z£��g‘Ü!$ Q§W¡W¨Q£Z£��g‘Ü˜˜U 7™^Ð,¨G°E¸'±NÐ3CÀ4ÐHÐPTÕUÜ—J‘Jð JØ”R—T‘TóˆEñ Ü˜˜a˜SÐ 4Ð5¸TÕBÙÜ�E˜!˜˜E¤# e£* ¨TÐ2¸$Õ?Ø).ó /$Ñ%��g˜vØ�f“ Ñ"“Ü(¨Ó1�
à!Ÿ\™\¨)°ZÓ@�
Ø"šL b¨#¨2Ð.�Ù ¬6Ò 1Ø˜(“O qÑ(“OØ!%�JØÜ(¨¨zÓ:�Ù"ÜÐ.¨z¸#¸2¨Ð.?Ð@ÈÕMØØ�kÓ" aÑ'Ó"Ü—Y‘YÐUÐWbÓc�Ù46œ B§H¡H¨Q£KÔ0¸J�Ü—Y‘YÐPÐR]Ó^�Ù+-˜BŸH™H QœK°8¸S¸bÐA�Ù ¬6Ò 1Ø˜(“O qÑ(“OØ!%�JÙÜ—Y‘YÐcÐepÔrt×rvÑrvÓw�Ù.0˜rŸx™x¨œ{°b�Ù9Eœ-¨Ô5È2�Ü—v‘v˜j¨"¨gÓ6×<Ñ<Ó>�Ü�t“9˜r’> f°GÑ&;ÜÐ1°%¸¸°*°Ð>ÀdÕKØ˜'“N aÑ'“NÙäŸ&™&Ø1ÛbÐdkóm�ô +¨<¸ÓD�à!*Ø"Ø (Ø&Ø",Ø%Ø"*Ø 'ÙKO¤4§:¡:¨dÀÕ#GÐUWñ
�ð —‘˜sÖ#ð_/$ñ` ØØ�E˜'‘NÒ"ØØ�‰FˆAñS ðT 	�‰Œ÷MfðP ˜3˜%˜vÐ
&€CÜ	ˆc�3 Ô	)ð >¨QØò 	>ˆAØ�G‰G”D—J‘J˜q¨uÔ5¸Ñ<Õ=ñ	>÷>ô 
ˆG”C˜“L�> ¨#¨Ð
/°tÕ<ÙÜ# G¨Y¸¸J¹ÓH‰ˆˆwÜÐ" 5 '¨°°	¸Ð>ÀdÕKÜ	Ð˜u V™}˜o¨Y°u¸[Ñ7IÐ6JÈ$ÈuÐU\É~ÐN^Ð^hÐinÐowÑixÐhyÐy}Ð
~ð  GKö  LøôO ò 	Úð	ûô ò Úðú÷!fð fú÷R>ð >úst   Ã>AW>ÅWÅ"!W>ÆW.ÆW>ÆW>Æ(9W>Ç*L2W>Ô81X
×	W+×'W>×*W+×+W>×.	W;×7W>×:W;×;W>×>XØ
XÚ__main__)Ú__doc__rª   rj   r   rœ   rY   ro   r   r   Úplaywright.sync_apir   rž   r8   ÚnowÚstrftimer    r¤   rm   r   r1   r<   rT   r]   r~   rÆ   Ú__name__© r   r   ú<module>rÎ      sµ   ðñ÷ (× '× 'ß (Ý /ð .Ø5Ø"ØJñ	ð .Ø5Ø"ØLñ	ñ€ð !€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Øv€Ø
€òòò&3òò"òò>DLðL ˆzÒÙ…Fð r   