Ë
    ¡Š£j3,  ã                   ó´  — 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lmZ  ej                  dd«      ZdZd	Zed
z   Zedz   Z ej&                  «        ed¬«      z
  j)                  d«      ZdZdddddœZh d£Zd„ Zd d„Zd„ Zd„ Zd„ Zd„ Zd„ Ze dk(  r7 e!ejD                  «      dkD  rejD                  d   dk(  r e«        y e«        yy)!u  
å¸¸å¾·å¸‚äººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Š
https://www.changde.gov.cn/cdzx/gsgg
WebFuture CMS v15.2.8, é�™æ€�åˆ†é¡µ /cdzx/gsgg_{n}
åˆ—è¡¨: ul.newsList > li (span.date + a[title])
è¯¦æƒ…: h2.title + div.conTxt + é™„ä»¶

æ³¨æ„�: è¯¥ç«™æœ‰ WAF CCæ”»å‡»é˜²å¾¡ï¼Œè¯·æ±‚é—´éš”å¿…é¡» â‰¥1ç§’
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)ÚurljoinÚ	SEARCH_DBz/root/search.dbu   å¸¸å¾·å¸‚-å…¬ç¤ºå…¬å‘Šzhttps://www.changde.gov.cnz
/cdzx/gsggz/cdzx/gsgg_{}iG  )Údaysz%Y-%m-%dé
   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36zUtext/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8zzh-CN,zh;q=0.9zhttps://www.changde.gov.cn/)z
User-AgentÚAcceptzAccept-LanguageÚReferer>)   Ú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Úchr7   ÚoutÚwalks     €€€ú"/root/gov_crawler/crawl_changde.pyrE   zbody_text.<locals>.walk2   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]*r;   z\n{3,}z

)ÚreÚbs4r7   ÚjoinÚsubÚstrip)ÚelÚ_reÚtr7   rD   rE   s      @@@rF   Ú	body_textrP   *   sb   ú€ à	€zØÛÝ#Ø
€Cöñ 	ˆ„HØ
�‰�‹€AØ�‰Ð-¨t°QÓ7€AØ�‰�	˜6 1Ó%€AØ�7‰7‹9ÐrG   c           
      óÖ  — ddl }t        |«      D ]„  }	 |j                  | t        d¬«      }|j                  dk(  r6d|dz   z  }t        d|› d	|dz   › d
|› d�«       t        j                  |«       Œad|_        |j                  dk(  r|j                  c S Œ† y# |j                  $ rA}||dz
  k  r/d|dz   z  }t        d|› d|› d�«       t        j                  |«       Y d}~ŒÓd}~ww xY w)z5Fetch URL with rate limiting and retry on WAF blocks.r   Né   )ÚheadersÚtimeouti“  r	   é   u       âš ï¸� WAF 403, ç­‰å¾… u   s å�Žé‡�è¯• (ú/ú)zutf-8éÈ   é   u       âš ï¸� è¯·æ±‚å¼‚å¸¸: z, u
   så�Žé‡�è¯•)ÚrequestsÚrangeÚgetÚHEADERSÚstatus_codeÚprintÚtimeÚsleepÚencodingÚtextÚRequestException)ÚurlÚretriesrZ   ÚiÚrÚwaitÚes          rF   Úfetchrk   E   s÷   € ãÜ�7‹^ò !ˆð	!Ø—‘˜S¬'¸2�Ó>ˆAØ�}‰} Ò#Ø˜Q ™U‘|�ÜÐ3°D°6¸ÀqÈÁsÀeÈ1ÈWÈIÐUVÐWÔXÜ—
