Ë
     I‚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mZm	Z	 ddl
mZ dZdZedz   ZdZ ej                   «        e	d	¬
«      z
  j#                  d«      ZdZdZdZdZdZedddœZd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Ze dk(  r e«        yy)u  ä¸´æ¾§åŽ¿äººæ°‘æ”¿åºœ - å…¬å‘Šå…¬ç¤ºæ �ç›®çˆ¬è™« (linli.gov.cn /zwyw/gggs)
ç«™ç‚¹: https://www.linli.gov.cn (æ¹–å�—å¸¸å¾·ä¸´æ¾§åŽ¿, PowerCMS)
æ �ç›®: /zwyw/gggs (æ”¿åŠ¡è¦�é—» > å…¬å‘Šå…¬ç¤º, 2009æ�¡/101é¡µ)
åˆ—è¡¨: ul.newsList > li > span.date + a[href][title], åˆ†é¡µ /zwyw/gggs_{N}
è¯¦æƒ…: div.conTxt æ­£æ–‡ + meta ArticleTitle/PubDate
é™„ä»¶: æ­£æ–‡å†… <a href="*.pdf/doc/xls..."> æ­£åˆ™æ��å�– urljoin ç»�å¯¹åŒ–
å…¥åº“: INSERT OR IGNORE ç›´æ�’ gov_raw (FTS è§¦å�‘å™¨è‡ªåŠ¨å�Œæ­¥ gov_search)
è¿�è¡Œ: python3 crawl_linli_gggs.py [--pages=N]
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoupu   ä¸´æ¾§åŽ¿-å…¬å‘Šå…¬ç¤ºzhttps://www.linli.gov.cnz
/zwyw/gggsée   iG  )Údaysz%Y-%m-%dzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36z/tmp/linli_gggs.jsonlz/root/search.dbu   å…¬å‘Šå…¬ç¤ºu   æ¹–å�—z?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-Languagec                  óÎ   — 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_linli_gggs.pyÚparse_pages_argr   #   sU   € Ü�X‰X�a�bˆ\ò ˆØ�<‰<˜
Ô#Ü�q—w‘w˜s“| A‘Ó'Ò'Ø�9‰9�;Ü�q“6ŠMð	ð
 ó    c                 óœ  — t        |«      D ]r  }	 t        j                  | t        d¬«      }d|_        |j
                  dk(  r0||dz
  k  rt        j                  d«       ŒTt        d| › �d¬«        y |j                  c S  y # t        $ r@}||dz
  k  rt        j                  d	«       Y d }~Œ¡t        d
| › d|› �d¬«       Y d }~ y d }~ww xY w)Né   )ÚheadersÚtimeoutúutf-8i“  r
   z  [WAF-403] T©Úflushé   z
  [ERROR] z: )ÚrangeÚrequestsÚgetÚHEADERSÚencodingÚstatus_codeÚtimeÚsleepÚprintÚtextÚ	Exception)ÚurlÚretriesÚattemptÚrÚes        r   Úfetchr.   ,   s¼   € Ü˜“>ò ˆð	Ü—‘˜S¬'¸2Ô>ˆAØ ˆAŒJØ�}‰} Ò#Ø˜W q™[Ò(Ü—J‘J˜r”NØÜ˜ S EÐ*°$Õ7ÙØ—6‘6ŠMñøô ò 	Ø˜ 1™Ò$Ü—
‘
˜1”ÜÜ�J˜s˜e 2 a SÐ)°Õ6Ýûð	ús*   �ABÁ BÁ2BÂ	CÂCÂ-CÃCc                 óœ   — t        j                  dd| xs d«      j                  «       } | j                  dd«      j                  dd«      } | S )Nu   ^[â€¢Â·Â·\s]+Ú u   â€‹u   ï»¿)ÚreÚsubÚstripÚreplace©Úts    r   Úclean_titler7   @   sD   € Ü
�‰Ð  Q¢W¨"Ó-×3Ñ3Ó5€AØ	�	‰	�(˜BÓ×'Ñ'¨°"Ó5€AØ€Hr   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ú:)Únamer5   s    r   ú<lambda>zclean_content.<locals>.<lambda>I   s   €  q§v¡vÒ'?°#¸¿¹°-€ r   ÚspanÚfontÚpr   ÚstyleÚalign)r   Úfind_allÚ	decomposeÚunwrapÚfindr    ÚattrsÚstr)ÚhtmlÚsoupÚtagr@   Únesteds        r   Úclean_contentrM   F   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Œ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 )u2   æ­£æ–‡å†…é™„ä»¶é“¾æŽ¥: <a href="*.pdf/doc/xls...">z$<a[^>]+href="([^"]+)"[^>]*>(.*?)</a>r
   r   Ú
