Ë
    è‡zj!(  ã                   óÀ  — 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Z	ddl
Z
ddlZ		 ddlmZ dZedz   ZdZdZdZd	Zd
ZdZdddœZdD ]I  Zej2                  j5                  e«      sŒeej2                  vsŒ.ej2                  j7                  de«       ŒK dZ eej<                  «      D ]k  \  ZZ e jC                  d«      r	  e"e jG                  dd«      d   «      ZŒ4e dk(  sŒ:edz    e%ej<                  «      k  sŒS	  e"ej<                  edz      «      ZŒm edk\  rendZ&d„ Z'd„ Z(d„ Z)d„ Z*d„ Z+e,dk(  r e+«        yy# e$ r dZY �Œw xY w# e$$ r Y Œ©w xY w# e$$ r Y Œ´w xY w)u/  
å…°å�‡ç”Ÿç‰©ç§‘æŠ€é›†å›¢è‚¡ä»½æœ‰é™�å…¬å�¸ - å…¬ç¤ºå…¬å‘Š
https://www.lansen-china.com/lsweb/#/News?tab=9

ç«™ç‚¹: Vue SPA (LSCMS), æ•°æ�®å…¨èµ° JSON API
åˆ—è¡¨: GET /api/channel?parentId=4 -> é¢‘é�“åˆ—è¡¨ (id=9 = å…¬ç¤ºå…¬å‘Š, alias=notice)
      GET /api/article?channel=notice&channelId=9 -> å…¨é‡�æ–‡ç«  JSON (æ— æœ�åŠ¡ç«¯åˆ†é¡µ,
      å‰�ç«¯å®¢æˆ·ç«¯ slice; æ¯�æ¬¡è°ƒç”¨è¿”å›žå…¨éƒ¨)
è¯¦æƒ…: GET /api/article/{id} -> JSON
      title / publishDate / text(HTMLæ­£æ–‡, å®žä½“ç¼–ç �) / plainText / description
      fileList / downloads / imageList é™„ä»¶
é    N)ÚBeautifulSoupzhttps://www.lansen-china.comz/apiu%   å…°å�‡ç”Ÿç‰©ç§‘æŠ€é›†å›¢-å…¬ç¤ºå…¬å‘Šu   æ²³åŒ—zcrawl_lansen_gsgg.pyz/mnt/data/search.dbÚnoticeÚ9zkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36z!application/json, text/plain, */*)z
User-AgentÚAccept)ú/root/gov_crawlerr   é   z--pages=ú=z--pagesc                 óR  — | syt        j                  | «      } t        j                  dd| «      } | j	                  dd«      j	                  dd«      j	                  dd«      j	                  dd«      j	                  dd«      } t        j                  d	d| «      } | j                  «       S )
zFunescape entities + strip &middot;&nbsp; prefix + collapse whitespace.Ú u   ^\s*[Â·â€¢]+\s*õ   Â ú u   â€‹u   â€Œu   â€�u   ï»¿ú\s+)Úhtml_libÚunescapeÚreÚsubÚreplaceÚstrip)Úts    ú&/root/gov_crawler/crawl_lansen_gsgg.pyÚclean_titler   D   s‘   € áØÜ×Ñ˜!Ó€AÜ
�‰Ð! 2 qÓ)€AØ	�	‰	�&˜#Ó×&Ñ& x°Ó4×<Ñ<¸XÀrÓJ×RÑRÐS[Ð]_Ó`×hÑhÐiqÐsuÓv€AÜ
�‰ˆv�s˜AÓ€AØ�7‰7‹9Ðó    c                 óÄ  — t         | z   }d}t        d«      D ]†  }	 t        j                  j	                  |t
        ¬«      }t        j                  j                  |d¬«      5 }t        j                  |j                  «       j                  d«      «      cddd«       c S  |‚# 1 sw Y   nxY wŒ˜# t        $ r'}|}t        j                  d|dz   z  «       Y d}~ŒÃd}~ww xY w)	zGET JSON API with retries.Né   )Úheadersé   ©Útimeoutzutf-8g      ø?r   )ÚAPI_BASEÚrangeÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚjsonÚloadsÚreadÚdecodeÚ	ExceptionÚtimeÚsleep)ÚpathÚurlÚlastÚiÚreqÚrÚes          r   Úapi_getr4   O   sÇ   € ä
