Ë
    ÛJ‚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ZddlZ	ddl
mZ ddlmZ dZdZedz   ZdZd	Zd
ZdZdZdZ ej.                  «       Zde_        ej4                  e_        d„ Zdd„Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#e$dk(  r e#«        yy)u  å‡¤åŸŽå¸‚-éƒ¨é—¨åŠ¨æ€�çˆ¬è™« (lnfc.gov.cn fcszf/xwdt/bmdt)
ç«™ç‚¹: https://www.lnfc.gov.cn (è¾½å®�ä¸¹ä¸œå‡¤åŸŽå¸‚, TRS WCM)
æ �ç›®: /fcszf/xwdt/bmdt/glist.html (éƒ¨é—¨åŠ¨æ€�, 15æ�¡/é¡µ)
åˆ—è¡¨: div.time + div.name > a[href][title], åˆ†é¡µ glist.html â†’ glist{N}.html
è¯¦æƒ…: div.center-title æ ‡é¢˜ + div.center-info æ­£æ–‡ + å�‘å¸ƒæ—¥æœŸï¼šYYYY-MM-DD
é™„ä»¶: æ­£æ–‡å†… <a href="*.pdf/doc/xls..."> urljoin ç»�å¯¹åŒ–
å…¥åº“: INSERT OR IGNORE ç›´æ�’ gov_raw (FTS è§¦å�‘å™¨è‡ªåŠ¨å�Œæ­¥ gov_search)
è¿�è¡Œ: python3 crawl_lnfc_bmdt.py [--pages=N]
é    N)Úurljoin)ÚBeautifulSoupu   å‡¤åŸŽå¸‚-éƒ¨é—¨åŠ¨æ€�zhttps://www.lnfc.gov.cnz/fcszf/xwdt/bmdt/glist.htmlé2   z
2023-08-18z/tmp/lnfc_bmdt.jsonlz/root/search.dbu   éƒ¨é—¨åŠ¨æ€�u   è¾½å®�Fc                  óÎ   — t         j                  dd  D ]O  } | j                  d«      rt        | j	                  d«      d   «      c S | j                  «       sŒDt        | «      c S  y)Né   z--pages=ú=r   )ÚsysÚargvÚ
startswithÚintÚsplitÚisdigit)Úas    ú$/root/gov_crawler/crawl_lnfc_bmdt.pyÚparse_pages_argr      sU   € Ü�X‰X�a�bˆ\ò ˆØ�<‰<˜
Ô#Ü�q—w‘w˜s“| A‘Ó'Ò'Ø�9‰9�;Ü�q“6ŠMð	ð
 ó    c                 ó4  — t         j                  j                  | ddddœ¬«      }	 t         j                  j                  ||t        ¬«      }|j                  «       j                  dd¬	«      S # t        $ r }t        d