‘
˜4Ô ØØ ˆAŒJØ�}‰} Ò#Ø—v‘v’ð $ð!ð  øð ×(Ñ(ò 	!Ø�7˜Q‘;ŠØ˜A ™E‘{�ÜÐ1°!°°B°t°f¸JÐGÔHÜ—
‘
˜4Ô ÿøð		!ús   ”ABÁ1!BÂC(Â'7C#Ã#C(c                 ó   — g }t        | d«      }|j                  dd¬«      }|s|S |j                  d«      D ]Ô  }|j                  d«      }|sŒ|j                  dd«      j	                  «       }|s|j                  d	¬
«      }|j                  dd«      j	                  «       }|r|j                  d«      rŒt        t        |«      }|j                  dd¬«      }	|	r|	j                  d	¬
«      nd}
|sŒ»|sŒ¾|
sŒÁ|j                  |||
f«       ŒÖ |S )z3Parse list page, return list of (title, url, date).úhtml.parserr   ÚnewsList©Úclass_r   ÚaÚtitler6   T©rL   ÚhrefÚ
javascriptÚspanÚdate)
r   ÚfindÚfind_allr\   rL   Úget_textÚ
startswithr   ÚBASE_URLr>   )ÚhtmlÚitemsÚsoupr   r   rq   rr   rt   re   Ú	span_daterw   s              rF   Ú
parse_listr�   Z   s  € à€EÜ˜˜}Ó-€DØ	�‰�4 
ˆÓ	+€BÙØˆà�k‰k˜$Óò -ˆØ�G‰G�C‹LˆÙØØ—‘�g˜rÓ"×(Ñ(Ó*ˆÙØ—J‘J T�JÓ*ˆEØ�u‰u�V˜RÓ ×&Ñ&Ó(ˆÙ�t—‘ |Ô4ØÜ”h Ó%ˆà—G‘G˜F¨6�GÓ2ˆ	Ù1:ˆy×!Ñ!¨Ð!Ô-Àˆâ’SšTØ�L‰L˜%  dÐ+Õ,ð!-ð$ €LrG   c                 ó0  — t        | d«      }|j                  dd¬«      }|r|j                  d¬«      nd}d}d}|j                  dd	¬«      }|r{|j                  d
«      D ]g  }|j                  d¬«      }	t	        j
                  d|	«      }
