Ë
    ¡Š£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mZ ddl	m
Z
 dZdZdZdZd	Zd
ddddœZdddddddœZh d£Zd„ Zd„ Zd"d„Zd„ Zd„ Zd„ Zd„ Zd#d„Zedk(  r<d ej8                  v Zej<                  j>                  jA                  «         ee¬!«       yy)$uG   é‡‘æ˜Œå¸‚æ”¿åŠ¡æœ�åŠ¡ç½‘ - ä¼�ä¸šå…¥é©»å›­åŒºä¸“åŒº/æ”¿ç­–èµ„è®¯/å…¬å‘Šé    N)Údatetime)ÚBeautifulSoupzPhttps://zwfw.gansu.gov.cn/api-gateway/jpaas-publish-server/front/page/build/unitzhttps://zwfw.gansu.gov.cnz/root/search.dbu   é‡‘æ˜Œç»�å¼€åŒºÚsite_jinchangzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z!application/json, text/plain, */*zzh-CN,zh;q=0.9zChttps://zwfw.gansu.gov.cn/jinchang/ztfw/qyrzyqzq/zczx/gg/index.html)z
User-AgentÚAcceptzAccept-LanguageÚRefererÚbulidstaticÚ d560d670ebd349669177bda54cb1bbb7Ú 2e48cb3b1d7e4d41aeab793605d882b4Úcolumnu   å½“å‰�æ �ç›®ajaxåˆ†é¡µÚ 0c925712c2364beb834fec0622949224)Ú	parseTypeÚwebIdÚtplSetIdÚpageTypeÚtagIdÚpageId>)   ÚpÚddÚdlÚdtÚh1Úh2Úh3Úh4Úh5Úh6ÚhrÚliÚolÚtdÚthÚtrÚulÚdivÚnavÚpreÚformÚmainÚasideÚtableÚtbodyÚtfootÚtheadÚcenterÚdialogÚfigureÚfooterÚheaderÚhgroupÚaddressÚarticleÚcaptionÚdetailsÚsectionÚfieldsetÚ
blockquoteÚ
figcaptionc                 óÒ   ‡‡‡— | €yddl }ddlmŠ g Šˆˆˆfd„Š ‰| «       dj                  ‰«      }|j	                  dd|«      }|j	                  dd	|«      }|j                  «       S )
ul   å�—çº§è¾¹ç•Œå‡ºæ�¢è¡Œã€�è¡Œå†…èŠ‚ç‚¹ç›´æŽ¥æ‹¼æŽ¥ã€�<br> å‡ºæ�¢è¡Œï¼ˆâ‰ˆ æµ�è§ˆå™¨çœ‹åˆ°çš„æ�¢è¡Œç»“æž„ï¼‰ã€‚NÚ r   )ÚNavigableStringc                 óF  •— | j                   D ]‘  }t        |‰«      r‰j                  t        |«      «       Œ*t	        |dd «      dk(  r‰j                  d«       ŒLt	        |dd «      t
        v r+‰j                  d«        ‰|«       ‰j                  d«       ŒŠ ‰|«       Œ“ y )NÚnameÚbrú
)ÚchildrenÚ
isinstanceÚappendÚstrÚgetattrÚ_BLOCK_TAGS)ÚnodeÚchr>   ÚoutÚwalks     €€€ú#/root/gov_crawler/crawl_jinchang.pyrL   zbody_text.<locals>.walk0   s„   ø€ Ø—-‘-ò 
	ˆBÜ˜"˜oÔ.Ø—
‘
œ3˜r›7Õ#Ü˜˜V TÓ*¨dÒ2Ø—
‘
˜4Õ Ü˜˜V TÓ*¬kÑ9Ø—
‘
˜4Ô Ù�R”Ø—
‘
˜4Õ á�R•ñ
	ó    z[ \t\r\f\v]*\n[ \t\r\f\v]*rB   ú\n{3,}ú

)ÚreÚbs4r>   ÚjoinÚsubÚstrip)ÚelÚ_reÚtr>   rK   rL   s      @@@rM   Ú	body_textrY   (   sb   ú€ à	€zØÛÝ#Ø
€Cöñ 	ˆ„HØ
�‰�‹€AØ�‰Ð-¨t°QÓ7€AØ�‰�	˜6 1Ó%€AØ�7‰7‹9ÐrN   c                  ój   — t        j                  t        «      } | j                  dt        › d�«       | S )NzCREATE TABLE IF NOT EXISTS z| (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT UNIQUE, url TEXT, date TEXT, content TEXT, summary TEXT, created_at TEXT))Úsqlite3ÚconnectÚDBÚexecuteÚTABLE)Úconns    rM   Úget_connra   C   s5   € Ü�?‰?œ2Ó€DØ‡L�LÐ.¬u¨gð  6rð  sô  tØ€KrN   c                 óP  — t        t        «      }t        j                  | ddœd¬«      |d<   	 t	        j
                  t        |t        dd¬«      }d|_        |j                  «       }|j                  d	«      r|d
   d   S y # t        $ r}t        d| › d|› �«       Y d }~y d }~ww xY w)Né   )ÚpageNoÚpageSizeF)Úensure_asciiÚ	paramJsoné   )ÚparamsÚheadersÚtimeoutÚverifyúutf-8ÚsuccessÚdataÚhtmlz  [ERROR] fetch list page ú: )ÚdictÚ
