Ë
    è‡zj(%  ã                   ó  — 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	 ddl
mZ dZdZdZdZe› d	�Zd
ZdZdZ ej(                  «       Zde_        ej.                  e_        ddddœZdd„Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u2  æ˜†å±±å¸‚äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘Š (crawl_ksgsgg.py) â€” å�‡çº§ä¿®å¤�ç‰ˆ
CMS: UCAP
åˆ—è¡¨: /kss/gsgg/common_list2.shtml (ç¬¬1é¡µ) + common_list2_{N}.shtml (N>=2)
  åˆ†é¡µ: createPageHTML('page_div',1000, N,'common_list2','shtml',5000) â†’ 1000é¡µ Ã— 5æ�¡ = 5000æ�¡
  æ�¡ç›®: <h4><a href="/kss/gsgg/{YYYYMM}/{uuid}.shtml" title="title">title</a><span class="time">YYYY-MM-DD</span></h4>
è¯¦æƒ…: /kss/gsgg/{YYYYMM}/{uuid}.shtml
  meta ArticleTitle/PubDate + <UCAPCONTENT> (Wordè½¬æ�¢æ®µè�½)
  é™„ä»¶: æ­£æ–‡å†… <a href="{uuid}/files/xxx.pdf"> (ç›¸å¯¹è¯¦æƒ…é¡µURL)
é    N©Úurljoin)ÚBeautifulSoupu   æ˜†å±±å¸‚-å…¬ç¤ºå…¬å‘Šzcrawl_ksgsgg.pyu   æ±Ÿè‹�zhttps://www.ks.gov.cnz/kss/gsgg/common_list2.shtmliè  z/mnt/data/search.dbz%/root/gov_crawler/ksgsgg_output.jsonlFzkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagec                 ó´  — t        |«      D ]p  }	 t        j                  j                  | t        ¬«      }t        j                  j                  ||t        ¬«      }|j                  «       j                  dd¬«      c S  y
# t        $ rN}||dz
  k(  r't        d| › d|› �t        j                  ¬	«       Y d }~ y
t        j                  d«       Y d }~ŒÆd }~ww xY w)N)Úheaders)ÚtimeoutÚcontextzutf-8Úreplace)Úerrorsé   u     [WARN] è¯·æ±‚å¤±è´¥ z: ©ÚfileÚ g      ø?)ÚrangeÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚctxÚreadÚdecodeÚ	ExceptionÚprintÚsysÚstderrÚtimeÚsleep)Úurlr	   ÚretriesÚiÚreqÚrespÚes          ú!/root/gov_crawler/crawl_ksgsgg.pyÚhttp_getr'   $   s¹   € Ü�7‹^ò 	ˆð	Ü—.‘.×(Ñ(¨´gÐ(Ó>ˆCÜ—>‘>×)Ñ)¨#°wÌÐ)ÓLˆDØ—9‘9“;×%Ñ% g°iÐ%Ó@Ò@ð		ð øô ò 	Ø�G˜a‘KÒÜÐ.¨s¨e°2°a°SÐ9ÄÇ
Á
ÕKÝÜ�J‰J�s�O‰Oûð		ús   �A+B Â 	CÂ	)CÂ8CÃCc                 óâ   — | j                  dd«      j                  dd«      j                  dd«      } t        j                  dd| «      } t        j                  dd| «      } | j                  «       S )u:   strip &middot;&nbsp; å®žä½“å‰�ç¼€ å’Œçœ�ç•¥å�·æˆªæ–­å�Žç¼€z&middot;r   z&nbsp;õ   Â·u   ^[\s\xa0Â·\u00b7]+z\s*\.{3,}\s*$)r   ÚreÚsubÚstrip)Útitles    r&   Úclean_titler.   2   s_   € à�M‰M˜* bÓ)×1Ñ1°(¸BÓ?×GÑGÈÐRTÓU€EÜ�F‰FÐ(¨"¨eÓ4€EÜ�F‰FÐ# R¨Ó/€EØ�;‰;‹=Ðó    c                 ó¢  — g }t        j                  d| t         j                  «      D ]¤  }|j                  d«      |j                  d«      |j                  d«      |j                  d«      f\  }}}}t        j                  d|«      sŒat        t        |«      }t        |xs |j                  «       «      }|sŒ‘|j                  |||f«       Œ¦ |S )uN   ä»Žåˆ—è¡¨é¡µæ��å�– (url, title, date) â€” å�ªæŠ“æœ¬ç«™ /kss/gsgg/ è¯¦æƒ…é“¾æŽ¥zp<h4><a\s+href="([^"]+)"\s+title="([^"]*)"[^>]*>(.*?)</a>\s*<span\s+class="time">\s*(\d{4}-\d{2}-\d{2})\s*</span>r   é   é   é   z/kss/gsgg/\d+[^\"<>]*\.shtml$)
r*   ÚfinditerÚDOTALLÚgroupÚsearchr   ÚBASE_URLr.   r,   Úappend)	ÚhtmlÚitemsÚmÚhrefÚtÚdispÚdater    r-   s	            r&   Ú
parse_listrA   :   s¶   € à€EÜ�[‰[Ø{ØŒb�i‰ióò 
-ˆð  Ÿg™g a›j¨!¯'©'°!«*°a·g±g¸a³jÀ!Ç'Á'È!Ã*ÐLÑˆˆa��tä�y‰yÐ9¸4Ô@ØÜ”h Ó%ˆÜ˜QšY $×-Ñ-Ó/Ó0ˆÚØ�L‰L˜#˜u dÐ+Õ,ð
-ð €Lr/   c           
      óÒ
  ‡‡!— t        | d«      }d}t        j                  d| «      }|rt        |j	                  d«      «      }|s.|j                  d«      }|rt        |j                  d¬«      «      }d}t        j                  d| «      }|r|j	                  d«      }|s)t        j                  d	| «      }|r|j	                  d«      }|j                  d