javascriptz\.(pdf|docx?|xlsx?|zip|rar|7z)$ú<[^>]+>r0   Néd   ú/Úhttpr   éÿÿÿÿ)r<   r)   r)   )r1   ÚfinditerÚIÚSÚgroupr3   r   Úsearchr2   ÚBASEÚrsplitÚappendr   ÚsetÚadd)
Údetail_htmlÚ
detail_urlÚattsÚmÚhrefÚ	name_htmlr<   ÚseenÚuniqr   s
             r   Úextract_attachmentsrg   Z   sO  € à€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Ø�‰˜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                 ó¼  — | 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)   ÚtitleÚpub_dateÚcontentr0   iô  zcrawl_linli_gggs.pyÚattachmentsÚ
group_nameÚindustryÚotherr
   z
  DB err: )ÚosÚpathÚexistsÚDB_PATHr&   Úsqlite3ÚconnectÚexecuteÚcursorÚ	SITE_NAMEÚCATEGORYr    Ú
GROUP_NAMEÚrowcountÚErrorÚcommitÚclose)ÚresultsÚconnÚaddedÚskippedÚcurr,   r-   s          r   Ú
push_to_dbr„   q   sZ  € ÙØÜ�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Ð7LÈaÐP]ÑN^Ø—‘�|¤ZÓ0°!·%±%¸
ÀGÓ2LðNô	ð �|‰|˜aÒØ˜‘
‘à˜1‘�ð 	�‰�ð#ð$ 	‡J�J„LØ�'ˆ>Ðøô �}‰}ò 	Ü�J˜q˜cÐ"¨$Õ/Ø�q‰L�Gûð	ús   ÂB D)Ä)EÄ<EÅEc                  óX  ‡— 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
k(  rt        n
t        › d|› �}t        |«      }|st        d|› d�d¬«       ŒCt        |d«      }|j                  d«      }|st        d|› d�d¬«       Œtd}	|D �]g  }
|
j                  d«      }|
j                  dd¬«      }|r|sŒ-|j                  dd«      }|j                  d«      r	t        |vrŒYt        |j                  dd«      xs |j                  d¬«      «      }|j                  d¬«      }t!        j"                  d|«      sŒ±|t        k  rt        d|› d�d¬«       d} �n›|j                  d«      r|nt        |z   Š|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"t        d%|d d › �d¬«       |d&xx   d
z  cc<   �Œ»d$|v rt!        j*                  d'ˆfd(„|«      }|}t!        j0                  d)|«      }|r+|j3                  d
«      d d# |k\  r|j3                  d
«      d d# }t5        |‰«      }t        |||‰‰t6        d*|rt9        j:                  |d	¬+«      ndd,œ	}|j=                  |«       �Œj |r n?t        d|› d-t
        › d.|	› d/t/        |«      › d0�	d¬«       t?        j@                  d1«       �Œ% tC        tD        d2d3¬4«      5 }|D ]+  }|jG                  t9        j:                  |d	¬+«      d5z   «       Œ- 	 d d d «       t        d6t/        |«      › d7tD        › �d¬«       tI        |«      \  }}t        d8|› d9|› 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
   Ú_u     é¡µu    åˆ—è¡¨å¤±è´¥r9   zul.newsList > liu
    æ— æ�¡ç›®r   r>   Údate)Úclass_rc   r0   rS   ri   )r3   z^\d{4}-\d{2}-\d{2}$u       æ—¥æœŸ u    < CUTOFF å�œæ­¢r†   u       è¯¦æƒ…å¤±è´¥: r   r‡   z
