Ë
    ¸¬uj%  ã                   ó`  — 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	m
Z
 ddlmZmZ ej                  j                  dd«      ZdZdZd	Zd
Zddd
dddœZddiZdZdZd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zedk(  r2dej@                  v Z! ee!¬«      Z" e# ejH                  e"d¬«      «       yy)uœ   
æ²¿æ»©åŒºäººæ°‘æ”¿åºœ - çŽ¯å¢ƒä¿�æŠ¤ çˆ¬è™«
CMS: æ•°èž�CMS portal-saas
åˆ—è¡¨: POST /queryList JSON API (875æ�¡, 50æ�¡/é¡µ)
è¯¦æƒ…: é�™æ€�HTML, curlå�¯ç”¨
é    N)ÚdatetimeÚtimezoneÚ	timedelta)ÚThreadPoolExecutorÚas_completedÚ	SEARCH_DBz/root/search.dbu"   æ²¿æ»©åŒºäººæ°‘æ”¿åºœ-çŽ¯å¢ƒä¿�æŠ¤u   æ²¿æ»©åŒºäººæ°‘æ”¿åºœz!https://www.zgyt.gov.cn/queryListúhttps://www.zgyt.gov.cnz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36zapplication/jsonz5https://www.zgyt.gov.cn/ytqrmzf/hjbh2226/pc/list.htmlÚXMLHttpRequest)ú
User-AgentzContent-TypeÚOriginÚRefererzX-Requested-Withr   é2   é   c                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    ú!/root/gov_crawler/crawl_yantan.pyÚlogr      s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c                  ó€   — t        j                  t        j                  «      t	        d¬«      z
  j                  d«      S )NiG  )Údaysz%Y-%m-%d)r   Únowr   Úutcr   Ústrftime© r   r   Ú
get_cutoffr   !   s*   € Ü�L‰LœŸ™Ó&¬¸Ô)>Ñ>×HÑHÈÓTÐTr   c                 óˆ  — t        j                  t        «      }|j                  «       }dx}}| D ]I  }	 |j	                  dt
        |d   |d   |d   t        |d   f«       |j                  dkD  r|dz  }n|dz  }ŒK |j                  «        |j                  «        ||fS # t        $ r}t        d|› �«       Y d }~ŒŒd }~ww xY w)	Nr   zrINSERT OR IGNORE INTO gov_raw (site_name, title, page_url, publish_date, source_url, content) VALUES (?,?,?,?,?,?)ÚtitleÚpage_urlÚpublish_dateÚcontenté   u   DBå†™å…¥é”™è¯¯: )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuter   ÚSOURCEÚrowcountÚ	Exceptionr   ÚcommitÚclose)ÚarticlesÚconnÚcÚsavedÚskippedÚartÚes          r   Ú
save_to_dbr7   $   sÒ   € Ü�?‰?œ7Ó#€DØ�‰‹€AØÐ€EˆGØò 	(ˆð	(Ø�I‰Ið EÜ˜C ™L¨#¨j©/¸3¸~Ñ;NÔPVÐX[Ð\eÑXfÐgôð �z‰z˜AŠ~˜u¨™z™uØ˜Q‘,�'øð	(ð 	‡K�K„MØ‡J�J„LØ�'ˆ>Ðøô	 ò 	(ÜÐ" 1 #Ð&×'Ñ'ûð	(ús   ´AB Â 	CÂ)B<Â<Cc            	      ó^  ‡— t        «       Št        d‰› �«       g } d}	 dgt        |ddœ}	 t        j                  t
        |t        d¬«      }|j                  «        |j                  «       }|j                  di «      j                  dg «      }|j                  di «      j                  dd«      }t        d|› dt        |«      › d|› d�«       |s�n�g }|D �]  }	|	j                  di «      }
|
j                  dd«      j                  «       }|
j                  dd«      }|r|j                  d«      d   }|r|sŒc|‰k  r't        d|› d‰› �«       |j                  |d
|dœ«       Œ�|
j                  dd«      }d}|rV	 t        |t         «      rt        j"                  |«      n|}|j                  dd«      }|r|j%                  d«      s	t&        |z   }|j                  |||dœ«       �Œ |D �cg c]  }|d   ‰k\  sŒ|d   sŒ|‘Œ }}| j)                  |«       t+        ˆfd „|D «       «      rt        d!«       n)|t        z  |k\  rn|dz  }t-        j.                  d"«       �ŒCt        d#t        | «      › d$�«       | S # t        $ r}t        d|› d	|› �«       Y d
}~Œ9d
}~ww xY w#  Y ŒÕxY wc c}w )%u$   é€šè¿‡APIèŽ·å�–æ‰€æœ‰æ–‡ç« å…ƒä¿¡æ�¯u   æˆªæ­¢æ—¥æœŸ: r%   TÚhjbh2226)ÚchannelCodeÚpageSizeÚcurrentÚnotReturnContenté   )ÚjsonÚheadersÚtimeoutu   APIè¯·æ±‚å¤±è´¥ (page z): NÚdataÚresultsÚtotalr   z	API page ú: z results (total=ú)Úsourcer!   Ú ÚpubDateú u     å½“å‰�é¡µæ£€å‡ºè¶…é™�æ—¥æœŸ z < )r!   ÚurlÚpub_dateÚurlsÚpcÚhttprL   rK   c              3   ó.   •K  — | ]  }|d    ‰k  –— Œ y­w)rL   Nr   )Ú.0ÚaÚcutoffs     €r   ú	<genexpr>z%fetch_article_list.<locals>.<genexpr>ƒ   s   øè ø€ Ò=¨!ˆq�‰}˜vÕ%Ñ=ùs   ƒu#     å‘½ä¸­è¶…é™�æ—¥æœŸï¼Œç»ˆæ­¢ç¿»é¡µg333333Ó?u   APIå…±æ”¶é›† u    æ�¡ (è¿‘3å¹´))r   r   Ú	PAGE_SIZEÚrequestsÚpostÚAPI_URLÚHEADERSÚraise_for_statusr?   r-   ÚgetÚlenÚstripÚsplitÚappendÚ
isinstanceÚstrÚloadsÚ
startswithÚBASE_URLÚextendÚanyÚtimeÚsleep)Úall_articlesÚpage_noÚpayloadÚrrB   r6   rC   rD   Úpage_articlesÚitemrG   r!   rL   rM   Ú
detail_urlÚurl_datarR   ÚvalidrS   s                     @r   Úfetch_article_listrr   6   sÔ  ø€ ä‹\€FÜˆ.˜˜Ð!Ô"à€LØ€Gà
à&˜<Ü!ØØ $ñ	
ˆð	Ü—‘œg¨G¼WÈbÔQˆAØ×ÑÔ Ø—6‘6“8ˆDð
 —(‘(˜6 2Ó&×*Ñ*¨9°bÓ9ˆØ—‘˜ Ó$×(Ñ(¨°!Ó4ˆäˆi˜�y ¤3 w£< .Ð0@ÀÀÀqÐIÔJáÙàˆØó %	ˆDØ—X‘X˜h¨Ó+ˆFØ—J‘J˜w¨Ó+×1Ñ1Ó3ˆEØ—z‘z )¨RÓ0ˆHÙØ#Ÿ>™>¨#Ó.¨qÑ1�á¡Øà˜&Ò ô Ð4°X°J¸cÀ&ÀÐJÔKØ×$Ñ$Ø"ØØ (ñ&ô ð
 ð —:‘:˜f bÓ)ˆDØˆJÙðÜ3=¸dÄCÔ3HœtŸz™z¨$Ô/Èd�HØ!)§¡¨d°BÓ!7�JÙ!¨*×*?Ñ*?ÀÔ*GÜ%-°
Ñ%:˜
ð × Ñ ØØ!Ø$ñ"ö ðC%	ðP *ÖR�q¨Q¨z©]¸fÓ-DÈÈ5Ë’ÐRˆÐRØ×Ñ˜EÔ"ô Ó=¨}Ô=Ô=ÜÐ5Ô7Øð ”YÑ %Ò'Øà�1‰ˆÜ�
‰
�3Œñ] ô` ˆ-œ˜LÓ)Ð*¨.Ð9Ô:ØÐøôK ò 	ÜÐ(¨¨	°°Q°CÐ8Ô9Üûð	ûðVÙüò Ss7   ¬AI< Å=AJ#Ç.J*Ç<J*ÈJ*É<	J ÊJÊJ Ê#J'c           
      óþ  — 	 t        j                  |t        d¬«      }|j                  «        |j                  }t        j                  d|t        j                  «      }|r4t        j                  dd	|j                  d