d¬«      }	|	r|	j                  d«      }
|
rE|
}	nBt        j                  d| t        j                  «      }|rt        |j	                  d«      d«      }	|	s||dg fS |	j                  d«      D ]  }|j                  «        Œ |	j                  d«      D ]  }|j                  «        Œ |	j                  t        j                  dt        j                  «      ¬«      D ]  }|j                  «        Œ g }t        «       }|	j                  dd¬«      D ]›  }|d   }|j                  d¬«      }t        j                  d|«      s6d|j                  «       v s$d|j                  «       v s|j                  d«      sŒft        ‰|«      }||v rŒw|j!                  |«       |j#                  |||f«       Œ� |D ]ê  \  }}}|j%                  d|d¬«      }|r|n|j'                  d«      d   |_        |j*                  �–|j*                  j                  dt        j                  d «      ¬!«      D ]c  }|t-        |j*                  j.                  «      dt-        |j*                  j.                  «      j1                  |«       v sŒT|j                  «        Œe |j3                  |«       Œì |D ��ch c]  \  }}}|’Œ
 c}}Š!g }|	j                  d"¬#«      D ]ß  }|j4                  d$k(  r|j#                  t7        |«      «       Œ-|j4                  d%v r~|j                  dd¬«      }|sŒQ|j                  d$«      }t9        ˆ!ˆfd&„|j                  dd¬«      D «       «      }|s|r|j#                  t7        |«      «       Œ§|j#                  |«       Œ¹|j                  dd¬«      }|sŒÏ|j#                  |«       Œá t        «       }g }|D ]X  }t        j:                  d'dt        j:                  d(d|«      «      }|sŒ2||vsŒ7|j!                  |«       |j#                  |«       ŒZ d)j=                  |«      } |D ]  \  }}}|| vsŒ| d*|› d+|› d,�z  } Œ t        j:                  d-d| «      } t        j:                  d.d)| «      j?                  «       } ||| |fS c c}}w )/u/   æ��å�– (title, date, content_html, attachments)zhtml.parserr   z/<meta\s+name="ArticleTitle"\s+content="([^"]+)"r   Úh1T)r,   z5<meta\s+name="PubDate"\s+content="(\d{4}-\d{2}-\d{2})u"   æ—¶é—´[:ï¼š]\s*(\d{4}-\d{2}-\d{2})Údivzarticle-content)Úclass_Úucapcontentz <UCAPCONTENT>(.*?)</UCAPCONTENT>ÚscriptÚstylezdisplay\s*:\s*none)rH   Úa)r=   r=   z6(?i)\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|et|ofd)(\?|$)Údownloadr   u   é™„ä»¶Ú_blank)r=   Útargetú/éÿÿÿÿNÚimgz(?i)\.(gif|png|jpg|jpeg))ÚsrcF)Ú	recursiveÚtable)ÚprD   rC   Úh2Úh3ÚulÚolÚlic              3   óR   •K  — | ]  }t        ‰|d    «      ‰v s|d    ‰v r|–— Œ  y­w)r=   Nr   )Ú.0rI   Úattached_hrefsÚpage_urls     €€r&   ú	<genexpr>z!extract_detail.<locals>.<genexpr>˜   s8   øè ø€ ò  ØÜ˜8 Q v¡YÓ/°>ÑAØ�V‘9 Ñ.ô ñ ùs   ƒ$'ú\s+ú<[^>]+>z