|
r|
j                  d«      }d|	v sŒCt	        j                  dd|	«      j                  «       }Œi g }g }|j                  dd¬«      }|�rŽ|j                  D ]Æ  }t        |t        «      r%|j                  «       }	|	sŒ&|j                  |	«       Œ8|j                  dv r t        |«      }	|	sŒT|j                  |	«       Œf|j                  dk(  r1t        |«      }	|	sŒƒ|j                  |	«       |j                  d«       Œ¦|j                  dk(  sŒ¶|j                  d«       ŒÈ |j                  dt	        j                  dt        j                   «      ¬«      D ]�  }t#        t$        |j'                  dd«      «      }|j                  d¬«      xs1 t(        j*                  j-                  |«      j/                  d«      d   }|sŒk|sŒn|j                  ||dœ«       Œƒ dj1                  |«      j                  «       }|||||fS )zParse detail page data.rm   r   rr   ro   Trs   r6   r   Úpropertyrv   z!(\d{4}-\d{2}-\d{2}\s*\d{2}:\d{2})rU   u   æ�¥æº�u   ^æ�¥æº�[ï¼š:]?\s*ÚconTxt)r   r   r1   r#   r:   rq   z\.(doc|docx|pdf|xls|xlsx)(\?|$))rt   rt   ú?r   )re   r9   r;   )r   rx   rz   ry   rH   ÚsearchÚgrouprK   rL   r<   r=   r?   r>   r9   rP   ÚcompileÚIr   r|   r\   ÚosÚpathÚbasenameÚsplitrJ   )r}   re   r   Útitle_elrr   rw   ÚsourceÚpropÚspÚtxtÚdmÚcontent_partsÚattachmentsr„   rM   Úa_tagÚatt_urlÚatt_nameÚcontent_texts                      rF   Úparse_detailrš   v   sX  € ä˜˜}Ó-€Dð �y‰y˜ gˆyÓ.€HÙ-5ˆH×Ñ DÐÔ)¸2€Eð €DØ€FØ�9‰9�U :ˆ9Ó.€DÙØ—-‘- Ó'ò 	GˆBØ—+‘+ D�+Ó)ˆCÜ—‘Ð?ÀÓEˆBÙØ—x‘x “{�Ø˜3ŠÜŸ™Ð 4°b¸#Ó>×DÑDÓF‘ð	Gð €MØ€Kà�Y‰Y�u XˆYÓ.€FÚØ—/‘/ò 	)ˆBÜ˜"œcÔ"Ø—h‘h“j�ÚØ!×(Ñ(¨Õ-Ø—‘Ð3Ñ3Ü “m�ÚØ!×(Ñ(¨Õ-Ø—‘˜GÒ#Ü “m�ÚØ!×(Ñ(¨Ô-Ø!×(Ñ(¨Õ,Ø—‘˜D“Ø×$Ñ$ RÕ(ð	)ð" —_‘_ S¬r¯z©zÐ:\Ô^`×^bÑ^bÓ/c�_Ódò 	GˆEÜœh¨¯	©	°&¸"Ó(=Ó>ˆGØ—~‘~¨D�~Ó1Ò\´R·W±W×5EÑ5EÀgÓ5N×5TÑ5TÐUXÓ5YÐZ[Ñ5\ˆHÚš8Ø×"Ñ"¨7¸HÑ#EÕFð		Gð —9‘9˜]Ó+×1Ñ1Ó3€LØ�,  f¨kÐ9Ð9rG   c                 óú  — t        j                  t        d¬«      }|j                  d«       |j	                  «       }d}d}d}| D ]�  \  }}}}	}
}|sŒ|	r|	dd n|}|j                  d|f«       |j                  «       }|r2|d   t        k7  r |j                  d	t        |d   f«       |dz  }|dz  }Œm|j                  d
|||t        |	|
|d|f	«       |dz  }Œ’ |j                  «        |j                  «        |||fS )zPush items to gov_raw.é<   ©rT   zPRAGMA busy_timeout=5000r   NrX   z2SELECT id, site_name FROM gov_raw WHERE page_url=?rU   z)UPDATE gov_raw SET site_name=? WHERE id=?úŽINSERT INTO gov_raw (title, page_url, publish_date, site_name, content, source_url, attachments, category, summary) VALUES (?,?,?,?,?,?,?,?,?)õ   æ”¿åºœå…¬å‘Š)	Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚfetchoneÚ	SITE_NAMEÚcommitÚclose)r~   ÚconnÚcÚ	new_countÚ
skip_countÚupdate_countrr   re   rw   Úcontentr�   Ú	atts_jsonÚsummaryÚrows                 rF   Ú
push_to_dbr²   «   s  € ä�?‰?œ7¨BÔ/€DØ‡L�LÐ+Ô,Ø�‰‹€Aà€IØ€JØ€Là8=ò Ñ4ˆˆs�D˜' 6¨9ÙØá#*�'˜$˜3‘-°ˆØ	�	‰	ÐFÈÈÔOØ�j‰j‹lˆÙà�1‰vœÒ"Ø—	‘	ÐEÌ	ÐSVÐWXÑSYÐGZÔ[Ø Ñ!�Ø˜!‰OˆJØà	�	‰	ð ]Ø�C˜œy¨'°6¸9ÀnÐV]Ð^ô	
ð 	�Q‰‰	ð'ð* 	‡K�K„MØ‡J�J„LØ�j ,Ð.Ð.rG   c                  óê  — t        dt        › dt        › �«       g } t        dt        dz   «      D ]Ô  }|dk(  rt
        nt        j                  |«      }t        d|› d|› �«       t        |«      }|s!t        d«       t        j                  d«       Œbt        |«      }t        dt        |«      › d	�«       |D ]4  \  }}}|t        k\  r| j                  |||f«       Œ%t        d