�T‰/€CØ€DÜ�1‹Xò &ˆð	&Ü—.‘.×(Ñ(¨´gÐ(Ó>ˆCÜ—‘×'Ñ'¨°RÐ'Ó8ð <¸AÜ—z‘z !§&¡&£(§/¡/°'Ó":Ó;÷<ó <ð&ð €J÷<ð <úð <øäò 	&ØˆDÜ�J‰J�s˜a !™e‘}×%Ñ%ûð	&ús0   ›AB/Á!2B"Â	B/Â"B+	Â'B/Â/	CÂ8CÃCc           
      ór	  ‡‡‡‡— | sddg fS t        j                  dd| t         j                  ¬«      } t        j                  dd| t         j                  t         j                  z  ¬«      } t        j                  dd| t         j                  t         j                  z  ¬«      } t        rQ	 t	        | d«      }|j                  d«      D ]%  }d	D ]  }|j                  j                  |d
«       Œ  Œ' t        |«      } | }g Ši Šˆˆˆfd„}t        j                  d||t         j                  t         j                  z  ¬«      }g Šˆfd„}t        j                  d||t         j                  t         j                  z  ¬«      }t        j                  d| t         j                  «      rdnd}t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }g }	|j                  d«      D ]ï  }
|
j                  «       }|sŒt        j                  dd|«      }t        j                  |«      }|j                  dd«      j                  dd«      }t        j                  dd|«      }|sŒ~‰j!                  «       D ]  \  }}|j                  ||«      }Œ t#        ‰«      D ]  \  }}|j                  d|› d�|«      }Œ |	j%                  |j                  «       «       Œñ dj'                  |	«      }‰j!                  «       D ]  \  }}|j                  ||«      }Œ t#        ‰«      D ]  \  }}|j                  d|› d�|«      }Œ t        j                  dd|«      }t        j                  dd|«      }t        j                  |«      }t        j                  d d|«      }t        j                  d!d|«      }t        j                  d"d|«      }t)        «       }g }|j                  d«      D ]X  }t        j                  d#dt        j                  dd|«      «      }|sŒ2||v rŒ7|j+                  |«       |j%                  |«       ŒZ dj'                  |«      j                  «       }||‰fS # t        $ r Y �Œ»w xY w)$z»Convert article HTML to stored format (same pipeline as gov scripts):
    - keep <table> HTML intact
    - 

 between <p> blocks
    - attachment <a> links embedded with absolute URL
    r   r   z
<!--.*?-->)Úflagsz<script[^>]*>.*?</script>z<style[^>]*>.*?</style>zhtml.parserT)ÚstyleÚclassÚlangÚdirÚalignÚvalignÚwidthÚheightÚborderÚcellpaddingÚcellspacingNc                 ó:  •— | j                  d«      }| j                  d«      }t        j                  dd|«      }t        j                  |«      j                  «       }t        j                  dd|«      j                  «       }|s5t        j                  j                  |j                  d«      d   «      xs d}t        j                  j                  ‰t        j                  |«      «      }‰j                  ||f«       d	t        ‰«      › d
�}d|› d|› d�‰|<   |S )Nr   é   ú<[^>]+>r   u   ^é™„ä»¶[:ï¼š]\s*ú?r   u   é™„ä»¶Ú__LINK__Ú__z	<a href="ú" target="_blank">z</a>)Úgroupr   r   r   r   r   Úosr-   ÚbasenameÚsplitr!   ÚparseÚurljoinÚappendÚlen)	ÚmÚhrefÚinnerÚtxtÚabs_urlÚkeyÚattachmentsÚlink_protectÚpage_urls	         €€€r   Ú
_link_replz html_to_text.<locals>._link_replw   só   ø€ Ø�w‰w�q‹zˆØ—‘˜“
ˆÜ�f‰f�Z  UÓ+ˆÜ×Ñ Ó$×*Ñ*Ó,ˆÜ�f‰fÐ(¨"¨cÓ2×8Ñ8Ó:ˆÙÜ—'‘'×"Ñ" 4§:¡:¨c£?°1Ñ#5Ó6ÒB¸(ˆCÜ—,‘,×&Ñ& x´×1BÑ1BÀ4Ó1HÓIˆØ×Ñ˜G S˜>Ô*Øœ˜\Ó*Ð+¨2Ð.ˆØ'¨ yÐ0BÀ3À%ÀtÐLˆ�SÑØˆ
r   z&<a\s[^>]*href="([^"]+)"[^>]*>(.*?)</a>c                 óh   •— ‰j                  | j                  d«      «       dt        ‰«      dz
  › d�S )Nr   Ú__TBL__r   rG   )rO   rI   rP   )rQ   Útable_protects    €r   Ú	_tbl_replzhtml_to_text.<locals>._tbl_replˆ   s3   ø€ Ø×Ñ˜QŸW™W Q›ZÔ(Øœ˜]Ó+¨AÑ-Ð.¨bÐ1Ð1r   z<table[^>]*>.*?</table>z<table[^>]*>r   ú</p>z</p>

