Ë
    íçwj)  ã                   óH  — 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
 ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ  ej$                  «        ed¬«      z
  j'                  d«      Zd	Zd
ZdddœZdZedz   Zd„ Zd„ Zd„ Zd„ Zdd„Zedk(  rW ej@                  «       Z!e!jE                  de#d¬«       e!jI                  «       Z% ee%jL                  «      Z' e(de› de'› d�«       yy)u¸  crawl_ldnews_ggb.py - å¨„åº•æ–°é—»ç½‘-å…¬å‘Šå�§ (æ¹–å�—å¨„åº•)

ç«™ç‚¹: https://news.ldnews.cn/loudi/thedosee/
CMS: cmstop (JS ç€‘å¸ƒæµ�åˆ†é¡µ)
åˆ—è¡¨: <li><div class="news-item">...<a href="http://news.ldnews.cn/thedosee/YYYYMM/ID.shtml" title="æ ‡é¢˜">æ ‡é¢˜</a>...
åˆ†é¡µ: âš ï¸� ç€‘å¸ƒæµ� JS: var page=1; pagetotal=50; url+page+'.shtml' â†’ 2.shtml~50.shtml æ¯�é¡µ20æ�¡
      æ¯�é¡µæ•°æ�®åœ¨ <span id="start-data-N"></span>...<span id="stop-data-N"> ä¹‹é—´
è¯¦æƒ…: âš ï¸� http 301 â†’ https (é¡» https æˆ–è·Ÿéš�è·³è½¬)
      æ ‡é¢˜: <title> åˆ†å‰² '_å¨„åº•æ–°é—»ç½‘'; æ—¥æœŸ: meta æˆ–æ–‡æœ¬ 2026-08-04 11:42
      æ­£æ–‡: div.right_body å¹³è¡¡ div (çº¯æ­£æ–‡, å°¾éƒ¨æ··å…¥ç™»å½•åŒºéœ€æ¸…æ´—)
é    N)ÚdatetimeÚ	timedelta)Úurljoin)Úpush_to_searchdbiG  )Údaysz%Y-%m-%du   å¨„åº•æ–°é—»ç½‘-å…¬å‘Šå�§u   æ¹–å�—zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zhttps://news.ldnews.cn/)z
User-AgentÚRefererzhttps://news.ldnews.cnú/loudi/thedosee/c                 óÒ   — 	 t        j                  | dt        d¬«      }d|_        |j                  S # t
        $ r+}t        d| › d|› �t        j                  ¬«       Y d }~yd }~ww xY w)	N)é   é   F)ÚtimeoutÚheadersÚverifyzutf-8z[WARN] fetch failed: z - )ÚfileÚ )	ÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	ExceptionÚprintÚsysÚstderr)ÚurlÚrÚes      ú%/root/gov_crawler/crawl_ldnews_ggb.pyÚfetchr      sZ   € ðÜ�L‰L˜ g´wÀuÔMˆØˆŒ
Ø�v‰vˆøÜò ÜÐ% c U¨#¨a¨SÐ1¼¿
¹
ÕCÜûðús   ‚/2 ²	A&»!A!Á!A&c                 óÊ  — g }| }|dkD  r@| j                  d|› d�«      }| j                  d|› d�«      }|dk  s
|dk  s||k  rg S | || }t        j                  d|t        j                  «      D ]ñ  }|j	                  d«      |j	                  d«      xs d|j	                  d	«      }	}}|xs t        j
                  d
d|	«      j                  «       }
|
j                  dd«      j                  «       }
t        j
                  dd|