|› d�«        n t        j                  d«       ŒÔ n t        dt        | «      › d�«       g }t        | «      D ]Ÿ  \  }	\  }}}|	dz   dz  dk(  rt        d|	dz   › dt        | «      › �«       t        |«      }|rLt        ||«      \  }
}}}}|
s|}
|s|}|rt!        j"                  |d¬«      nd}|j                  |
|||||f«       t        j                  d«       Œ¡ |j%                  d„ d¬«       |D ������cg c]  \  }}}}}}||||||f‘Œ }}}}}}}t'        |«      \  }}}t        dt        › d�«       t        dt        |«      › �«       t        d|› �«       t        d|› �«       t        d|› �«       y c c}}}}}}w ) Nú[u   ] å¼€å§‹çˆ¬å�–ï¼Œé˜ˆå€¼: rU   u     åˆ—è¡¨ç¬¬u   é¡µ: u        âš ï¸� èŽ·å�–å¤±è´¥ï¼Œè·³è¿‡é   u       â†’ õ    æ�¡u!       â�¹ï¸� é�‡åˆ°è¶…é˜ˆå€¼æ—¥æœŸ u   ï¼Œå�œæ­¢ç¿»é¡µg      ø?u   å…± u    æ�¡å¾…å¤„ç�†ï¼ˆè¿‘3å¹´ï¼‰r	   r   u
     è¯¦æƒ…: rV   F©Úensure_asciiú[]ç333333ó?c                 ó   — | d   S )Né   © )Úxs    rF   ú<lambda>zmain.<locals>.<lambda>   s
   €  a¨¡d€ rG   T)ÚkeyÚreversez