API_PARAMSÚjsonÚdumpsÚrequestsÚgetÚAPI_URLÚHEADERSÚencodingÚ	ExceptionÚprint)Úpageri   Úrro   Úes        rM   Ú
fetch_listr€   H   sœ   € Ü”*Ó€FÜŸ*™*°À"Ñ%EÐTYÔZ€Fˆ;Ñð	Ü�L‰Lœ¨¼È"ÐUZÔ[ˆØˆŒ
Ø�v‰v‹xˆØ�8‰8�IÔØ˜‘< Ñ'Ð'ØøÜò ÜÐ*¨4¨&°°1°#Ð6Ô7Üûðús   ®AB Â	B%Â
B Â B%c                 óº  — g }t        | d«      }|j                  dd¬«      D ]¶  }|j                  d«      }|j                  d«      }|r|j                  d«      sŒ9|j                  dd	«      j	                  «       }|s|j                  d
¬«      }|d   }|j                  d«      r	t        |z   }|r|j                  d
¬«      nd	}|j                  |||dœ«       Œ¸ |S )Núhtml.parserr   Úclearfix©Úclass_ÚaÚspanÚhrefÚtitler=   T)rU   ú/)r‰   ÚurlÚdate)	r   Úfind_allÚfindrw   rU   Úget_textÚ
startswithÚBASErE   )	rp   ÚitemsÚsoupr   r†   r‡   r‰   rˆ   rŒ   s	            rM   Ú
parse_listr”   V   sÓ   € Ø€EÜ˜˜}Ó-€DØ�m‰m˜D¨ˆmÓ4ò BˆØ�G‰G�C‹LˆØ�w‰w�v‹ˆÙ˜Ÿ™˜fœØØ—‘�g˜rÓ"×(Ñ(Ó*ˆÙØ—J‘J T�JÓ*ˆEØ�‰yˆØ�?‰?˜3ÔÜ˜$‘;ˆDÙ,0ˆt�}‰} 4ˆ}Ô(°bˆØ�‰˜u¨T¸4Ñ@ÕAðBð €LrN   c                 óÌ   — t        | d«      }|j                  dd¬«      }|rCt        |j                  dd«      «      }t        |j                  dd«      «      }||z   d	z
  |z  }|S y	)
z,Extract total pages from the pagination div.r‚   r$   Ú
paginationr„   Úcountr   Úrowsrc   é   )r   rŽ   Úintrw   )rp   r“   r–   r—   r˜   Útotal_pagess         rM   Úget_page_inforœ   h   si   € ä˜˜}Ó-€DØ—‘˜5¨�Ó6€JÙÜ�J—N‘N 7¨AÓ.Ó/ˆÜ�:—>‘> &¨"Ó-Ó.ˆØ˜t‘| aÑ'¨DÑ0ˆØÐØrN   c                 ó²   — 	 t        j                  | t        dd¬«      }d|_        |j                  S # t
        $ r}t        d| › d|› �«       Y d }~y d }~ww xY w)Nrh   F)rj   rk   rl   rm   z  [ERROR] fetch detail rq   )rv   rw   ry   rz   Útextr{   r|   )r‹   r~   r   s      rM   Úfetch_detailrŸ   s   sT   € ðÜ�L‰L˜¤g°rÀ%ÔHˆØˆŒ
