Ë
    ¸¬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	Z	ddl
mZ ddlmZ dZ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)u  å¼€å¹³å¸‚åŸŽå¸‚ç®¡ç�†å’Œç»¼å�ˆæ‰§æ³•å±€ - å…¬ä¼—å�‚ä¸Ž (3365) çˆ¬è™«
CMS: å¹¿ä¸œæ ‡å‡† GKMLPT (Vue SPA + JSON API)
åˆ—è¡¨: GET https://www.kaiping.gov.cn/jmkpscgj/gkmlpt/api/all/3365
     âš ï¸� API å¿½ç•¥åˆ†é¡µå�‚æ•°æ�’è¿”å›žå…¨éƒ¨ 87 æ�¡ (total=87, 2020-06 ~ 2026-07)
è¯¦æƒ…: /jmkpscgj/gkmlpt/content/{class}/{id//1000}/post_{id}.html
     meta ArticleTitle (æ—  PubDate meta, æ—¥æœŸç”¨ API date å­—æ®µ) + div.article-content æ­£æ–‡
     âš ï¸� é¡µé�¢æœ‰ä¸¤ä¸ª article-content div, ç¬¬äºŒä¸ª policy-article-content ä¸ºç©º, å�–ç¬¬ä¸€ä¸ª
é    N©Úurljoin)ÚBeautifulSoupu4   å¼€å¹³å¸‚åŸŽå¸‚ç®¡ç�†å’Œç»¼å�ˆæ‰§æ³•å±€-å…¬ä¼—å�‚ä¸Žzcrawl_kpscgj_gkml.pyu   å¹¿ä¸œz7https://www.kaiping.gov.cn/jmkpscgj/gkmlpt/api/all/3365z/mnt/data/search.dbFzkMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36z$application/json,text/html,*/*;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Ú g333333ó?)Ú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_kpscgj_gkml.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«      j                  dd«      } t        j                  dd| «      } t        j                  dd| «      } | j                  «       S )u:   strip &middot;&nbsp; å®žä½“å‰�ç¼€ å’Œçœ�ç•¥å�·æˆªæ–­å�Žç¼€z&middot;r   z&nbsp;u   â€‹u   ï»¿u   ^[\s\xa0Â·\u00b7]+z\s*\.{3,}\s*$)r   ÚreÚsubÚstrip)Útitles    r&   Úclean_titler-   .   sn   € à�M‰M˜* bÓ)×1Ñ1°(¸BÓ?€EØ�M‰M˜( BÓ'×/Ñ/°¸"Ó=€EÜ�F‰FÐ(¨"¨eÓ4€EÜ�F‰FÐ# R¨Ó/€EØ�;‰;‹=Ðó    c                 ó  — | dk7  rg S t        t        «      }|sg S 	 t        j                  |«      }g }|j                  dg «      D ]£  }|j                  dd«      }t        |j                  dd«      «      }|r|sŒ5d}|j                  d«      xs |j                  d«      xs d}|r/	 t        j                  j                  |«      j                  d	«      }|j                  |||f«       Œ¥ |S # t        $ r g cY S w xY w# t        $ r d}Y Œ6w xY w)
uF   ç¬¬pageé¡µåˆ—è¡¨æ�¡ç›®ã€‚API å�•æ¬¡è¿”å›žå…¨éƒ¨, ä»… page==1 æœ‰æ•ˆã€‚r   Úarticlesr    r   r,   ÚdateÚfirst_publish_timer   z%Y-%m-%d)r'   ÚAPI_URLÚjsonÚloadsr   Úgetr-   ÚdatetimeÚfromtimestampÚstrftimeÚappend)	ÚpageÚtextÚdÚitemsÚar    r,   r1   Útss	            r&   Ú
fetch_pagerA   7   s  € àˆq‚yØˆ	Ü”GÓ€DÙØˆ	ðÜ�J‰J�tÓˆð €EØ�U‰U�:˜rÓ"ò )ˆØ�e‰e�E˜2ÓˆÜ˜AŸE™E '¨2Ó.Ó/ˆÙ™%ØØˆØ�U‰U�6‹]Ò>˜aŸe™eÐ$8Ó9Ò>¸QˆÙðÜ×(Ñ(×6Ñ6°rÓ:×CÑCÀJÓO�ð 	�‰�c˜5 $Ð'Õ(ð)ð €Løô! ò ØŠ	ðûô ò Ø’ðús#   œC- Â'.C>Ã-C;Ã:C;Ã>DÄDc           
      ó´  ‡‡— d}t        j                  d| «      }|rt        |j                  d«      «      }|s|}t	        | d«      }|j                  dd¬«      }|s|ddfS g }|j                  dd	¬