z	<br\s*/?>ú
z(</?(?:span|font|o:p|st1?:[a-z]+)\b[^>]*>z

rD   r   r   z&nbsp;z[\s\u200b\u200c\u200d\ufeff]+r\   rG   z__LINK__\d+__z__TBL__\d+__z[ \t]+\nz\n{3,}z	[ \t]{2,}r   )r   r   ÚSÚIr   Úfind_allÚattrsÚpopÚstrr*   ÚsearchrL   r   r   r   r   ÚitemsÚ	enumeraterO   ÚjoinÚsetÚadd)ÚcontentrY   Ú_soupÚtagÚattrÚcontent2rZ   r^   Ú	has_tableÚpartsÚblockÚbÚplainÚkÚvr0   ÚtblÚoutÚseenÚfinalÚprV   rW   rX   r]   s    `                    @@@r   Úhtml_to_textr~   ^   s  û€ ñ Ø�1�bˆyÐÜ�f‰f�] B¨´r·t±tÔ<€GÜ�f‰fÐ1°2°wÄbÇdÁdÌRÏTÉTÁkÔR€GÜ�f‰fÐ/°°WÄBÇDÁDÌ2Ï4É4ÁKÔP€GÝð	Ü! '¨=Ó9ˆEØ—~‘~ dÓ+ò .�ð Lò .�DØ—I‘I—M‘M $¨Õ-ñ.ð.ô ˜%“jˆGð
 €HØ€KØ€Löô �v‰vÐ?ÀÈXÔ]_×]aÑ]aÔdf×dhÑdhÑ]hÔi€Hð €Mô2ô �v‰vÐ0°)¸XÌRÏTÉTÔTV×TXÑTXÉ[ÔY€HÜ—Y‘Y˜°¼¿¹Ô>‘ÀA€Iä�v‰v�g˜z¨8¼2¿4¹4Ô@€HÜ�v‰v�l D¨(¼"¿$¹$Ô?€HÜ�v‰vÐAÀ2ÀxÔWY×W[ÑW[Ô\€Hà€EØ—‘ Ó'ò  ˆØ�K‰K‹MˆÙØÜ—‘�z 2 qÓ)ˆÜ×!Ñ! %Ó(ˆØ—‘˜f cÓ*×2Ñ2°8¸SÓAˆÜ—‘Ð7¸¸UÓCˆÙØØ ×&Ñ&Ó(ò 	 ‰DˆAˆqØ—	‘	˜!˜Q“‰Að	 ä Ó.ò 	0‰FˆAˆsØ—	‘	˜G A 3 b˜/¨3Ó/‰Að	0à�‰�Q—W‘W“YÕð ð  �+‰+�eÓ
€CØ×"Ñ"Ó$ò  ‰ˆˆ1Ø�k‰k˜!˜QÓ‰ð ä˜MÓ*ò 0‰ˆˆ3Ø�k‰k˜G A 3 b˜/¨3Ó/‰ð0ô �&‰&Ð! 2 sÓ
+€CÜ
�&‰&� " cÓ
*€Cä
×
Ñ
˜CÓ
 €CÜ
�&‰&�˜d CÓ
(€CÜ
�&‰&�˜F CÓ
(€CÜ
�&‰&�˜s CÓ
(€Cô ‹5€DØ€EØ�Y‰Y�vÓò ˆÜ�f‰f�V˜R¤§¡¨
°B¸Ó!:Ó;ˆÙØØ�$‰;ØØ�‰�ŒØ�‰�Q�ðð �+‰+�eÓ
×
"Ñ
"Ó
$€Cà�	˜;Ð&Ð&øô] ò 	Úð	ús   Â*AR) Ò)	R6Ò5R6c                 ó”  — | j                  d|f«      }|j                  «       ry	 d}	 ddlm}  ||«      }| j                  d|||||t
        t        t        ||f
«      }|j                  dkD  ryt        j                  dd|«      }	t        j                  |	«      }	t        j                  d	d
|	«      j                  «       d d }	| j                  d|j                  |t
        |	f«       yy# t        $ r Y Œ¼w xY w# t        j                   $ r=}
dt#        |
«      v r*t%        j&                  d«       t)        | |||||«      cY d }
~
S ‚ d }
~
ww xY w)Nz'SELECT id FROM gov_raw WHERE page_url=?FÚotherr   )Úclassify_industryz¨INSERT OR IGNORE INTO gov_raw (page_url, source_url, title, content, publish_date, site_name, group_name, script_name, has_table, industry) VALUES (?,?,?,?,?,?,?,?,?,?)rD   r   r   r   éÈ   zTINSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) VALUES (?,?,?,?)TÚlockedr   )ÚexecuteÚfetchoneÚcrawler_libr�   r*   Ú	SITE_NAMEÚ
GROUP_NAMEÚSCRIPT_NAMEÚrowcountr   r   r   r   r   Ú	lastrowidÚsqlite3ÚOperationalErrorrf   r+   r,   Ústore_record)Úconnr.   Útitlerm   Údaterr   ÚcurÚindustryr�   Úsummaryr3   s              r   rŽ   rŽ   Á   sF  € Ø
�,‰,Ø1Ø	ˆó€Cð ‡|�|„~ØðØˆð	Ý5Ù(¨Ó/ˆHð �l‰lð+ð �#�u˜g t¬Y¼
ÄKÐQZÐ\dÐeó	
ˆð �<‰<˜!ÒÜ—f‘f˜Z¨¨WÓ5ˆGÜ×'Ñ'¨Ó0ˆGÜ—f‘f˜V S¨'Ó2×8Ñ8Ó:¸4¸CÐ@ˆGØ�L‰LØfØ—‘ ¤y°'Ð:ôð Øøô# ò 	Ùð	ûô$ ×#Ñ#ò Ø”s˜1“vÑÜ�J‰J�qŒMÜ  c¨5°'¸4ÀÓKÕKØûð	úsF   ¦C7 ©C( ·B/C7 Ã(	C4Ã1C7 Ã3C4Ã4C7 Ã7EÄ
1EÄ;EÅEÅEc                  ó  — t        j                  t        d¬«      } | j                  d«       | j                  d«       d}d}	 t	        dt
        › dt        › �«      }t        |t        «      r|st        d
«       y |j                  d„ d¬«       t        dz  }|d | D �]å  }|j                  d«      }t        |j                  dd«      «      }|j                  d«      xs dd d }	t        › d|› �}
	 t	        d|› �«      }|j                  d«      xs d}|j                  d«      xs g }|rÏ|D ]Ê  }|j                  d«      xs |j                  d«      xs d}|j                  d«      xs |j                  d«      xs d}|sŒV|j!                  d«      s$t"        j$                  j'                  t        |«      }|d|› dt)        j*                  |xs t,        j.                  j1                  |«      «      › d �z  }ŒÌ t3        ||
«      \  }}}|sR|j                  d!«      xs d}|r;d"t)        j*                  |«      j5                  d#d$«      z   d%z   }t3        ||
«      \  }}}|s|dz  }�ŒÊt7        | |
|||	|«      r|dz  }�Œá|dz  }�Œè | j9                  «        | j;                  «        t        d&|› �«       y # t        $ r}t        d|› d	�«       Y d }~y d }~ww xY w# t        $ r!}t        d|› d|› �«       |dz  }Y d }~�Œbd }~ww xY w)'Né<   r   zPRAGMA busy_timeout=60000zPRAGMA journal_mode=WALr   z/article?channel=z&channelId=u   æ–°å¢ž: 0 (list error: ú)u   æ–°å¢ž: 0 (empty list)c                 ó&   — | j                  dd«      S )NÚpublishDater   )Úget)Úas    r   ú<lambda>zmain.<locals>.<lambda>ù   s   €  §¡ m°RÓ 8€ r   T)rV   Úreverseé
   Úidr�   r   r™   z	/article/z  [ERR] z: r   ÚtextÚfileListÚnameÚfileNamer.   ÚfileUrl)zhttp://zhttps://z
<p><a href="rH   z</a></p>Údescriptionz<p>r`   z</p>
<p>r_   u   æ–°å¢ž: )rŒ   ÚconnectÚDB_PATHr„   r4   ÚCHANNEL_ALIASÚ
CHANNEL_IDr*   ÚprintÚ
isinstanceÚlistÚsortÚ_PAGESrš   r   ÚBASE_URLÚ
startswithr!   rM   rN   r   ÚescaperJ   r-   rK   r~   r   rŽ   ÚcommitÚclose)r�   Ú	new_countÚ
skip_countÚarticlesr3   ÚlimitÚartÚart_idr�   Úpub_dater.   ÚdetailÚcontent_htmlÚ	file_listÚfÚfnameÚfurlrm   rr   rW   Údescs                        r   ÚmainrÂ   æ   s  € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ,Ô-Ø‡L�LÐ*Ô+à€IØ€JðÜÐ.¬}¨o¸[ÌÈÐUÓVˆô �h¤Ô%©XÜÐ&Ô'Øð ‡M�MÑ8À$€MÔGÜ�R‰K€EØ˜˜Ðó $ˆØ—‘˜“ˆÜ˜CŸG™G G¨RÓ0Ó1ˆØ—G‘G˜MÓ*Ò0¨b°#°2Ð6ˆÜ�
˜) F 8Ð,ˆð	Ü˜y¨¨Ð1Ó2ˆFð
 —z‘z &Ó)Ò/¨Rˆà—J‘J˜zÓ*Ò0¨bˆ	ÙØò H�ØŸ™˜f›Ò@¨¯©¨zÓ):Ò@¸b�Ø—u‘u˜U“|Ò= q§u¡u¨YÓ'7Ò=¸2�ÚØŸ?™?Ð+BÔCÜ%Ÿ|™|×3Ñ3´H¸dÓC˜Ø  n°T°FÐ:LÌXÏ_É_Ð]bÒ]|Ôfh×fmÑfm×fvÑfvÐw{Óf|ÓM}ÐL~ð  Gð  %Hñ  H‘LðHô +7°|ÀSÓ*IÑ'ˆ�˜KÙà—:‘:˜mÓ,Ò2°ˆDÙØ¤(§/¡/°$Ó"7×"?Ñ"?ÀÀkÓ"RÑRÐU[Ñ[�Ü2>¸wÈÓ2LÑ/�˜ KÙØ˜!‰OˆJÙÜ˜˜c 5¨'°8¸YÔGØ˜‰NŠIà˜!‰OŠJðI$ðL 	‡K�K„MØ‡J�J„LÜ	ˆH�Y�KÐ
 Õ!øôe ò ÜÐ'¨ s¨!Ð,Ô-Üûðûô$ ò 	Ü�H˜V˜H B q cÐ*Ô+Ø˜!‰OˆJÝûð	ús0   ÁJ4 Ã0KÊ4	KÊ=KËKË	LË"K>Ë>LÚ__main__)-Ú__doc__ÚsysrJ   r   r+   r&   Úhtmlr   Úurllib.parser!   rŒ   Úurllib.requestÚbs4r   ÚImportErrorr¯   r   r‡   rˆ   r‰   r§   r¨   r©   r$   Ú_pr-   ÚisdirÚinsertÚ
_MAX_PAGESri   Úargvr0   r›   r°   ÚintrL   Ú
ValueErrorrP   r®   r   r4   r~   rŽ   rÂ   Ú__name__© r   r   ú<module>rÔ      s­  ðñó Û 	Û 	Û Û Û Û Û Û ðÝ!ð
 *€Ø�fÑ€Ø3€	Ø€
Ø$€Ø
€Ø€Ø€
ð @Ø1ñ€ð 5ò €BØ	‡w�w‡}�}�RÕ˜R s§x¡xÒ/Ø�‰�‰˜˜2Õðð
 €
Ù�c—h‘hÓò 
�D€A€qØ‡|�|�JÔð	Ù˜QŸW™W S¨!›_¨QÑ/Ó0‰Jð 
ˆi‹˜A ™E¡C¨¯©£MÓ1ð	Ù˜SŸX™X a¨!¡e™_Ó-‰Jð
ð " Q’‰¨A€òòò`'òF"òJ="ð@ ˆzÒÙ…Fð øðW ò ØƒMðûð: ò 	Ùð	ûð
 ò 	Ùð	ús5   ¨D< Ã E
Ã<EÄ<EÅEÅ
EÅEÅEÅE