z

<p><a href="z" target="_blank">z</a></p>u   æ‰“å�°æœ¬é¡µ[^\n]*z\n{3,}) r   r*   r7   r.   r6   ÚfindÚget_textr5   Úfind_allÚ	decomposeÚcompileÚIÚsetÚlowerÚ
startswithr   Úaddr9   Únew_tagÚsplitÚstringÚparentÚlistÚcontentsÚindexÚreplace_withÚnameÚstrÚanyr+   Újoinr,   )"r:   r\   Úsoupr-   ÚmtrC   r@   ÚmpÚdmÚcmÚucr<   ÚsÚstÚhÚattachmentsÚseen_attrI   r=   ÚtxtÚabs_urlÚnew_aÚsibÚ_ÚpartsÚelÚinner_tablesÚel_has_attachÚseenÚfinal_partsrS   ÚkeyÚcontentr[   s"    `                               @r&   Úextract_detailrŽ   K   s(  ù€ ä˜˜}Ó-€Dð €EÜ	�‰ÐEÀtÓ	L€BÙ	Ü˜BŸH™H Q›KÓ(ˆÙØ�Y‰Y�t‹_ˆÙÜ §¡°$ Ó 7Ó8ˆEð €DÜ	�‰ÐKÈTÓ	R€BÙ	Ø�x‰x˜‹{ˆÙÜ�Y‰YÐ<¸dÓCˆÙØ—8‘8˜A“;ˆDð 
�‰�5Ð!2ˆÓ	3€BÙ	Ø�W‰W�]Ó#ˆÙØ‰Bä�I‰IÐ9¸4ÄÇÁÓKˆÙÜ˜qŸw™w q›z¨=Ó9ˆBÙØ�d˜B Ð"Ð"ð �[‰[˜Ó"ò ˆØ	�‰�ðà�k‰k˜'Ó"ò ˆØ
�‰�ðà�[‰[œrŸz™zÐ*?ÄÇÁÓFˆ[ÓGò ˆØ	�‰�ðð €KÜ‹u€HØ�[‰[˜ 4ˆ[Ó(ò 2ˆØ�‰yˆØ�j‰j˜tˆjÓ$ˆÜ�9‰9ÐNÐPTÔUÐYcÐgk×gqÑgqÓgsÑYsÐw}ð  BF÷  BLñ  BLó  BNñ  xNð  RU÷  R`ñ  R`ð  aiõ  RjÜ˜h¨Ó-ˆGØ˜(Ñ"ØØ�L‰L˜Ô!Ø×Ñ  3¨Ð0Õ1ð2ð 'ò ‰ˆˆ3�Ø—‘˜S w°x�Ó@ˆÙ!‘s w§}¡}°SÓ'9¸"Ñ'=ˆŒØ�8‰8ÐØ—x‘x×(Ñ(¨´B·J±JÐ?ZÓ4[Ð(Ó\ò $�Øœ$˜qŸx™x×0Ñ0Ó1Ð2S´4¸¿¹×8IÑ8IÓ3J×3PÑ3PÐQRÓ3SÐTÒTØ—M‘M•Oð$ð 	
�‰�uÕðð 4?×?¡- ! Q¨’gÓ?€Nð €EØ�k‰k EˆkÓ*ò "ˆØ�7‰7�gÒØ�L‰Lœ˜R›Õ!Ø�W‰WÐHÑHØ—+‘+˜b¨�+Ó-ˆCÙØØŸ;™; wÓ/ˆLÜô  ØŸ;™; s°˜;Ó6ô ó ˆMñ
 ™}Ø—‘œS ›WÔ%ØØ�L‰L˜Õà—+‘+˜b¨�+Ó-ˆCÚØ—‘˜SÕ!ð)"ô. ‹5€DØ€KØò "ˆÜ�f‰f�V˜R¤§¡¨
°B¸Ó!:Ó;ˆÚ�3˜d’?Ø�H‰H�SŒMØ×Ñ˜qÕ!ð	"ð �k‰k˜+Ó&€GØ&ò S‰ˆˆ3�Ø˜'Ò!ØÐ)¨'¨Ð2DÀSÀEÈÐRÑR‰GðSô
 �f‰fÐ*¨B°Ó8€GÜ�f‰f�Y ¨Ó0×6Ñ6Ó8€GØ�$˜ Ð,Ð,ùóY @s   ÎU#c                  ó  — d} t         j                  dd  }d}|t        |«      k  ru||   }|j                  d«      rt	        |j                  dd«      d   «      } n,|dk(  r'|dz   t        |«      k  rt	        ||dz      «      } |dz  }|dz  }|t        |«      k  rŒut        j                  t        d¬«      }|j                  «       }d}d}d}t        d| dz   «      D �]Þ  }	|	dk(  rt        }
nt        › d|	› d	�}
t        |
«      }|s t        d
|	› d�t         j                  ¬«       ŒIt!        |«      }t        d|	› dt        |«      › d�«       |D �]j  \  }}}|j#                  d|f«       |j%                  «       r|dz  }Œ1t        |«      }|s|dz  }ŒDt'        ||«      \  }}}}|r1t        t)        j*                  dd|«      j-                  «       «      dk  r|dz  }ŒŽ|s|}|s|}t)        j*                  dd|«      d d }t)        j*                  dd|«      j-                  «       }d|v rdnd}	 |j#                  d||||||t.        t0        t2        |df«      }|j4                  }|j#                  d||t.        |f«       |j7                  «        |dz  }t        d|› d|d d › �«       t;        j<                  d«       �Œm �Œá |j?                  «        t        d|› d|› d |› d!||z   |z   › �«       y # t        j8                  $ r |dz  }Y Œcw xY w)"Nr   r   z--pages=ú=z--pagesé   )r	   z/kss/gsgg/common_list2_z.shtmlu     [WARN] ç¬¬u   é¡µèŽ·å�–å¤±è´¥, è·³è¿‡r   u     ç¬¬u   é¡µ: æ‰¾åˆ° u    æ�¡z'SELECT id FROM gov_raw WHERE page_url=?r_   r   é
   éÈ   r^   ú z<tablezªINSERT INTO gov_raw (title, summary, content, page_url, source_url, publish_date, site_name, script_name, group_name, has_table, date_rank) VALUES (?,?,?,?,?,?,?,?,?,?,?)zTINSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) VALUES (?,?,?,?)z    [z] é-   gš™™™™™Ù?u	   
æ–°å¢ž: u
     é‡�å¤�: u     è¿‡çŸ­/404: u
     æ€»è®¡: ) r   ÚargvÚlenrh   Úintrk   Úsqlite3ÚconnectÚDB_PATHÚcursorr   ÚLIST_URLr8   r'   r   r   rA   ÚexecuteÚfetchonerŽ   r*   r+   r,   Ú	SITE_NAMEÚSCRIPT_NAMEÚ
GROUP_NAMEÚ	lastrowidÚcommitÚIntegrityErrorr   r   Úclose)Ú	max_pagesÚargsr"   rI   ÚconnÚcÚ	total_newÚ	total_dupÚ
total_skipÚpageÚlist_urlr:   r;   r    r-   r@   ÚdhtmlÚd_titleÚd_dater�   r   ÚsummaryÚ	has_tableÚcurÚrids                            r&   Úmainr·   »   s-  € Ø€IÜ�8‰8�A�Bˆ<€DØ	€AØ
Œc�$‹iŠ-Ø�‰GˆØ�<‰<˜
Ô#Ü˜AŸG™G C¨›O¨AÑ.Ó/‰IØ�)Š^  A¡¬¨D«	Ò 1Ü˜D  Q¡™KÓ(ˆIØ�‰FˆAØ	ˆQ‰ˆð Œc�$‹i‹-ô �?‰?œ7¨BÔ/€DØ�‰‹€AØ€IØ€IØ€Jä�a˜ Q™Ó'ó +ˆØ�1Š9Ü‰Hä"˜Ð#:¸4¸&ÀÐGˆHÜ˜Ó!ˆÙÜ�L  Ð&=Ð>ÄSÇZÁZÕPØÜ˜4Ó ˆÜ��d�V˜<¬¨E«
 |°4Ð8Ô9Ø %ó  	ÑˆC�˜Ø�I‰IÐ?À#ÀÔHØ�z‰zŒ|Ø˜Q‘�	ØÜ˜S“MˆEÙØ˜a‘�
ØÜ4BÀ5È#Ó4NÑ1ˆG�V˜W kÙœc¤"§&¡&¨°R¸Ó"A×"GÑ"GÓ"IÓJÈRÒOØ˜a‘�
ØÙØ�ÙØ�Ü—f‘f˜Z¨¨WÓ5°d°sÐ;ˆGÜ—f‘f˜V S¨'Ó2×8Ñ8Ó:ˆGØ%¨Ñ0™°aˆIðØ—i‘ið AØ˜g w°°S¸&Ä)Ì[ÔZdÐfoÐqrÐsóu�ð —m‘m�Ø—	‘	ÐpØ ¬°GÐ<ô>à—‘”Ø˜Q‘�	Ü˜˜f˜X R¨°°¨ ~Ð6Ô7ô �J‰J�sŽOòA 	ð+ðZ 	‡J�J„LÜ	ˆJ�y�k ¨I¨;°nÀZÀLÐPZÐ[dÐenÑ[nÐoyÑ[yÐZzÐ
{Õ|øô ×)Ñ)ò Ø˜Q‘’	ðús   È*A8K+Ë+LÌLÚ__main__)é   r2   ) Ú__doc__r   r*   r   r™   ÚsslÚurllib.requestr   Úurllib.parser   Úbs4r   r    r¡   r¢   r8   r�   ÚTOTAL_PAGESr›   ÚOUTPUT_FILEÚcreate_default_contextr   Úcheck_hostnameÚ	CERT_NONEÚverify_moder   r'   r.   rA   rŽ   r·   Ú__name__© r/   r&   ú<module>rÇ      s³   ðñ÷ 3× 2× 2Ý  Ý à$€	Ø€Ø€
Ø"€ØˆZÐ3Ð4€Ø€Ø
€Ø5€à €c× Ñ Ó"€Ø€Ô Ø—-‘-€„ð @ØOØ0ñ€óòòò"m-ò`A}ðH ˆzÒÙ…Fð r/   