Ë
    †ëwjU  ã                   ó®  — 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d„Zd„ Zd„ Zd„ Zd„ Ze dk(  r e«        yy)u0  crawl_ldnews_hjbh.py - å¨„åº•æ–°é—»ç½‘-çŽ¯å¢ƒä¿�æŠ¤ (æ¹–å�—å¨„åº•)

ç«™ç‚¹: https://m.ldnews.cn/pccategory/100.shtml (ç§»åŠ¨ç«¯æ �ç›®é¡µ)
CMS: cmstop (AJAX JSON API åˆ†é¡µ)
åˆ—è¡¨: âš ï¸� é�žé�™æ€� HTML â€” POST https://m.ldnews.cn/pccategory/100.shtml
      data: {catid:100, page:N, pagesize:20} â†’ json{total:780, data:[{title,url,published,...}]}
      é¦–é¡µé�™æ€�æ¸²æŸ“ P1 (20æ�¡), AJAX ä»Ž page=2 èµ·; total=780 â†’ 39é¡µ
      CUTOFF è¾¹ç•Œ: P6 æœ«æ�¡ 2023-08-09 (3å¹´çª—å�£=å‰�6é¡µâ‰ˆ120æ�¡)
      æ³¨æ„�: url æœ‰ä¸¤ç§�æ ¼å¼� â€” m.ldnews.cn/pcarticle/ID.shtml ä¸Ž news.ldnews.cn/news/YYYYMM/ID.shtml
è¯¦æƒ…: PCç«¯ http 301â†’https; æ ‡é¢˜ h1.ui-article-title / <title> åˆ†å‰²; æ—¥æœŸ <time> æ–‡æœ¬
      æ­£æ–‡å�Œå®¹å™¨: PCç«¯ div.right_body å¹³è¡¡div (å°¾éƒ¨ç™»å½•åŒºæ¸…æ´—) | ç§»åŠ¨ç«¯ div#content-show