[u   ] å®Œæˆ�u     æ€»å¤„ç�†: õ
     æ–°å¢ž: u     è·³è¿‡(å·²å­˜åœ¨): u     æ›´æ–°ç«™ç‚¹å��: )r_   r¦   Ú	THRESHOLDr[   ÚTOTAL_PAGESÚLIST_URL_TPLÚLIST_URL_TPL_NÚformatrk   r`   ra   r�   Úlenr>   Ú	enumeraterš   ÚjsonÚdumpsÚsortr²   )Ú	all_itemsÚpageÚlist_urlr}   r~   rr   re   rw   Údetail_resultsrg   Úd_titler®   Úd_dater�   Úattsr¯   r   r   ÚcontÚsrcÚ
push_itemsr«   r¬   r­   s                           rF   r!   r!   Î   sŽ  € Ü	ˆAŒiˆ[Ð1´)°Ð
=Ô>à€Iô �aœ q™Ó)ò ˆØ#'¨1¢9•<´.×2GÑ2GÈÓ2MˆÜ�˜D˜6  x jÐ1Ô2Ü�X‹ˆÙÜÐ4Ô6Ü�J‰J�qŒMØä˜4Ó ˆÜ�œ˜U›˜ DÐ)Ô*à %ò 	ÑˆE�3˜Ø”yÒ Ø× Ñ  %¨¨dÐ!3Õ4äÐ9¸$¸¸ÐOÔPÙð	ô �J‰J�sŒOØÙð+ô. 
ˆD”�Y“Ð Ð :Ð
;Ô<ð €NÜ!*¨9Ó!5ò ÑˆÑˆE�3˜Øˆa‰C�2‰:˜Š?Ü�J˜q ™s˜e 1¤S¨£^Ð$4Ð5Ô6ä�S‹zˆÙÜ5AÀ$ÈÓ5LÑ2ˆG�W˜f f¨dÙØ�ÙØ�Ù@DœŸ
™
 4°eÕ<È$ˆIØ×!Ñ! 7¨C°¸À&È)Ð"TÔUä�
‰
�3�ðð" ×Ñ™N°DÐÔ9àUc×dÓdÑ5Q°R¸¸bÀ$ÈÈT�2�s˜B  c¨4Ò0Ðd€JÕdÜ*4°ZÓ*@Ñ'€Iˆz˜<ä	ˆC”	ˆ{˜(Ð
#Ô$Ü	ˆMœ#˜nÓ-Ð.Ð
/Ô0Ü	ˆJ�y�kÐ
"Ô#Ü	Ð! * Ð
.Ô/Ü	Ð ˜~Ð
.Õ/ù÷ es   Ç*I+c                  ó0  — t        dt        › d�«       t        t        «      } | st        d«       yt	        | «      }t        dt        |«      › d�«       t        j                  t        d¬«      }|j                  «       }d	}d	}|D ]Þ  \  }}}|t        k  rŒ|j                  d
|f«       |j                  «       r|dz  }Œ:t        |«      } | s!t        d|j                  d«      d   › �«       Œht        | |«      \  }	}
}}}|	s|}	|s|}|rt        j                   |d¬«      nd}|
r|
dd n|	}|j                  d|	||t        |
||d|f	«       |dz  }t#        j$                  d«       Œà |j'                  «        |j)                  «        t        d|› d|› �«       y)z Incremental crawl - only page 1.r´   u   ] å¢žé‡�çˆ¬å�–u     âš ï¸� èŽ·å�–åˆ—è¡¨å¤±è´¥Nu
     åˆ—è¡¨: r¶   rœ   r�   r   z'SELECT id FROM gov_raw WHERE page_url=?rU   u     âš ï¸� è¯¦æƒ…èŽ·å�–å¤±è´¥: rV   éÿÿÿÿFr·   r¹   rX   rž   rŸ   rº   rÂ   u
   , è·³è¿‡: )r_   r¦   rk   rÅ   r�   rÈ   r    r¡   r¢   r¤   rÃ   r£   r¥   r�   rš   rÊ   rË   r`   ra   r§   r¨   )r}   r~   r©   rª   ÚnewÚskiprr   re   rw   rÑ   r®   rÒ   r�   rÓ   r¯   r°   s                   rF   ÚincrementalrÛ     s”  € ä	ˆAŒiˆ[˜Ð
'Ô(Ü”Ó€DÙÜÐ+Ô,Øä�tÓ€EÜ	ˆJ”s˜5“z�l $Ð
'Ô(ä�?‰?œ7¨BÔ/€DØ�‰‹€AØ
€CØ€Dà!ò Ñˆˆs�DØ”)ÒØà	�	‰	Ð;¸c¸VÔDØ�:‰:Œ<Ø�A‰IˆDØä�S‹zˆÙÜÐ1°#·)±)¸C³.ÀÑ2DÐ1EÐFÔGØä1=¸dÀCÓ1HÑ.ˆ�˜& &¨$Ù %˜Ù �vÙ<@”D—J‘J˜t°%Õ8Àdˆ	Ù#*�'˜$˜3‘-°ˆà	�	‰	ð ]Ø�c˜6¤9¨g°v¸yÈ.ÐZaÐbô	
ð 	ˆq‰ˆÜ�
‰
�3�ð3ð6 	‡K�K„MØ‡J�J„LÜ	ˆJ�s�e˜: d VÐ
,Õ-rG   Ú__main__rU   z--incremental)rY   )#Ú__doc__rŠ   ÚsysrH   r`   rÊ   r    r   r   rI   r   Úurllib.parser   Úgetenvr¢   r¦   r|   rÅ   rÆ   ÚnowÚstrftimerÃ   rÄ   r]   rA   rP   rk   r�   rš   r²   r!   rÛ   Ú__name__rÈ   Úargvr½   rG   rF   ú<module>rå      sò   ðñ÷ (× '× 'ß (Ý Ý  à
ˆ"�)‰)�KÐ!2Ó
3€Ø$€	Ø'€Ø˜,Ñ&€Ø˜OÑ+€ØˆX�\‰\‹^™i¨UÔ3Ñ3×=Ñ=¸jÓI€	Ø€ð DØeØ'Ø,ñ	€ò*€òó6ò*ò83:òj!/òF;0òz-.ð^ ˆzÒÙ
ˆ3�8‰8ƒ}�qÒ˜SŸX™X a™[¨OÒ;Ù�á�ð	 rG   