div.conTxtrP   é
   z<imgu       ç©ºæ­£æ–‡è·³è¿‡: rˆ   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   rS   rR   r   é   )rX   r   rZ   r[   )Úmmr`   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   z.<meta[^>]+name="PubDate"[^>]+content="([^"]+)"ro   )Úensure_ascii)	Ú	site_nameri   rj   rk   Ú
source_urlr)   rm   rn   rl   rR   u    åˆ—è¡¨ u    æ�¡ (ç´¯è®¡ ú)é   Úwr   )r"   ú
u   å·²å†™ u    æ�¡åˆ° u   === å…¥åº“: æ–°å¢žu    è·³è¿‡z ===u   === å®Œæˆ�: åˆ—è¡¨u	    è¯¦æƒ…OKu    ç©º)%r   r&   rx   ÚCUTOFFr   ÚTOTAL_PAGESÚLIST_URLr.   r   ÚselectrF   r    r   rZ   r7   Úget_textr1   ÚmatchÚ
select_onerM   rH   r2   r3   ÚlenrY   rX   rg   rz   ÚjsonÚdumpsr\   r$   r%   ÚopenÚOUTÚwriter„   )Ú	max_pagesr   ÚstatsÚ
cutoff_hitÚpnr)   rI   rJ   ÚlisÚ
page_itemsÚlir   Ú	date_spanrc   ri   Údate_strr_   ÚdsoupÚconrk   r'   rj   rb   ra   ÚrecÚfr,   r�   r‚   r`   s                                @r   Úmainr±   ‘   sM  ø€ ÜÓ!€IÜ	ˆH”Y�K˜|¨IÒ,A¸Ð+BÀ)ÌFÈ8Ð
TÐ\`Õaà€GØ Q°Ñ3€EØ€Jä�A”{ Q‘Ó'ó JˆÙ˜˜išÚØ š'�h¬(¨°1°R°DÐ'9ˆÜ�S‹zˆÙÜ�E˜"˜˜]Ð+°4Õ8ØÜ˜T =Ó1ˆØ�k‰kÐ,Ó-ˆÙÜ�E˜"˜˜ZÐ(°Õ5ØØˆ
Øó 8	 ˆBØ—‘˜“ˆAØŸ™ ¨v˜Ó6ˆIÙ™IØØ—5‘5˜ Ó$ˆDØ�‰˜vÔ&¬4°tÑ+;ØÜ §¡ g¨rÓ 2Ò L°a·j±jÀt°jÓ6LÓMˆEØ ×)Ñ)°Ð)Ó5ˆHÜ—8‘8Ð2°HÔ=ØØœ&Ò Ü˜ H :Ð-=Ð>ÀdÕKØ!�
ÚØ!%§¡°Ô!8™¼dÀT¹kˆJØ�&‹M˜QÑ‹MØ˜!‰OˆJä 
Ó+ˆKÙÜÐ*¨5°°"¨:¨,Ð7¸tÕDÙØ�+Ó !Ñ#ÓÜ! +¨}Ó=ˆEØ×"Ñ" <Ó0ˆCÙ14”m¤C¨£HÔ-¸"ˆGÜ—6‘6˜* b¨'Ó2×8Ñ8Ó:ˆDÜ�4‹y˜2Š~ &°Ñ"7ÜÐ-¨e°C°R¨j¨\Ð:À$ÕGØ�g“ !Ñ#“Ùà˜Ñ ÜŸ&™&Ø1ó ZØó�ð
  ˆHÜ—	‘	ÐKÈ[ÓYˆAÙ�Q—W‘W˜Q“Z  �_¨Ò0ØŸ7™7 1›: c r˜?�Ü& {°JÓ?ˆDä&ØØ$Ø"Ø(Ø!Ü(Ø#ÙGKœtŸz™z¨$¸UÕCÐQSñ
ˆCð �N‰N˜3Öðq8	 ñr ÙÜ��b�T˜œ;˜- x°
¨|¸=ÌÈWËÈÐVWÐXÐ`dÕeÜ�
‰
�2ŽðUJôX 
Œ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   Î1P Ð P)Ú__main__)rŽ   )!Ú__doc__rŸ   rp   r1   r   r$   rt   r   r   r   Úbs4r   rx   rZ   r™   r˜   ÚnowÚstrftimer—   ÚUAr¢   rs   ry   rz   r!   r   r.   r7   rM   rg   r„   r±   Ú__name__© r   r   ú<module>rº      s¿   ðñ÷ (× '× 'Û ß (Ý à$€	Ø!€Ø�,Ñ€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Øv€Ø€Ø
€Ø€Ø€
ð ØOØ0ñ€òóò(òò(ò.ò@[qð| ˆzÒÙ…Fð r   