«      «      j                  «       n| }t        j                  d|t        j                  «      }d	}	|r’|j                  d
«      }
t        j                  dd	|
t        j                  ¬«      }
t        j                  dd	|
t        j                  ¬«      }
dD ]  }|
j                  |«      }|dkD  sŒ|
d| }
Œ  |
j                  «       }	d|v r|j                  d«      d   nd	}g }d}t        j                  ||«      D ]™  }|j                  d
«      }t!        |j                  d«      «      }|j                  d«      }|r||vrŒF|j#                  d«      sd|z   }|dk\  r
|dz  d›d�}n|dk\  r
|dz  d›d�}n|› d�}|j%                  d |› d!|› d"|› d#�«       Œ› |r¡t'        «       }g }|D ]v  }|j                  d$«      d%z   }|j                  d&|«      }|d'kD  r
|dkD  r||| nd	}|r'||vr#|j)                  |«       |j%                  |«       Œc|rŒf|j%                  |«       Œx |	d(d)j+                  |«      z   d*z   z  }	|||t,        |	xs | d+œS # t
        $ r}t        d|dd › d|› �«       Y d}~yd}~ww xY w),u   æŠ“å�–è¯¦æƒ…é¡µå†…å®¹r>   )r@   rA   u     â�Œ è¯·æ±‚å¤±è´¥ Né<   rE   z/<div[^>]*class="article-title"[^>]*>(.*?)</div>z<[^>]+>rH   r%   zC<div[^>]*class="article-content"[^>]*>(.*?)</div>\s*</div>\s*</div>z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>)u   <!-- åˆ†äº«u
   <!--åˆ†äº«z<div class="article-extendz<div class="article-ewmr   z	/content/ú/éþÿÿÿzQ"fileName":"([^"]+?\.(?:pdf|docx?|xlsx?))","totalSize":(\d+),"filePath":"([^"]+)"é   é   rO   r	   i   z.1fz MBi   z.0fz KBz Bz<p><a href="u&   " target="_blank" rel="noopener">ðŸ“Ž z</a> (z)</p>zhref="é   ú"é   uO   
<!-- é™„ä»¶åˆ—è¡¨ -->
<div class="article-attachments">
<h3>é™„ä»¶ä¸‹è½½</h3>
ú
z
</div>)r!   r"   r#   Ú
source_urlr$   )rV   r[   ÚDETAIL_HEADERSrZ   Útextr-   r   ÚreÚsearchÚDOTALLÚsubÚgroupr]   Úfindr^   ÚfinditerÚintrc   r_   ÚsetÚaddÚjoinr+   )r!   ro   rL   rl   Úhtmlr6   ÚtmÚ
page_titleÚcmÚcontent_htmlÚrawÚmarkerÚidxÚ
article_idÚattachmentsÚfile_patternÚfmÚfnÚfsÚfpÚsize_strÚ	seen_urlsÚunique_attachmentsrR   Ú	url_startÚurl_endrK   s                              r   Úfetch_detailr    ‘   s+  € ðÜ�L‰L˜¬^ÀRÔHˆØ	×ÑÔØ�v‰vˆô 
�‰ÐEÀtÌRÏYÉYÓ	W€BÙ@B”—‘˜
 B¨¯©°«Ó4×:Ñ:Ô<È€Jô 