«      }
t        |
«      dk  rŒ©|j                  d«      r|nt        t        |«      }|j                  dd«      }|j                  ||
dœ«       Œó |S )u<   åˆ—è¡¨æ�¡ç›®: thedosee/YYYYMM/ID.shtml + title å±žæ€§/æ–‡æœ¬é   z<span id="start-data-ú"z<span id="stop-data-r   zj<a[^>]+href=["\']?([^"\'>\s]*thedosee/\d{6}/\d+\.shtml)[^>]*?(?:title=["\']([^"\']*)["\'])?[^>]*>(.*?)</a>é   r   é   ú<[^>]+>õ   â€‹õ   ^\s*(?:&middot;|&nbsp;|Â·|\s)+é   Úhttpzhttp://zhttps://)r   Útitle)ÚfindÚreÚfinditerÚDOTALLÚgroupÚsubÚstripÚreplaceÚlenÚ
startswithr   ÚBASEÚappend)ÚhtmlÚpage_noÚitemsÚsegÚsr   ÚmÚhrefÚ
title_attrÚ
title_htmlr*   r   s               r   Úextract_itemsr@   )   sf  € à€Eà
€CØ�‚{Ø�I‰IÐ-¨g¨Y°aÐ8Ó9ˆØ�I‰IÐ,¨W¨I°QÐ7Ó8ˆØˆqŠ5�A˜’E˜Q !šVØˆIØ�1�QˆiˆÜ�[‰[ð  Gð  ILô  NP÷  NWñ  NWó  Xò 	3ˆØ'(§w¡w¨q£z°1·7±7¸1³:Ò3CÀÀQÇWÁWÈQÃZ˜*ˆjˆØÒAœrŸv™v j°"°jÓA×HÑHÓJˆØ—‘˜h¨Ó+×1Ñ1Ó3ˆÜ—‘Ð8¸"¸eÓDˆÜˆu‹:˜Š>ØØ—o‘o fÔ-‰d´7¼4ÀÓ3FˆØ�k‰k˜) ZÓ0ˆØ�‰˜S¨5Ñ1Õ2ð	3ð €Ló    c                 óà  — t        j                  || t         j                  «      }|sy| j                  d|j	                  «       «      }|dk(  ry|dz   }d}t        j
                  d| |d t         j                  «      D ]j  }|j                  d«      j                  d«      s |j                  d«      j                  d	«      r|dz  }ŒI|dz  }|dk(  sŒT| |||j	                  «       z    c S  | |d S )