Ø�v‰vˆøÜò ÜÐ'¨ u¨B¨q¨cÐ2Ô3Üûðús   ‚/2 ²	A»AÁAc                 óè   — t        | d«      }|j                  dd¬«      }|sy|j                  dd¬«      }|syt        |«      }t        j                  dd|«      }t        |«      d	kD  r|d
d	 n|}||fS )z$Extract clean text from detail page.r‚   r$   r5   r„   )r=   r=   ÚcontentrO   rP   i,  N)r   rŽ   rY   rQ   rT   Úlen)rp   r“   r5   r¡   rž   Úsummarys         rM   Úextract_textr¤   |   s{   € ä˜˜}Ó-€DØ�i‰i˜ iˆiÓ0€GÙØØ�l‰l˜5¨ˆlÓ3€GÙØÜ�WÓ€DÜ�6‰6�)˜V TÓ*€DÜ ›I¨šOˆd�4�C‰j°€GØ�ˆ=ÐrN   c                 ó  — t        «       }|j                  «       }t        «       }| r1|j                  dt        › �«      D ]  }|j                  |d   «       Œ t        d«      }|s t        d«       t        j                  d«       t        |«      }d}t        |«      }|t        |«      z  }t        d|dz   «      D ]  }	t        |	«      }|rIt        |«      }
|j                  |
«       |t        |
«      z  }t        d|	› d|› dt        |
«      › d	�«       nt        d|	› d|› d
�«       t        j                   d«       Œ� t        dt        |«      › �«       d}d}|D ]Ô  }|d   }||v r|dz  }Œt#        |d   «      }|s|dz  }Œ(t%        |«      \  }}|rt        |«      dk  r|dz  }ŒLt'        j(                  «       j+                  d«      }	 |j                  dt        › d�||d   |d   |||f«       |j,                  dkD  r+|dz  }|dk  s|dz  dk(  rt        d|d d › d|d   › d�«       n|dz  }ŒÖ |j1                  «        |j3                  «        t        d|› d|› �«       y # t.        $ r}t        d|› �«       Y d }~�Œ&d }~ww xY w)NzSELECT title FROM r   r™   z[ERROR] Could not fetch listé   z  Page rŠ   rq   z itemsz: FAILEDg      à?zTotal items: r‰   r‹   é
   z%Y-%m-%d %H:%M:%SzINSERT OR IGNORE INTO zF (title, url, date, content, summary, created_at) VALUES (?,?,?,?,?,?)rŒ   é   rc   z  + é2   z... (ú)z  [ERROR] DB insert: z
Done! Inserted: z, Skipped: )ra   ÚcursorÚsetr^   r_   Úaddr€   r|   ÚsysÚexitrœ   r”   r¢   ÚrangeÚextendÚtimeÚsleeprŸ   r¤   r   ÚnowÚstrftimeÚrowcountr{   ÚcommitÚclose)Úincrementalr`   ÚcurÚexistingÚrowrp   r›   Útotal_countÚ	all_itemsr   r’   Útotal_insertedÚtotal_skippedÚitemr‰   Údetail_htmlrž   r£   r´   r   s                       rM   ÚcrawlrÃ   Š   s®  € Ü‹:€DØ
�+‰+‹-€Cä‹u€HÙØ—;‘;Ð!3´E°7Ð;Ó<ò 	!ˆCØ�L‰L˜˜Q™Õ ð	!ô �a‹=€DÙÜÐ,Ô-Ü�‰�Œä Ó%€KØ€KÜ˜4Ó €IØ”3�y“>Ñ!€Kä�1�k A‘oÓ&ò 	ˆÜ˜!‹}ˆÙÜ˜tÓ$ˆEØ×Ñ˜UÔ#Øœ3˜u›:Ñ%ˆKÜ�G˜A˜3˜a ˜}¨B¬s°5«z¨l¸&ÐAÕBä�G˜A˜3˜a ˜}¨HÐ5Ô6Ü�
‰
�3�ð	ô 
ˆMœ#˜i›.Ð)Ð
*Ô+à€NØ€Màò /ˆØ�W‘ˆØ�HÑØ˜QÑˆMØä" 4¨¡;Ó/ˆÙØ˜QÑˆMØä$ [Ó1‰ˆˆgÙ”s˜4“y 2’~Ø˜QÑˆMØä�l‰l‹n×%Ñ%Ð&9Ó:ˆð	/Ø�K‰KØ(¬¨Ð/uÐvØ˜˜U™ T¨&¡\°4¸À#ÐFôð �|‰|˜aÒØ !Ñ#�Ø! QÒ&¨.¸2Ñ*=ÀÒ*BÜ˜D  s¨  ¨E°$°v±,°¸qÐAÕBà Ñ"�øð7/ð> 	‡K�K„MØ‡J�J„LÜ	Ð˜~Ð.¨k¸-¸Ð
IÕJøô ò 	/ÜÐ)¨!¨Ð-×.Ò.ûð	/ús   Ç	A%I"É"	JÉ+I?É?JÚ__main__z--incremental)r¹   )r™   )F)!Ú__doc__rv   r®   Úosr[   rQ   r²   rt   r   rR   r   rx   r‘   r]   Ú	SITE_NAMEr_   ry   rs   rH   rY   ra   r€   r”   rœ   rŸ   r¤   rÃ   Ú__name__Úargvr¹   ÚpackagesÚurllib3Údisable_warnings© rN   rM   ú<module>rÎ      sÓ   ðá Mß 1× 1× 1Ó 1Ý Ý à
\€Ø"€Ø€Ø€	Ø€ð DØ1Ø'ØTñ	€ð Ø/Ø2ØØ%Ø0ñ€
ò*€òò6ó
òò$	òòóEKðN ˆzÒØ! S§X¡XÐ-€KØ×Ñ×Ñ×.Ñ.Ô0Ù	�kÖ"ð rN   