«      D ]Æ  }|d   }	|j                  d	¬«      }
t        j                  d|	«      s6d|	j                  «       v s$d|	j                  «       v s|
j                  d«      sŒft        ‰|	«      }|j                  d«      s|j                  d«      rd|z   n|}|
r|
n|j                  d«      d   }|j                  |||f«       ŒÈ |D ]±  \  }}}|j                  d|d¬«      }||_        |j                  �s|j                  }d}t!        |j"                  «      D ]  \  }}||u sŒ|} n |�>t%        |j"                  d| «      D ]#  }t'        |dd«      dk(  sŒ|j)                  «        Œ% |j+                  |«       Œ³ |D ��ch c]  \  }}}|’Œ
 c}}Šg }|j                  d¬«      D ]ð  }|j,                  dk(  r|j                  t/        |«      «       Œ-|j,                  dv r�|j                  dd	¬«      }
|
s|j                  d«      sŒb|j                  d«      }t1        ˆˆfd„|j                  dd	¬
«      D «       «      }|s|r|j                  t/        |«      «       Œ¸|j                  |
«       ŒÊ|j                  dd	¬«      }
|
sŒà|j                  |
«       Œò |rRt        j2                  d dt        j2                  d!d|d"   «      «      }t        j2                  d d|«      }|r
||k(  r|dd }t5        «       }g }|D ]X  }t        j2                  d dt        j2                  d!d|«      «      }|sŒ2||vsŒ7|j7                  |«       |j                  |«       ŒZ d#j9                  |«      }|j;                  d$d%«      }|D ]  \  }}}||vsŒ||vsŒ|d&|› d'|› d(�z  }Œ t        j2                  d)d|«      }t        j2                  d*d#|«      j=                  «       }|d|fS c c}}w )+u"   æ��å�– (title, date, content_html)r   z/<meta\s+name="ArticleTitle"\s+content="([^"]+)"r   zhtml.parserÚdivzarticle-content)Úclass_r?   T)ÚhrefrE   )r+   z6(?i)\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|et|ofd)(\?|$)ÚdownloadÚattachu   é™„ä»¶)zhttp://zhttps://z//zhttp:ú/éÿÿÿÿÚ_blank)rE   ÚtargetNÚnameÚimgF)Ú	recursiveÚtable)	ÚprC   Úh1Úh2Úh3ÚulÚolÚliÚ
blockquotec              3   óR   •K  — | ]  }t        ‰|d    «      ‰v xs |d    ‰v –— Œ  y­w)rE   Nr   )Ú.0ÚxÚattached_hrefsÚpage_urls     €€r&   ú	<genexpr>z!extract_detail.<locals>.<genexpr>‰   s:   øè ø€ ò  6àô ˜ ! F¡)Ó,°Ð>Ò]À!ÀFÁ)È~ÐB]Ó]ñ 6ùs   ƒ$'ú\s+ú<[^>]+>r   z

z&amp;ú&z