u&   å¹³è¡¡ div åŒ¹é…� (å¤§å°�å†™ä¸�æ•�æ„Ÿ)r   ú>éÿÿÿÿr!   z<div[\s>]|</div>Nr   z<divz<DIV)r,   ÚsearchÚIr+   Ústartr-   r/   r4   )r7   Úopen_tag_rer<   ÚgtÚiÚdepthÚmms          r   Úextract_balanced_divrM   A   sÛ   € ä
�	‰	�+˜t¤R§T¡TÓ*€AÙØØ	�‰�3˜Ÿ™›	Ó	"€BØ	ˆR‚xØØ
ˆQ‰€AØ€EÜ�k‰kÐ-¨t°A°B¨x¼¿¹Ó>ò .ˆØ�8‰8�A‹;×!Ñ! &Ô)¨R¯X©X°a«[×-CÑ-CÀFÔ-KØ�Q‰J‰Eà�Q‰JˆEØ˜‹zØ˜A˜a "§(¡(£*™nÐ-Ò-ð.ð ��ˆ8€OrA   c                 ó"  ‡ — t        ‰ «      }|syd}t        j                  d|t        j                  «      }|r[t        j                  dd|j                  d«      «      j                  «       }t        j                  d|«      d   j                  «       }|j                  dd«      j                  «       }t        j                  d	d|«      }d}t        j                  d
|«      }|r|j                  d«      }|sPt        j                  d|«      }|r8t        j                  d|j                  d«      «      }|r|j                  d«      }d}t        |d«      }|j                  «       r|j                  «       }dD ]1  }|j                  |«      }	|	dkD  sŒ|	t        |«      dz  kD  sŒ,|d |	 } n t        j                  dd|t        j                  t        j                  z  ¬«      }t        j                  dd|t        j                  t        j                  z  ¬«      }t        j                  dˆ fd„|«      }t        j                  dˆ fd„|«      }t        j                  dd|«      }t        j                  dd|«      }|||j                  «       fS )N)r   r   r   r   z<title>\s*([^<]+?)\s*</title>z\s+r!   u   _å¨„åº•æ–°é—»ç½‘|_|[-â€“â€”]r   r&   r'   z!(\d{4}-\d{2}-\d{2})\s+\d{2}:\d{2}z4<meta[^>]*name="[Pp]ub[Dd]ate"[^>]*content="([^"]*)"z(\d{4}-\d{2}-\d{2})z+<div[^>]*class="[^"]*right_body[^"]*"[^>]*>)u   ç”¨æˆ·ç™»å½•u	   ç”¨æˆ·å��u   å¯†ç �u   ä¸‹æ¬¡è‡ªåŠ¨ç™»å½•u   æ²¡æœ‰è´¦å�·u   é©¬ä¸Šæ³¨å†Œu   ä½¿ç”¨ç¬¬ä¸‰æ–¹è´¦å�·ç™»å½•u   QQè´¦æˆ·u   æ–°æµªå¾®å�šu   è…¾è®¯å¾®å�šu	   éªŒè¯�ç �g      à?z<script.*?</script>)Úflagsz<style.*?</style>z,href="(?!https?://|//|#|javascript:)([^"]+)"c                 óB   •— dt        ‰| j                  d«      «      › d�S )Nzhref="r!   r"   ©r   r/   ©rL   r   s    €r   ú<lambda>zfetch_detail.<locals>.<lambda>|   s    ø€  &¬°°b·h±h¸q³kÓ)BÐ(CÀ1Ð E€ rA   zsrc="(?!https?://|//)([^"]+)"c                 óB   •— dt        ‰| j                  d«      «      › d�S )Nzsrc="r!   r"   rQ   rR   s    €r   rS   zfetch_detail.<locals>.<lambda>~   s    ø€  %¬°°R·X±X¸a³[Ó(AÐ'BÀ!Ð D€ rA   z%^(<p[^>]*>(\s*(<br\s*/?>)?\s*)?</p>)+z%(<p[^>]*>(\s*(<br\s*/?>)?\s*)?</p>)+$)r   r,   rE   r.   r0   r/   r1   Úsplitr2   rM   r+   r3   rF   )
r   r7   r*   r<   Ú	date_textÚmdÚcontentÚcÚkwÚidxs
   `         r   Úfetch_detailr\   U   s  ø€ Ü�‹:€DÙØà€EÜ
�	‰	Ð2°D¼"¿)¹)ÓD€AÙÜ—‘�v˜r 1§7¡7¨1£:Ó.×4Ñ4Ó6ˆÜ—‘Ð8¸%Ó@ÀÑC×IÑIÓKˆØ�M‰M˜( BÓ'×-Ñ-Ó/€EÜ�F‰FÐ4°b¸%Ó@€Eà€IÜ
�	‰	Ð6¸Ó=€AÙØ—G‘G˜A“Jˆ	ÙÜ�I‰IÐMÈtÓTˆÙÜ—‘Ð1°1·7±7¸1³:Ó>ˆBÙØŸH™H Q›K�	à€GÜ˜TÐ#QÓR€AØ‡w�w„yØ—'‘'“)ˆðgò ˆà�l‰l˜2ÓˆØ�‹7�sœS ›\¨CÑ/Ó/Ø˜d˜s�mˆGÙðô �f‰fÐ+¨R°ÄÇ	Á	ÌBÏDÉDÑ@PÔQ€GÜ�f‰fÐ)¨2¨w¼b¿i¹iÌ"Ï$É$Ñ>NÔO€Gä�f‰fÐDÛEÀwóP€Gä�f‰fÐ5ÛDÀgóO€Gô �f‰fÐ=¸rÀ7ÓK€GÜ�f‰fÐ=¸rÀ7ÓK€GØ�)˜WŸ]™]›_Ð,Ð,rA   r   c                 ó¸  — g }t        «       }t        | «      D �]ç  }|dk(  rt        nt        d|dz   › d�z   }t	        |«      }|st        d|dz   › d�«        �nªt        ||dz   «      }|st        d|dz   › d�«        �n„t        d|dz   › dt        |«      › d	�«       |D �]]  }|d
   |v rŒ|j                  |d
   «       t        |d
   «      \  }}	}
|s|d   }|
st        d|d
   › �«       ŒM|	}|r
|t        k  rŒ[g }t        j                  d|
t        j                  «      D ]—  }|j                  d«      t        j                  dd|j                  d«      «      j!                  «       }}t        j"                  d|t        j$                  «      sd|j'                  «       v sŒ€|j)                  |xs d|dœ«       Œ™ |j)                  ||d
   |d
   |t*        |
d|rt-        j.                  |d¬«      ndt0        dœ	«       �Œ` �Œê t        dt        |«      › d	�«       |D �cg c]  }|d   j!                  «       sŒ|‘Œ }}|rt3        |d«       t        |«      S c c}w )Nr   r	   r!   z.shtmlz  Page z: fetch fail (stop)z: 0 items (stop)ú: ú itemsr   r*   z    SKIP empty content: z$<a[^>]*href="([^"]+)"[^>]*>(.*?)</a>r%   r   r#   z*\.(pdf|doc|docx|xls|xlsx|zip|rar|caj|wps)$Údownloadu   é™„ä»¶)r*   r   F)Úensure_asciiz[])	r*   r   Ú
source_urlÚpub_dateÚ	site_namerX   ÚsummaryÚattachmentsÚ
group_namez	  Total: rX   Ú
ldnews_ggb)ÚsetÚrangeÚLIST_URLr5   r   r   r@   r3   Úaddr\   ÚCUTOFFr,   r-   r.   r/   r0   r1   rE   rF   Úlowerr6   Ú	SITE_NAMEÚjsonÚdumpsÚ
GROUP_NAMEr   )Ú	max_pagesÚrecordsÚseenÚpgr   r7   r9   Úitr*   rV   rX   ÚpdÚattsÚamÚhÚtr   Úvalids                     r   Úrunr~   …   sZ  € Ø€GÜ‹5€DÜ�IÓó #ˆØ š'�h¤tÐ0@ÀÀaÁÀÈÐ.OÑ'OˆÜ�S‹zˆÙÜ�G˜B ™F˜8Ð#6Ð7Ô8ÚÜ˜d B¨¡FÓ+ˆÙÜ�G˜B ™F˜8Ð#3Ð4Ô5ÚÜ�˜˜Q™�x˜r¤# e£* ¨VÐ4Ô5Øó 	ˆBØ�%‰y˜DÑ ØØ�H‰H�R˜‘YÔÜ(4°R¸±YÓ(?Ñ%ˆE�9˜gÙØ˜7™�ÙÜÐ0°°E±°Ð<Ô=ØØˆBÙ�bœ6’kØàˆDÜ—k‘kÐ"IÈ7ÔTV×T]ÑT]Ó^ò D�Ø—x‘x “{¤B§F¡F¨:°r¸2¿8¹8ÀA»;Ó$G×$MÑ$MÓ$O�1�Ü—9‘9ÐJÈAÌrÏtÉtÔTÐXbÐfg×fmÑfmÓfoÒXoØ—K‘K¨!ª-¨xÀÑ BÕCðDð �N‰NØ r¨%¡yÀÀ5Á	Ø¬YÀ7ØÑVZ¬d¯j©j¸ÈEÕ.RÐ`dÜ(ñ	ö ò'	ð#ôH 
ˆI”c˜'“l�^ 6Ð
*Ô+ØÖ8�1 1 Y¡<×#5Ñ#5Õ#7ŠQÐ8€EÐ8ÙÜ˜ Ô-Üˆu‹:Ðùò 9s   ÈIÈ8IÚ__main__z--pages)ÚtypeÚdefaultz	[RESULT] r^   r_   )r   ))Ú__doc__r   Úosr   r,   Úargparserp   r   r   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   ÚnowÚstrftimerm   ro   rr   r   r5   rk   r   r@   rM   r\   r~   Ú__name__ÚArgumentParserÚapÚadd_argumentÚintÚ
parse_argsÚargsÚpagesÚnr   © rA   r   ú<module>r˜      s  ðñ
÷ -× ,× ,ß (Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à
ˆ(�,‰,‹.™9¨'Ô2Ñ
2×	<Ñ	<¸ZÓ	H€Ø'€	Ø€
ð DØ(ñ€ð  €ØÐ$Ñ$€òòò0ò(--ó`+ð\ ˆzÒØ	 ˆ×	 Ñ	 Ó	"€BØ‡O�O�I C°€OÔ3Ø�=‰=‹?€DÙˆD�J‰J‹€AÙ	ˆI�i�[  1 # VÐ
,Õ-ð rA   