| d d › d|› �d¬«       Y d }~yd }~ww xY w)Nz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Language)Úheaders)ÚtimeoutÚcontextúutf-8Úreplace)Úerrorsz  [ERR] éF   z: T©ÚflushÚ )	ÚurllibÚrequestÚRequestÚurlopenÚctxÚreadÚdecodeÚ	ExceptionÚprint)Úurlr   ÚreqÚrespÚes        r   Úhttp_getr,   (   s•   € Ü
�.‰.×
 Ñ
  ØTØSØ4ñ/Ð
 ó €Cð
Ü�~‰~×%Ñ% c°7ÄCÐ%ÓHˆØ�y‰y‹{×!Ñ! '°)Ð!Ó<Ð<øÜò Ü�˜˜S˜b˜˜
 " Q CÐ(°Õ5Üûðús   §AA. Á.	BÁ7BÂBc                 ó˜   — t        j                  dd| xs d«      j                  «       } | j                  dd«      j                  dd«      S )Nu   ^[â€¢Â·Â·\s]+r   u   â€‹u   ï»¿)ÚreÚsubÚstripr   ©Úts    r   Úclean_titler3   6   s@   € Ü
�‰Ð  Q¢W¨"Ó-×3Ñ3Ó5€AØ�9‰9�X˜rÓ"×*Ñ*¨8°RÓ8Ð8r   c                 ó  — t        | 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 )	uL   æ­£æ–‡æ¸…æ´—: span/font unwrap + åµŒå¥—pæ‰�å¹³åŒ– + o:pæ¸…ç�† + ä¿�ç•™è¡¨æ ¼úhtml.parserc                 ó:   — | j                   xr d| j                   v S )Nú:)Únamer1   s    r   ú<lambda>zclean_content.<locals>.<lambda>>   s   €  q§v¡vÒ'?°#¸¿¹°-€ r   ÚspanÚfontÚpr   ÚstyleÚalign)r   Úfind_allÚ	decomposeÚunwrapÚfindÚgetÚattrsÚstr)ÚhtmlÚsoupÚtagr<   Únesteds        r   Úclean_contentrJ   ;   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   Á0DÂD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	 }t        t        |«      }|j                  |xs |j                  d
«      d   |dœ«       ŒÐ t        «       }g }	|D ]/  }
|
d   |vsŒ|j                  |
d   «       |	j                  |
«       Œ1 |	S )u2   æ­£æ–‡å†…é™„ä»¶é“¾æŽ¥: <a href="*.pdf/doc/xls...">z$<a[^>]+href="([^"]+)"[^>]*>(.*?)</a>r   é   Ú
javascriptz\.(pdf|docx?|xlsx?|zip|rar|7z)$ú<[^>]+>r   Néd   ú/éÿÿÿÿ)r8   r(   r(   )r.   ÚfinditerÚIÚSÚgroupr0   r   Úsearchr/   r   ÚBASE_URLÚappendr   ÚsetÚadd)Údetail_htmlÚ
detail_urlÚattsÚmÚhrefÚ	name_htmlr8   ÚfullÚseenÚuniqr   s              r   Úextract_attachmentsrd   N   s  € à€DÜ�[‰[Ð@À+ÌrÏtÉtÔVX×VZÑVZÉ{Ó[ò LˆØŸ'™' !›*×*Ñ*Ó,¨a¯g©g°a«jˆiˆÙ�t—‘ |Ô4ØÜ�9‰9Ð7¸¼r¿t¹tÕDÜ—6‘6˜* b¨)Ó4×:Ñ:Ó<¸T¸cÐBˆDÜœ8 TÓ*ˆDØ�K‰K Ò!<¨¯©°C«¸Ñ)<ÀTÑJÕKðLô ‹5€DØ€DØò ˆØˆU‰8˜4ÒØ�H‰H�Q�u‘XÔØ�K‰K˜�Nðð €Kr   c                 ój  — g }t        j                  dt         j                  «      }|j                  | «      D ]x  }|j	                  d«      j                  «       }|j	                  d«      }|j	                  d«      j                  «       }t        t        |«      }|sŒe|j                  |||f«       Œz |S )Nz`<div class="time">([^<]+)</div>\s*<div class="name">\s*<a[^>]+href="([^"]+)"[^>]*title="([^"]*)"r   rL   é   )	r.   ÚcompileÚ
IGNORECASErR   rU   r0   r   rW   rX   )rF   ÚarticlesÚpatr^   Údater_   Útitler(   s           r   Úextract_articlesrm   b   s›   € Ø€HÜ
�*‰*ØkÜ
�‰ó€Cð �\‰\˜$Óò 0ˆØ�w‰w�q‹z×ÑÓ!ˆØ�w‰w�q‹zˆØ—‘˜“
× Ñ Ó"ˆÜ”h Ó%ˆÚØ�O‰O˜S %¨Ð.Õ/ð0ð €Or   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t        «      |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)Tr   i"  )r   z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 (?,?,?,?,?,?,?,?,?,?,?,?)r(   rl   Úpub_dateÚcontentr   iô  zcrawl_lnfc_bmdt.pyÚattachmentsÚ
group_nameÚindustryÚotherr   z
  DB err: )ÚosÚpathÚexistsÚDB_PATHr'   Úsqlite3ÚconnectÚexecuteÚcursorÚ	SITE_NAMEÚCATEGORYrC   Ú
GROUP_NAMEÚrowcountÚErrorÚcommitÚclose)ÚresultsÚconnÚaddedÚskippedÚcurÚrr+   s          r   Ú
push_to_dbrŠ   r   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Ð7KÈQÈ}ÑM]Ø—‘�|¤ZÓ0°!·%±%¸
ÀGÓ2LðNô	ð �|‰|˜aÒØ˜‘
‘à˜1‘�ð 	�‰�ð#ð$ 	‡J�J„LØ�'ˆ>Ðøô �}‰}ò 	Ü�J˜q˜cÐ"¨$Õ/Ø�q‰L�Gûð	ús   ÂB D)Ä)EÄ<EÅEc                  ó˜  — t        «       } t        dt        › d| xs d› dt        › �d¬«       g }ddddœ}d	}t	        d
t
        d
z   «      D �]Ã  }| r|| kD  r �n¹|d
z
  }|dk(  rt        nt        d|› d�z   }t        |«      }|st        d|› d�d¬«        �n{t        |«      }|st        d|› d�d¬«        �nZd}	|D �]  \  }
}}|d d }|t        k  rt        d|› d�d¬«       d} �nç|dxx   d
z  cc<   |	d
z  }	t        |
«      }|st        d|d d › �d¬«       Œ_|dxx   d
z  cc<   t        |d«      }|j                  d«      }|rt        t        |«      «      nd}t        j                  dd|«      j!                  «       }t#        |«      dk  r�d|vr‹|
j%                  d«      rXd|
vrTdt'        |«      › d|
› d |
› d!�}t        j                  dd|«      j!                  «       }t        d"|d d › d#|
d d$ › �d¬«       n"t        d%|d d › �d¬«       |d&xx   d
z  cc<   �Œcd|v rt        j                  d'd(„ |«      }|}t        j(                  d)|«      }|r|j+                  d
«      }t-        ||
«      }|j/                  t        t'        |«      |||
|
t0        d*|rt3        j4                  |d	¬+«      ndd,œ	«       t7        j8                  d-«       �Œ t        d|› d.t
        › d/|	› d0t#        |«      › d1�	d¬«       |r nt7        j8                  d2«       �ŒÆ t;        t<        d3d4¬5«      5 }|D ]+  }|j?                  t3        j4                  |d	¬+«      d6z   «       Œ- 	 d d d «       t        d7t#        |«      › d8t<        › �d¬«       tA        |«      \  }}t        d9|› d:|› d;�d¬«       t        d<|d   › d=|d   › d>|d&   › d;�d¬«       y # 1 sw Y   ŒlxY w)?Nu   ç«™ç‚¹: u    æœ€å¤§é¡µ: u   å…¨é‡�z	 CUTOFF: Tr   r   )ÚlistÚ	detail_okÚemptyFr   z/fcszf/xwdt/bmdt/glistz.htmlu     é¡µu    æŠ“å�–å¤±è´¥u    æ— æ�¡ç›® (å�¯èƒ½åˆ°å¤´)é
   u       æ—¥æœŸ u    < CUTOFF å�œæ­¢rŒ   u       è¯¦æƒ…å¤±è´¥: é   r�   r5   zdiv.center-infor   rN   z<imgÚhttpzlnfc.gov.cnz<p>z</p>
<p><a href="z">z</a></p>u       å¤–é“¾å…¬å‘Š: z -> r   u       ç©ºæ­£æ–‡è·³è¿‡: rŽ   z(<img[^>]+src=")([^"]+)(")c                 óê   — | j                  d«      | j                  d«      j                  d«      r| j                  d«      nt        t        | j                  d«      «      z   | j                  d«      z   S )Nr   rL   r‘   rf   )rU   r   r   rW   )Úmms    r   r9   zmain.<locals>.<lambda>Ç   su   € ˜rŸx™x¨›{¸R¿X¹XÀa»[×=SÑ=SÐTZÔ=[¨b¯h©h°q¬kÔahÔiqÐsu×s{Ñs{Ð|}Ós~Óañ   Að  DF÷  DLñ  DLð  MNó  DOñ   O€ r   u(   å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}-\d{2}-\d{2})rt   )Úensure_ascii)	Ú	site_namerl   ro   rp   Ú
source_urlr(   rr   rs   rq   gš™™™™™Ù?rP   u    åˆ—è¡¨ u    æ�¡ (ç´¯è®¡ ú)g      ð?Úwr   )Úencodingú
u   å·²å†™ u    æ�¡åˆ° u   === å…¥åº“: æ–°å¢žu    è·³è¿‡z ===u   === å®Œæˆ�: åˆ—è¡¨u	    è¯¦æƒ…OKu    ç©º)!r   r'   r}   ÚCUTOFFÚrangeÚTOTAL_PAGESÚLIST_URLrW   r,   rm   r   Ú
select_onerJ   rE   r.   r/   r0   Úlenr   r3   rV   rU   rd   rX   r   ÚjsonÚdumpsÚtimeÚsleepÚopenÚOUTÚwriterŠ   )Ú	max_pagesr„   ÚstatsÚ
cutoff_hitÚpageÚnr(   rF   ri   Ú
page_itemsÚitem_urlrl   Údate_strÚdhÚdsoupÚconrp   Útextro   Údmr]   Úfr‰   r†   r‡   s                            r   Úmainr¶   ’   s  € ÜÓ!€IÜ	ˆH”Y�K˜|¨IÒ,A¸Ð+BÀ)ÌFÈ8Ð
TÐ\`Õaà€GØ Q°Ñ3€EØ€Jä�aœ q™Ó)ó DˆÙ˜ 	Ò)ÚØ�1‰HˆØ˜qš&�h¤hÐ3IÈ!ÈÈEÐ1RÑ&RˆÜ˜‹}ˆÙÜ�E˜$˜˜}Ð-°TÕ:ÚÜ# DÓ)ˆÙÜ�E˜$˜Ð8Ð9ÀÕFÚØˆ
Ø)1ó 2	Ñ%ˆH�e˜XØ  �}ˆHØœ&Ò Ü˜ H :Ð-=Ð>ÀdÕKØ!�
ÚØ�&‹M˜QÑ‹MØ˜!‰OˆJÜ˜(Ó#ˆBÙÜÐ*¨5°°"¨:¨,Ð7¸tÕDØØ�+Ó !Ñ#ÓÜ! " mÓ4ˆEØ×"Ñ"Ð#4Ó5ˆCÙ14”m¤C¨£HÔ-¸"ˆGÜ—6‘6˜* b¨'Ó2×8Ñ8Ó:ˆDÜ�4‹y˜2Š~ &°Ñ"7à×&Ñ& vÔ.°=ÈÑ3PØ #¤K°Ó$6Ð#7Ð7JÈ8È*ÐTWÐX`ÐWaÐaiÐj�GÜŸ6™6 *¨b°'Ó:×@Ñ@ÓB�DÜÐ.¨u°S°b¨z¨l¸$¸xÈÈ¸}¸oÐNÐVZÖ[äÐ1°%¸¸°*°Ð>ÀdÕKØ˜'“N aÑ'“NÙà˜Ñ ÜŸ&™&Ø1ñ OØó�ð
  ˆHÜ—‘ÐFÈÓKˆBÙØŸ8™8 A›;�Ü& r¨8Ó4ˆDØ�N‰NÜ&Ü$ UÓ+Ø$Ø"Ø&ØÜ(Ø#ÙGKœtŸz™z¨$¸UÕCÐQSñ