<p><a href="z" target="_blank">z</a></p>u   æ‰“å�°æœ¬é¡µ[^\n]*z\n{3,})r)   Úsearchr-   Úgroupr   ÚfindÚfind_allÚget_textÚlowerÚ
startswithr   Úsplitr:   Únew_tagÚstringÚparentÚ	enumerateÚcontentsÚlistÚgetattrÚ	decomposeÚreplace_withrL   ÚstrÚanyr*   ÚsetÚaddÚjoinr   r+   )Úhtmlr\   Ú
list_titler,   ÚmtÚsoupÚcmÚattachmentsr?   rE   ÚtxtÚabs_urlrL   Únew_arP   Úidx_aÚciÚchildÚ_ÚpartsÚelÚinner_tablesÚel_has_attachÚ	first_keyÚ	title_keyÚseenÚfinal_partsÚkeyÚcontentÚcontent_unescapedr[   s    `                            @r&   Úextract_detailr�   S   sR  ù€ à€EÜ	�‰ÐEÀtÓ	L€BÙ	Ü˜BŸH™H Q›KÓ(ˆÙØˆä˜˜}Ó-€DØ	�‰�5Ð!2ˆÓ	3€BÙØ�b˜"ˆ}Ðð €KØ�[‰[˜ 4ˆ[Ó(ò 	3ˆØ�‰yˆØ�j‰j˜tˆjÓ$ˆÜ�I‰IÐOÐQUÔVØ §¡£Ñ-°¸T¿Z¹Z»\Ñ1IÈSÏ^É^Ð\dÕMeÜ˜h¨Ó-ˆGØ×%Ñ%Ð&=Ô>Ø/6×/AÑ/AÀ$Ô/G˜' GÒ+ÈW�Ù‘3 7§=¡=°Ó#5°bÑ#9ˆDØ×Ñ  4¨Ð1Õ2ð	3ð (ò Ñˆˆ4�Ø—‘˜S w°x�Ó@ˆØˆŒØ�8‰8ÐØ—‘ˆAØˆEÜ& q§z¡zÓ2ò ‘	��EØ˜A’:Ø�EÙðð Ð Ü! !§*¡*¨V¨eÐ"4Ó5ò *�EÜ˜u f¨dÓ3°uÓ<ØŸ™Õ)ð*ð 	
�‰�uÕðð 4?×?¡- ! Q¨’gÓ?€Nð €EØ�k‰k EˆkÓ*ò "ˆØ�7‰7�gÒØ�L‰Lœ˜R›Ô!ØØ�7‰7ÐTÑTØ—+‘+˜b¨�+Ó-ˆCÙ˜rŸw™w uœ~ØØŸ;™; wÓ/ˆLÜô  6àŸ™ S¨t˜Ó4ô 6ó 6ˆMñ ™}Ø—‘œS ›WÔ%ØØ�L‰L˜Õà—+‘+˜b¨�+Ó-ˆCÚØ—‘˜SÕ!ð'"ñ, Ü—F‘F˜6 2¤r§v¡v¨j¸"¸eÀA¹hÓ'GÓHˆ	Ü—F‘F˜6 2 uÓ-ˆ	Ù˜ iÒ/Ø˜!˜"�IˆEô ‹5€DØ€KØò "ˆÜ�f‰f�V˜R¤§¡¨
°B¸Ó!:Ó;ˆÚ�3˜d’?Ø�H‰H�SŒMØ×Ñ˜qÕ!ð	"ð �k‰k˜+Ó&€GØŸ™¨°Ó5ÐØ'ò TÑˆˆ4�Ø˜'Ò! gÐ5FÒ&FØÐ)¨'¨Ð2DÀTÀFÈ(ÐSÑS‰GðTô �f‰fÐ*¨B°Ó8€GÜ�f‰f�Y ¨Ó0×6Ñ6Ó8€GØ�"�gÐÐùóc @s   Ç:Qc                  óV  — 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«       |j                  d	«       |j                  «       }d}d}d}t        d| dz   «      D �]¼  }	t        |	«      }
|
s#|	dk(  rt        d
t         j                  ¬«        �nŒt        d|	› dt        |
«      › d�«       |
D �]h  \  }}}	 |j                  d|f«       |j                  «       r|dz  }Œ2	 t'        |«      }|s|dz  }ŒFt)        |||«      \  }}}|r1t        t+        j,                  dd|«      j/                  «       «      dk  r|dz  }Œ�|s|}t+        j,                  dd|«      d d }t+        j,                  dd|«      j/                  «       }d|v rdnd}	 |j                  d||||||t0        t2        t4        |df«      }|j6                  }|j                  d||t0        |f«       |j9                  «        |dz  }t        d|› d|d d › �«       t#        j$                  d «       �Œk �Œ¿ |jC                  «        t        d!|› d"|› d#|› d$||z   |z   › �«       y # t        j                   $ r t#        j$                  d«       Y �ŒÈw xY w# t        j                   $ rá}dt;        |«      v rÄ|j=                  «        t#        j$                  d«       	 |j                  d||||||t0        t2        t4        |df«      }|j6                  }|j                  d||t0        |f«       |j9                  «        |dz  }t        d|› d|d d › d�«       n)# t>        $ r |j=                  «        |dz  }Y n	w xY w|dz  }Y d }~�Œgd }~wt        j@                  $ r	 |dz  }Y �Œ…w xY w)%Nr   r   z--pages=ú=z--pagesé<   )r	   zPRAGMA busy_timeout=60000zPRAGMA journal_mode=WALu     [WARN] ç¬¬1é¡µæ— æ•°æ�®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] é-   Úlockedé   u    (é‡�è¯•æˆ�åŠŸ)g333333Ó?u	   
æ–°å¢ž: u
     é‡�å¤�: u     è¿‡çŸ­/404: u
     æ€»è®¡: )"r   ÚargvÚlenrg   Úintrh   Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorr   rA   r   r   ÚfetchoneÚOperationalErrorr   r   r'   r�   r)   r*   r+   Ú	SITE_NAMEÚSCRIPT_NAMEÚ
GROUP_NAMEÚ	lastrowidÚcommitrr   Úrollbackr   ÚIntegrityErrorÚclose)Ú	max_pagesÚargsr"   r?   ÚconnÚcÚ	total_newÚ	total_dupÚ
total_skipr;   r>   r    r,   r1   ÚdhtmlÚd_titlerƒ   r�   ÚsummaryÚ	has_tableÚcurÚridr%   s                          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Ø‡L�LÐ,Ô-Ø‡L�LÐ*Ô+Ø�‰‹€AØ€IØ€IØ€Jä�a˜ Q™Ó'ó <ˆÜ˜4Ó ˆÙØ�qŠyÜÐ1¼¿
¹
ÕCÚÜ��d�V˜<¬¨E«
 |°4Ð8Ô9Ø %ó 5	ÑˆC�˜ðØ—	‘	ÐCÀcÀVÔLØ—:‘:”<Ø ‘N�IØð  ô ˜S“MˆEÙØ˜a‘�
ØÜ"0°¸¸UÓ"CÑˆG�Q˜Ùœ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¸$Ä	Ì;ÔXbÐdmÐopÐqós�ð —m‘m�Ø—	‘	ÐpØ ¬°GÐ<ô>à—‘”Ø˜Q‘�	Ü˜˜d˜V 2 g¨c¨r l ^Ð4Ô5ô, �J‰J�sŽOòk5	ð<ð| 	‡J�J„LÜ	ˆJ�y�k ¨I¨;°nÀZÀLÐPZÐ[dÐenÑ[nÐoyÑ[yÐZzÐ
{Õ|øôe ×+Ñ+ò Ü—
‘
˜1”Úðûô4 ×+Ñ+ò $Øœs 1›vÑ%Ø—M‘M”OÜ—J‘J˜q”Mð(ØŸi™ið IØ$ g¨w¸¸SÀ$Ì	ÔS^Ô`jÐluÐwxÐyó{˜ð "Ÿm™m˜ØŸ	™	Ð"xØ#&¨´¸GÐ"DôFàŸ™œØ! Q™˜	Ü  d V¨2¨g°c°r¨l¨^¸?ÐKÕLøÜ$ò (ØŸ™œØ" a™š
ð(úð  !‘O�JÿùÜ×)Ñ)ò Ø˜Q‘“	ðúsV   Å(K+È*A8LË+(LÌLÌP(Ì-2P	Í A9OÏP	ÏO;	Ï8P	Ï:O;	Ï;P	Ð	P(Ð'P(Ú__main__)é   r“   )Ú__doc__r   r)   r   r4   Ússlr�   Úurllib.requestr   r7   Úurllib.parser   Úbs4r   r¤   r¥   r¦   r3   rŸ   Úcreate_default_contextr   Úcheck_hostnameÚ	CERT_NONEÚverify_moder   r'   r-   rA   r�   r¹   Ú__name__© r.   r&   ú<module>rÇ      s    ðñ÷ C× B× B× BÝ  Ý àB€	Ø$€Ø€
Ø
C€Ø
€à €c× Ñ Ó"€Ø€Ô Ø—-‘-€„ð @Ø4Ø0ñ€óòòò8ZòzT}ðn ˆzÒÙ…Fð r.   