é    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://m.ldnews.cn/pccategory/100.shtml)z
User-AgentÚRefererzhttps://m.ldnews.cnz/pccategory/100.shtmléd   c                 ó  — 	 |rt        j                  | |dt        d¬«      }n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©ÚdataÚtimeoutÚheadersÚverify)r   r   r   úutf-8z[WARN] fetch failed: z - ©ÚfileÚ )
ÚrequestsÚpostÚHEADERSÚgetÚencodingÚtextÚ	ExceptionÚprintÚsysÚstderr)ÚurlÚ	post_dataÚrÚes       ú&/root/gov_crawler/crawl_ldnews_hjbh.pyÚfetchr&   !   st   € ð	ÙÜ—‘˜c¨	¸7ÌGÐ\aÔb‰Aä—‘˜S¨'¼7È5ÔQˆAØˆŒ
Ø�v‰vˆøÜò ÜÐ% c U¨#¨a¨SÐ1¼¿
¹
ÕCÜûðús   ‚AA Á	BÁ!BÂBc           	      óæ  — g }|dk(  rÉt        j                  d| t         j                  «      D ]Ÿ  }|j                  d«      t        j                  dd|j                  d«      «      j                  «       }}t        |«      dk  rŒW|j                  d«      r|nt        t        |«      }|j                  dd	«      }|j                  ||d
œ«       Œ¡ |S 	 t        j                  t        t        |ddœdt         d¬«      }d|_        t%        j&                  |j(                  «      }|j+                  dg «      D ]�  }	|	j+                  d«      xs dj                  dd«      j                  «       }|	j+                  d«      xs dj                  dd	«      }|r|rt        |«      dk  rŒn|j                  ||d
œ«       Œƒ 	 |S # t,        $ r,}
t/        d|› d|
› �t0        j2                  ¬«       Y d}
~
|S d}
~
ww xY w)uP   åˆ—è¡¨æ�¡ç›®: AJAX JSON API è§£æž� (é¦–é¡µé�™æ€� HTML ç”¨æ­£åˆ™, åˆ†é¡µç”¨ JSON)é   zK<a href="([^"]+)"[^>]*>\s*(?:<img[^>]*>)?\s*<h3 class="ui-title">(.*?)</h3>ú<[^>]+>r   é   é   Úhttpzhttp://zhttps://)r!   Útitler   ©ÚcatidÚpageÚpagesizer   Fr   r   r   r-   õ   â€‹r!   z[WARN] API page z	 failed: r   N)ÚreÚfinditerÚDOTALLÚgroupÚsubÚstripÚlenÚ
startswithr   ÚBASEÚreplaceÚappendr   r   ÚLIST_URLÚCATIDr   r   ÚjsonÚloadsr   r   r   r   r   r    )ÚhtmlÚpage_noÚitemsÚmÚhrefr-   r!   r#   ÚdÚitr$   s              r%   Úextract_itemsrI   .   sµ  € à€EØ�!‚|ä—‘ÐkÐmqÔsu×s|Ñs|Ó}ò 	7ˆAØŸ'™' !›*¤b§f¡f¨Z¸¸Q¿W¹WÀQ»ZÓ&H×&NÑ&NÓ&P�%ˆDÜ�5‹z˜AŠ~ØØŸ/™/¨&Ô1‘$´w¼tÀTÓ7JˆCØ—+‘+˜i¨Ó4ˆCØ�L‰L ¨uÑ5Õ6ð	7ð ˆðIÜ�M‰Mœ(´5À'ÐWYÑ)ZØ")´7À5ôJˆàˆŒ
Ü�J‰J�q—v‘vÓˆØ—%‘%˜ Ó#ò 	7ˆBØ—V‘V˜G“_Ò*¨×3Ñ3°H¸bÓA×GÑGÓIˆEØ—6‘6˜%“=Ò& B×/Ñ/°	¸:ÓFˆCÙ¡¤s¨5£z°A¢~ØØ�L‰L ¨uÑ5Õ6ñ	7ð €Løô ò IÜÐ   	¨°1°#Ð6¼S¿Z¹Z×HÑHØ€LûðIús   ÃC&F; Æ;	G0Ç!G+Ç+G0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)r3   ÚsearchÚIÚfindÚstartr4   r6   r:   )rB   Úopen_tag_rerE   ÚgtÚiÚdepthÚmms          r%   Úextract_balanced_divrV   L   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€Oó    c                 ón  — t        | «      }|syd}t        j                  d|t        j                  «      }|r4t        j                  dd|j                  d«      «      j                  «       }|s‚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«      }|s)t        j                  d|«      }|r|j                  d«      }|sPt        j                  d|«      }|r8t        j                  d|j                  d«      «      }|r|j                  d«      }d}t        |d«      }|j                  «       r|j                  «       }nFt        j                  d|t        j                  «      }|r|j                  d«      j                  «       }dD ]1  }|j                  |«      }	|	d	kD  sŒ|	t        |«      dz  kD  sŒ,|d |	 } n t        j                  dd|t        j                  t        j                  z  ¬«      }|||fS )N)r   r   r   r   z:<h1[^>]*class="[^"]*ui-article-title[^"]*"[^>]*>(.*?)</h1>r)   r(   z<title>\s*([^<]+?)\s*</title>z\s+u   _å¨„åº•æ–°é—»ç½‘|_|[-â€“â€”]r   r2   u   ^\s*(?:&middot;|&nbsp;|Â·|\s)+z<time[^>]*>(\d{4}-\d{2}-\d{2})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[^"]*"[^>]*>zO<div[^>]*id="[^"]*content-show[^"]*"[^>]*>(.*?)</div>\s*(?:</section>|<section))u   ç”¨æˆ·ç™»å½•u	   ç”¨æˆ·å��u   å¯†ç �u   ä¸‹æ¬¡è‡ªåŠ¨ç™»å½•u   æ²¡æœ‰è´¦å�·u   é©¬ä¸Šæ³¨å†Œu   ä½¿ç”¨ç¬¬ä¸‰æ–¹è´¦å�·ç™»å½•u   QQè´¦æˆ·u   æ–°æµªå¾®å�šu   è…¾è®¯å¾®å�šu	   éªŒè¯�ç �g      à?z<script.*?</script>)Úflags)r&   r3   rM   r5   r7   r6   r8   Úsplitr<   rV   rO   r9   rN   )
r!   rB   r-   rE   Ú	date_textÚmdÚcontentÚcÚkwÚidxs
             r%   Úfetch_detailra   `   s<  € Ü�‹:€DÙØà€EÜ
�	‰	ÐOÐQUÔWY×W`ÑW`Óa€AÙÜ—‘�z 2 q§w¡w¨q£zÓ2×8Ñ8Ó:ˆÙÜ�I‰IÐ6¸¼b¿i¹iÓHˆÙÜ—F‘F˜6 2 q§w¡w¨q£zÓ2×8Ñ8Ó:ˆEÜ—H‘HÐ<¸eÓDÀQÑG×MÑMÓOˆEØ�M‰M˜( BÓ'×-Ñ-Ó/€EÜ�F‰FÐ4°b¸%Ó@€Eà€IÜ
�	‰	Ð3°TÓ:€AÙØ—G‘G˜A“Jˆ	ÙÜ�I‰IÐ:¸DÓAˆÙØŸ™ ›
ˆIÙÜ�I‰IÐMÈtÓTˆÙÜ—‘Ð1°1·7±7¸1³:Ó>ˆBÙØŸH™H Q›K�	à€GÜ˜TÐ#QÓR€AØ‡w�w„yØ—'‘'“)‰ä�I‰IÐhÐjnÔpr×pyÑpyÓzˆÙØ—g‘g˜a“j×&Ñ&Ó(ˆGðgò ˆà�l‰l˜2ÓˆØ�‹7�sœS ›\¨CÑ/Ó/Ø˜d˜s�mˆGÙðô �f‰fÐ+¨R°ÄÇ	Á	ÌBÏDÉDÑ@PÔQ€GØ�)˜WÐ$Ð$rW   c                  óL  — t        j                  «       } | j                  dt        d¬«       | j	                  «       }g }t        «       }t        d|j                  dz   «      D ]Ÿ  }|dkD  r
t        |ddœnd }t        t        |«      }|sŒ't        ||«      }t        |«      }|D ]/  }	|	d   |v rŒ|j                  |	d   «       |j                  |	«       Œ1 t        d|› d	t        |«      |z
  › d
t        |«      › d�«       |rŒŸ n g }
|D �]A  }	t!        |	d   «      \  }}}|s|	d   }|st        d|	d   › �«       Œ1|}|r
|t"        k  rŒ?g }t%        j&                  d|t$        j(                  «      D ]—  }|j+                  d«      t%        j,                  dd|j+                  d«      «      j/                  «       }}t%        j0                  d|t$        j2                  «      sd|j5                  «       v sŒ€|j                  |xs d|dœ«       Œ™ |
j                  ||	d   |	d   |t6        |d|rt9        j:                  |d¬«      ndt<        dœ	«       �ŒD t        dt        |
«      › d�«       |
D �cg c]  }|d   j/                  «       sŒ|‘Œ }}|rt?        |d«       t        |«      S c c}w )Nz--pagesé   )ÚtypeÚdefaultr(   r   r.   r!   z  page z: +z items (total ú)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_namer]   ÚsummaryÚattachmentsÚ
group_namez	  Total: z itemsr]   Úldnews_hjbh) ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsÚsetÚrangeÚpagesr?   r&   r>   rI   r9   Úaddr=   r   ra   ÚCUTOFFr3   r4   r5   r6   r7   r8   rM   rN   ÚlowerÚ	SITE_NAMEr@   ÚdumpsÚ
GROUP_NAMEr   )ÚapÚargsrD   ÚseenrC   r   rB   Ú
page_itemsÚbeforerH   Úrecordsr-   r[   r]   ÚpdÚattsÚamÚhÚtr#   Úvalids                        r%   ÚmainrŠ   “   s�  € Ü	×	 Ñ	 Ó	"€BØ‡O�O�I¤C°€OÔ3Ø�=‰=‹?€Dà€EÜ‹5€DÜ˜˜DŸJ™J¨™NÓ+ò ˆØDKÈaÂKœ¨¸RÒ@ÐUYˆÜ”X˜tÓ$ˆÙØÜ" 4¨Ó1ˆ
Ü�U“ˆØò 	ˆBØ�%‰y˜DÑ ØØ�H‰H�R˜‘YÔØ�L‰L˜Õð		ô
 	�˜�y ¤C¨£J°Ñ$7Ð#8¸ÄsÈ5ÃzÀlÐRSÐTÔUÚÙðð  €GØó ˆÜ$0°°E±Ó$;Ñ!ˆˆy˜'ÙØ�w‘KˆEÙÜÐ,¨R°©Y¨KÐ8Ô9ØØˆÙ�"”v’+ØàˆÜ—+‘+ÐEÀwÔPR×PYÑPYÓZò 	@ˆBØ—8‘8˜A“;¤§¡ z°2°r·x±xÀ³{Ó C× IÑ IÓ KˆqˆAÜ�y‰yÐFÈÌ2Ï4É4ÔPÐT^Ðbc×biÑbiÓbkÒTkØ—‘ a¢m¨8¸AÑ>Õ?ð	@ð 	�‰Ø 2 e¡9¸B¸u¹IØ¬¸wØÑRV¬$¯*©*°TÈÕ*NÐ\`Ü$ñ	
ö 	ð!ô, 
ˆI”c˜'“l�^ 6Ð
*Ô+ØÖ8�1 1 Y¡<×#5Ñ#5Õ#7ŠQÐ8€EÐ8ÙÜ˜ Ô.Üˆu‹:Ðùò 9s   É)J!ÊJ!Ú__main__)N)!Ú__doc__r   Úosr   r3   rp   r@   r   r   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   ÚnowÚstrftimery   r{   r}   r   r;   r>   r?   r&   rI   rV   ra   rŠ   Ú__name__© rW   r%   ú<module>r™      sÌ   ðñ÷ -× ,× ,ß (Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à
ˆ(�,‰,‹.™9¨'Ô2Ñ
2×	<Ñ	<¸ZÓ	H€Ø*€	Ø€
ð DØ9ñ€ð €ØÐ)Ñ)€Ø€ó
òò<ò(0%òf2ðj ˆzÒÙ…Fð rW   