ô 
ô �J‰J�sŽOðe2	ôf 	��d�V˜1œ[˜M¨°*°¸]Ì3ÈwË<È.ÐXYÐZÐbfÕgÙÙÜ�
‰
�3ŽðIDôL 
Œc�3 Ô	)ð >¨QØò 	>ˆAØ�G‰G”D—J‘J˜q¨uÔ5¸Ñ<Õ=ñ	>÷>ô 
ˆG”C˜“L�> ¬#¨Ð
/°tÕ<ä Ó(�N€Eˆ7Ü	Ð˜u˜g W¨W¨I°TÐ
:À$ÕGÜ	Ð˜u V™}˜o¨Y°u¸[Ñ7IÐ6JÈ$ÈuÐU\É~ÐN^Ð^bÐ
cÐkoÖp÷>ð >ús   Ì#1O Ï O	Ú__main__)é   )%Ú__doc__r¡   ru   r.   r	   r£   ry   ÚsslÚurllib.requestr   Úurllib.parser   Úbs4r   r}   rW   rž   r�   r›   r¦   rx   r~   r   Úcreate_default_contextr#   Úcheck_hostnameÚ	CERT_NONEÚverify_moder   r,   r3   rJ   rd   rm   rŠ   r¶   Ú__name__© r   r   ú<module>rÄ      s´   ðñ÷ =× <× <× <Ý  Ý à$€	Ø$€ØÐ3Ñ3€Ø€Ø	€Ø€Ø
€Ø€Ø€
à €c× Ñ Ó"€Ø€Ô Ø—-‘-€„òóò9ò
ò&ò(ò ò@Uqðp ˆzÒÙ…Fð r   