�‰ÐYÐ[_Ôac×ajÑajÓ	k€BØ€LÙ	Ø�h‰h�q‹kˆÜ�f‰fÐ1°2°sÄ"Ç)Á)ÔLˆÜ�f‰fÐ/°°SÄÇ	Á	ÔJˆàlò 	 ˆFØ—(‘(˜6Ó"ˆCØ�Q‹wØ˜$˜3�i‘ð	 ð —y‘y“{ˆð /:¸ZÑ.G�×!Ñ! #Ó& rÒ*ÈR€JØ€KØg€LÜ�k‰k˜,¨Ó-ò oˆØ�X‰X�a‹[ˆÜ�—‘˜!“ÓˆØ�X‰X�a‹[ˆá˜*¨BÑ.ØØ�}‰}˜VÔ$Ø*¨RÑ/ˆBØ�Š=Ø˜W™* SÐ)¨Ð-‰HØ�4ŠZØ˜T™' #˜ cÐ*‰Hà˜˜R�yˆHØ×Ñ˜\¨"¨Ð-SÐTVÐSWÐW]Ð^fÐ]gÐglÐmÕnðoñ" ä“Eˆ	ØÐØò 	-ˆAØŸ™˜xÓ(¨1Ñ,ˆIØ—f‘f˜S )Ó,ˆGØ*3°aª-¸GÀaºK�!�I˜gÑ&ÈRˆCÙ�s )Ñ+Ø—‘˜cÔ"Ø"×)Ñ)¨!Õ,ÚØ"×)Ñ)¨!Õ,ð	-ð 	ÐmÐpt×pyÑpyð  {Mó  qNñ  Nð  Q[ñ  [ñ  	[ˆð ØØ ÜØÒ( 5ñð øôw ò ÜÐ! *¨S¨b /Ð!2°"°Q°CÐ8Ô9Üûðús   ‚8K Ë	K<ËK7Ë7K<Fc                 ó°  — t        d| rdnd› d�«       t        «       }|st        d«       ddddœS | s|d d }t        d	t        |«      › d
�«       t        dt        |«      › dt        › d�«       g }t	        t        ¬«      5 }|D �ci c]$  }|j                  t        |d   |d   |d   «      |“Œ& }}t        t        |«      «      D ]}  \  }}||   }	 |j                  «       }	|	r9|j                  |	«       t        d|dz   › dt        |«      › d|d   d d › d�«       n't        d|dz   › dt        |«      › d|d   d d › d�«       Œ 	 d d d «       t        |«      \  }}t        dt        |«      › d|› d|› �«       t        |«      ||dœS c c}w # t        $ r3}
t        d|dz   › dt        |«      › d|d   d d › d|
› �«       Y d }
~
Œÿd }
~
ww xY w# 1 sw Y   Œ‡xY w)Nu   å¼€å§‹çˆ¬å�– (full=u   æ˜¯u   å�¦rF   u   æ— æ–‡ç« å�¯çˆ¬r   )rD   r3   r4   r>   u   å¢žé‡�æ¨¡å¼�: ä»…çˆ¬ u    æ�¡u   å¼€å§‹çˆ¬å�–è¯¦æƒ… (u    æ�¡, u    çº¿ç¨‹))Úmax_workersr!   rK   rL   u   è¯¦æƒ… [r%   rv   z]: é(   u   ... âœ“u   ... â�Œ å¤±è´¥é   u   ... â�Œ u   å®Œæˆ�: total=z, saved=z
, skipped=)r   rr   r\   ÚMAX_WORKERSr   Úsubmitr    Ú	enumerater   Úresultr_   r-   r7   )Úfullr0   rC   ÚexecutorrR   ÚfuturesÚiÚfuturer5   r¨   r6   r3   r4   s                r   Úrunr®   Ú   s&  € ÜÐ
¡t™e°Ð7°qÐ9Ô:ô "Ó#€HáÜÐÔØ Q°1Ñ5Ð5áØ˜C˜R�=ˆÜÐ#¤C¨£M ?°$Ð7Ô8ô Ð
œs 8›}˜o¨V´K°=ÀÐIÔJà€GÜ	¬Ô	4ð W¸ð ö
àð �O‰OœL¨!¨G©*°a¸±hÀÀ*ÁÓNÐPQÑQð
ˆð 
ô #¤<°Ó#8Ó9ò 
	W‰IˆAˆvØ˜&‘/ˆCðWØŸ™›�ÙØ—N‘N 6Ô*Ü˜( 1 Q¡3 % q¬¨X«¨°s¸3¸w¹<ÈÈÐ;LÐ:MÈWÐUÕVä˜( 1 Q¡3 % q¬¨X«¨°s¸3¸w¹<ÈÈÐ;LÐ:MÈ^Ð\Ô]øñ
	W÷Wô$   Ó(�N€Eˆ7Üˆ.œ˜X›˜ x°¨w°jÀÀ	ÐJÔKÜ˜“]¨U¸wÑGÐGùò'
øô ò WÜ�h˜q ™s˜e 1¤S¨£] O°3°s¸7±|ÀCÀRÐ7HÐ6IÈÐRSÐQTÐU×VÑVûðWú÷Wð WúsI   ÂGÂ)FÂ/!GÃA2FÅGÆGÆ	G	Æ)GÆ?GÇG	Ç	GÇGÚ__main__z--full)r©   )Úensure_ascii)F)%Ú__doc__Úsysr�   rg   Úosr?   rV   r&   r   r   r   Úconcurrent.futuresr   r   Úenvironr[   r(   r   r+   rX   rd   rY   r   rU   r¥   r   r   r7   rr   r    r®   Ú__name__Úargvr©   Úresr   Údumpsr   r   r   ú<module>rº      s×   ðñ÷ 2× 1× 1Ó 1ß 2Ñ 2ß ?à
�*‰*�.‰.˜Ð&7Ó
8€Ø0€	Ø	 €à
-€Ø$€àPØ&Ø'ØFØ(ñ€ð Ð ^Ð_€Ø€	Ø€ò.òUòò$YòvGóR&HðP ˆzÒØ�s—x‘xÐ€DÙ
�4Œ.€CÙ	ˆ*ˆ$�*‰*�S uÔ
-Õ.ð r   