Ë
    ¸¬ujŒ'  ã                   ó  — d 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Zddlm	Z	 dZ
e
dz   ZdZdZd	Zd
diZ ej                   «       Zej$                  j'                  e«       ej(                  j+                  dd«       d„ Zd„ Zdd„Zd„ Zd„ Zdd„Zedk(  rbdZ eej>                  «      dkD  rAej>                  dd D ]/  Z e jC                  d«      sŒ	  e"e jG                  d«      d   «      ZŒ1  ee¬«       yy# e$$ r Y ŒDw xY w)uÃ  
å¹¿å¾·å¸‚äººæ°‘æ”¿åºœ - æ”¿åºœä¿¡æ�¯å…¬å¼€â†’å¸‚ç”Ÿæ€�çŽ¯å¢ƒåˆ†å±€â†’å»ºè®¾é¡¹ç›®çŽ¯è¯„æ–‡ä»¶å®¡æ‰¹ çˆ¬è™«
CMS: å¹¿å¾·å¸‚è‡ªå®šä¹‰æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�°
WAF: token_verified cookie
åˆ—è¡¨: ul.search-list > li > a(æ ‡é¢˜) + span(æ—¥æœŸ)
åˆ†é¡µ: /XxgkContent/showList/548/125473/page_{n}.html (15æ�¡/é¡µ, 143é¡µ2141æ�¡)
è¯¦æƒ…: /OpennessContent/show/{id}.html
è¯¦æƒ…ç»“æž„: div.u-title(æ ‡é¢˜), div.u-desc(å�‘å¸ƒæ—¶é—´:), div.g-detailbox#zoom(æ­£æ–‡)
é    N)Úurljoin)ÚBeautifulSoupzhttps://www.guangde.gov.cnz./XxgkContent/showList/548/125473/page_{n}.htmlu"   å¹¿å¾·å¸‚äººæ°‘æ”¿åºœ-çŽ¯è¯„å®¡æ‰¹u   å®‰å¾½z/mnt/data/search.dbz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36Útoken_verifiedÚtruec                 óV   — | syt        j                  dd| «      } | j                  «       S )NÚ z(&middot;|&nbsp;|\s)+ú )ÚreÚsubÚstrip)Útexts    ú)/root/gov_crawler/crawl_guangde_hjxxgk.pyÚ
clean_textr   &   s'   € ÙØÜ�6‰6Ð*¨C°Ó6€DØ�:‰:‹<Ðó    c                 óð  — | syt        | d«      } |ddg«      D ]  }|j                  «        Œ g }|j                  D �]&  }|j                  sŒ|j                  dk(  rÆ|j	                  d¬«      }|sŒ5|j                  dd¬	«      D ]‰  }|d
   }t        j                  d|t        j                  «      sŒ.|j	                  d¬«      xs |}	|j                  d«      st        ||«      n|}
|j                  |j                  d|	› d|
› d�«      «       Œ‹ |j                  |«       Œæ|j                  dk(  r|j                  t        |«      «       �Œ|j                  dv �r—|j                  dd¬«      D ]Ù  }|j                  d«      rŒ|j	                  d¬«      }|sŒ*|j                  dd¬	«      D ]‰  }|d
   }t        j                  d|t        j                  «      sŒ.|j	                  d¬«      xs |}	|j                  d«      st        ||«      n|}
|j                  |j                  d|	› d|
› d�«      «       Œ‹ |j                  |«       ŒÛ |j                  dd¬«      D ]  }|j                  t        |«      «       Œ |j                  d«      D ]`  }|j!                  dd«      }|j!                  dd«      }|sŒ*|j                  d«      st        ||«      n|}|j                  d|› d|› d�«       Œb �Œ·|j                  dk(  s�ŒÈ|j!                  dd«      }|j!                  dd«      }|s�Œð|j                  d«      st        ||«      n|}|j                  d|› d|› d�«       �Œ) dj#                  |«      S )u.   æ��å�–æ­£æ–‡ï¼Œè¡¨æ ¼ä¿�ç•™HTMLï¼Œé™„ä»¶åµŒå…¥r   úhtml.parserÚscriptÚstyleÚpT©r   Úa)Úhrefr   z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$Úhttpz [z](z) Útable)ÚdivÚsectionÚarticle©Ú	recursiveÚimgÚsrcÚaltz![ú)z

)r   Ú	decomposeÚchildrenÚnameÚget_textÚfind_allr
   ÚsearchÚIÚ
startswithr   Úreplace_withÚ
new_stringÚappendÚstrÚfind_parentÚgetÚjoin)Úhtml_contentÚ
detail_urlÚsoupÚtagÚpartsÚchildÚtÚa_tagr   Úa_textÚfull_urlr   Útblr    r!   r"   Úfull_srcs                    r   Úclean_content_htmlr?   -   s:  € áØÜ˜ }Ó5€DÙ�X˜wÐ'Ó(ò ˆØ�‰�ðð €EØ—‘ó .6ˆØ�zŠzØà�:‰:˜ÒØ—‘ T�Ó*ˆAÚà"Ÿ^™^¨C°d˜^Ó;ò Y�EØ  ™=�DÜ—y‘yÐ!FÈÌbÏdÉdÕSØ!&§¡°d Ó!;Ò!C¸t˜ØDHÇOÁOÐTZÔD[¤7¨:°tÔ#<Ðae˜Ø×*Ñ*¨4¯?©?¸RÀ¸xÀrÈ(ÈÐSUÐ;VÓ+WÕXðYð —‘˜Q•à�Z‰Z˜7Ò"Ø�L‰Lœ˜U›Ö$à�Z‰ZÐ8Ò8Ø—^‘^ C°4�^Ó8ò $�Ø—=‘= Ô)ØØ—J‘J T�JÓ*�ÚØ!"§¡¨C°d Ó!;ò ]˜Ø$ V™}˜ÜŸ9™9Ð%JÈDÔRT×RVÑRVÕWØ%*§^¡^¸$ ^Ó%?Ò%GÀ4˜FØHLÏÉÐX^ÔH_¤w¨z¸4Ô'@Ðei˜HØ!×.Ñ.¨t¯©ÀÀFÀ8È2ÈhÈZÐWYÐ?ZÓ/[Õ\ð]ð —L‘L •Oð$ð —~‘~ g¸�~Ó>ò '�Ø—‘œS ›XÕ&ð'à—~‘~ eÓ,ò :�Ø—g‘g˜e RÓ(�Ø—g‘g˜e RÓ(�ÚØ?B¿~¹~ÈfÔ?Uœw z°3Ô7Ð[^�HØ—L‘L 2 c U¨"¨X¨J°aÐ!8Õ9ò:ð �Z‰Z˜5Ô Ø—)‘)˜E 2Ó&ˆCØ—)‘)˜E 2Ó&ˆCÛØ;>¿>¹>È&Ô;Qœ7 :¨sÔ3ÐWZ�Ø—‘˜r #  b¨¨
°!Ð4Ö5ð].6ð` �;‰;�uÓÐr   é   c                 óÊ  — g }t        | «      D �]«  }t        j                  |dz   ¬«      }t        d|dz   › d�d¬«       	 t        j                  |d¬«      }d	|_        |j                  d
k7  rt        d|j                  › �«        |S 	 t        |j                  d«      }|j                  dd¬«      }|st        d«        |S d}|j                  dd¬«      D ]½  }	|	j                  d«      }
|
sŒ|
j                  dd«      }t        |
j                  dd«      «      xs t        |
j                  d¬«      «      }|	j                  d«      }|rt        |j                  «       «      nd}|r|sŒ”t        t         |«      }|j#                  |||dœ«       |dz  }Œ¿ t        |› d�«       t%        j&                  d «       �Œ® |S # t        $ r}t        d|› �«       Y d}~ |S d}~ww xY w)!u   èŽ·å�–æ–‡ç« åˆ—è¡¨é   )Únu     ç¬¬u   é¡µ...r	   ©Úendé   ©Útimeoutúutf-8éÈ   zHTTP úERR Nr   Úulzsearch-list©Úclass_u	   æ— åˆ—è¡¨r   ÚliFr   r   r   r   ÚtitleTr   Úspan)ÚurlrP   Údateu   æ�¡ç333333Ó?)ÚrangeÚLIST_URL_TMPLÚformatÚprintÚsessionr1   ÚencodingÚstatus_codeÚ	Exceptionr   r   Úfindr(   r   r'   r   ÚBASE_URLr.   ÚtimeÚsleep)Ú	max_pagesÚ	all_itemsÚpagerR   ÚrÚer5   rL   ÚcountrO   r   r   rP   rQ   rS   r<   s                   r   Ú
fetch_listrg   i   sä  € à€IÜ�iÓ ó #ˆÜ×"Ñ" T¨A¡XÐ"Ó.ˆÜ��d˜1‘f�X˜VÐ$¨#Õ.ð	Ü—‘˜C¨�Ó,ˆAØ ˆAŒJØ�}‰} Ò#Ü˜˜aŸm™m˜_Ð-Ô.Øð8 Ðð= $ô ˜QŸV™V ]Ó3ˆØ�Y‰Y�t MˆYÓ2ˆÙÜ�+ÔØð& Ðð# ˆØ—+‘+˜d¨e�+Ó4ò 	ˆBØ—‘˜“ˆAÙØØ—5‘5˜ Ó$ˆDÜ˜qŸu™u W¨bÓ1Ó2ÒX´jÀÇÁÐRVÀÓAWÓ6XˆEØ—7‘7˜6“?ˆDÙ26”:˜dŸm™m›oÔ.¸BˆDÙ™uØÜœx¨Ó.ˆHØ×Ñ X¸ÀtÑLÔMØ�Q‰J‰Eð	ô 	���sˆmÔÜ�
‰
�3ŽðG#ðH Ðøô7 ò 	Ü�D˜˜�*ÔÜð2 Ðûð7	ús   Á AF?Æ?	G"ÇGÇG"c                 ó¬  — t        | d«      }d}d}d}d}|j                  dd¬«      }|rt        |j                  «       «      }|j                  dd¬«      }|r¤|j                  «       }	t	        j
                  d|	«      }
|
rE|
j                  d«      }|j                  d	d
«      j                  dd
«      j                  dd«      }|}t	        j
                  d|	«      }|r|j                  d«      j                  «       }|j                  dd¬«      }|s|j                  dd¬«      }|s|j                  dd¬«      }|rt        t        |«      |«      }||||fS )u   è§£æž�è¯¦æƒ…é¡µr   r   r   zu-titlerM   zu-descu6   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}[-å¹´]\d{1,2}[-æœˆ]\d{1,2})rB   u   å¹´ú-u   æœˆu   æ—¥u   æ�¥æº�[ï¼š:]\s*([^\\s]+)zg-detailboxÚzoom)Úidzm-detailbox)r   r]   r   r'   r
   r)   ÚgroupÚreplacer   r?   r/   )ÚhtmlrR   r5   rP   Úpublish_dateÚsourceÚcontentÚu_titleÚu_descÚtxtÚdmÚrawÚsmrj   s                 r   Úparse_detailrx   “   sJ  € ä˜˜}Ó-€DØ€EØ€LØ€FØ€Gð �i‰i˜ iˆiÓ0€GÙÜ˜7×+Ñ+Ó-Ó.ˆð �Y‰Y�u XˆYÓ.€FÙØ�o‰oÓˆÜ�Y‰YÐPÐRUÓVˆÙØ—(‘(˜1“+ˆCØ—+‘+˜e SÓ)×1Ñ1°%¸Ó=×EÑEÀeÈRÓPˆCØˆLÜ�Y‰YÐ2°CÓ8ˆÙØ—X‘X˜a“[×&Ñ&Ó(ˆFð �9‰9�U =ˆ9Ó1€DÙØ�y‰y˜ 6ˆyÓ*ˆÙØ�y‰y˜ }ˆyÓ5ˆÙÜ$¤S¨£Y°Ó4ˆà�, ¨Ð/Ð/r   c                 ó"  — | d   j                  dd«      }|xs | d   j                  dd«      }|xs | j                  dd«      }|xs t        }|j                  dd«      }|j                  dd«      }	|d d }
t        }d|› d	|› d	|	› d	|› d	|› d	|› d	|
› d	t        › d
�}|dz   }	 t	        j
                  dt        g|ddd¬«      }|j                  dk(  r`|j                  j                  «       }	 t        |j                  «       «      }|dkD  rPd|› d�}t	        j
                  dt        g|ddd¬«       yd|j                  vrt        d|j                  d d › �«       y# t        $ r d}Y Œcw xY w# t        $ r}t        d|› �«       Y d }~yd }~ww xY w)NrR   ú'z''rP   rS   r   rJ   zœINSERT OR IGNORE INTO gov_raw 
        (page_url, title, content, publish_date, source_url, site_name, summary, group_name, industry)
    VALUES 
        ('z', 'u   ', 'çŽ¯è¯„å…¬ç¤º');
zDSELECT CASE WHEN changes() > 0 THEN last_insert_rowid() ELSE 0 END;
Úsqlite3TrF   )ÚinputÚcapture_outputr   rH   r   z‡INSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary)
SELECT rowid, title, site_name, summary FROM gov_raw WHERE rowid = z;
zUNIQUE constraintz	    [DB] u       [DB] é”™è¯¯: F)rm   r1   Ú	SITE_NAMEÚGROUPÚ
subprocessÚrunÚDB_PATHÚ
returncodeÚstdoutr   ÚintÚ
ValueErrorÚstderrrX   r\   )ÚitemÚdetail_titleÚpub_daterp   rq   Úpage_urlrP   ro   Úsource_nameÚcontent_safeÚsummaryÚ	site_nameÚsql_rawÚcombined_sqlÚresultÚoutÚrowidÚfts_sqlre   s                      r   Úinsert_articler–   ¹   sè  € Ø�E‰{×"Ñ" 3¨Ó-€HØÒ*˜T '™]×3Ñ3°C¸Ó>€EØÒ3˜tŸx™x¨°Ó3€LØÒ%œI€KØ×%Ñ% c¨4Ó0€KØ—?‘? 3¨Ó-€LØ�D�Sˆk€GÜ€Iðð ˆ*�D˜˜˜t L >°°l°^À4ÈÀzÐQUÐV_ÐU`Ð`dÐelÐdmÐmqÔrwÐqxð yð€Gð
 ð ñ €Lð'Ü—‘ØœÐ ØØ d°Bô
ˆð
 ×Ñ Ò!Ø—-‘-×%Ñ%Ó'ˆCðÜ˜CŸI™I›KÓ(�ð �qŠyðDØDIÀ7ð Kð�ô —‘ 	¬7Ð3¸7ÐSWÐ^bÐlnÕoØà"¨&¯-©-Ñ7Ü˜	 &§-¡-°°Ð"5Ð!6Ð7Ô8ð øô ò Ø’ðûô ò 'ÜÐ! ! Ð%×&Ð&Øûð'úsC   Â#A	E- Ã-E Ä+E- Ä2)E- ÅE*Å'E- Å)E*Å*E- Å-	FÅ6F	Æ	Fc                 ó˜  — t        d«       t        | «      }|st        d«       y t        dt        |«      › d�«       t        «       }	 t	        j
                  dt        dgddd¬	«      }|j                  d
k(  rL|j                  j                  «       r2t        |j                  j                  «       j                  d«      «      }t        dt        |«      › �«       d
}d
}t        |«      D ]ø  \  }}|d   }||v r|dz  }Œt        d|dz   › dt        |«      › d|d   d d › d�d¬«       	 t        j                  |d¬«      }	d|	_        t%        |	j&                  |«      \  }}}}|j                  «       st        d«       |dz  }Œ™t)        |||||«      r,|dz  }t        dt        |j                  «       «      › d�«       n|dz  }t        d«       t!        j"                  d«       Œú t        d|› d |› d�«       t        d!«       y # t        $ r Y �ŒKw xY w# t        $ r.}
t        d|
› �«       t!        j"                  d«       Y d }
~
�Œ[d }
~
ww xY w)"Nu(   === å¹¿å¾·å¸‚ - çŽ¯è¯„å®¡æ‰¹ çˆ¬è™« ===
u   æ— æ–‡ç« åˆ—è¡¨u   
åˆ—è¡¨æ€»è®¡: u    æ�¡r{   zSSELECT page_url FROM gov_raw WHERE page_url LIKE '%guangde.gov.cn/OpennessContent%'TrF   )r}   r   rH   r   ú
u   å·²çŸ¥URL: rR   rB   z  [ú/z] rP   é2   z...r	   rD   rG   rI   rK   u   SKIP æ— æ­£æ–‡zOK (u   å­—)u   SKIP (é‡�å¤�æˆ–å…¥åº“å¤±è´¥)rT   u   
ç»“æžœ: æ–°å¢ž u    æ�¡, è·³è¿‡ u   === å®Œæˆ� ===)rX   rg   ÚlenÚsetr€   r�   r‚   rƒ   r„   r   Úsplitr\   Ú	enumeraterY   r1   rZ   r_   r`   rx   r   r–   )ra   ÚarticlesÚ
known_urlsr’   ÚaddedÚskippedÚir   rR   rd   re   Úd_titleÚd_dateÚd_sourcerq   s                  r   Úmainr§   ä   s=  € Ü	Ð5Ô7Ü˜)Ó$€HÙÜÐÔ ØÜ	ÐœS ›]˜O¨4Ð
0Ô1ä“€JðÜ—‘ØœÐ!vÐwØ d°Bô
ˆð ×Ñ Ò! f§m¡m×&9Ñ&9Ô&;Ü˜VŸ]™]×0Ñ0Ó2×8Ñ8¸Ó>Ó?ˆJô 
ˆKœ˜J›Ð(Ð
)Ô*à€EØ€GÜ˜(Ó#ò ‰ˆˆ1Ø�‰hˆØ�*ÑØ�q‰LˆGØä��A�a‘C�5˜œ#˜h›-˜¨¨1¨W©:°c°r¨?Ð*;¸3Ð?ÀSÕIð	Ü—‘˜C¨�Ó,ˆAØ ˆAŒJô .:¸!¿&¹&À#Ó-FÑ*ˆ�˜ 7Ø�}‰}ŒÜÐ"Ô#Ø�q‰LˆGØä˜!˜W f¨h¸Ô@Ø�Q‰JˆEÜ�Dœ˜WŸ]™]›_Ó-Ð.¨dÐ3Õ4à�q‰LˆGÜÐ0Ô1Ü�
‰
�3�ð7ô: 
Ð˜e˜W M°'°¸$Ð
?Ô@Ü	Ð
ÕøôI ò Úðûô  ò 	Ü�D˜˜�*ÔÜ�J‰J�qŒMÝûð	ús+   ÁA;H Ä(HÈ	HÈHÈ	I	È#IÉI	Ú__main__rB   z--pages=ú=)ra   )r@   )%Ú__doc__r
   Úsysr_   r€   Úurllib.parser   ÚrequestsÚbs4r   r^   rV   r~   r   r‚   ÚHEADERSÚSessionrY   ÚheadersÚupdateÚcookiesrœ   r   r?   rg   rx   r–   r§   Ú__name__Úpagesr›   ÚargvÚargr+   r…   r�   r†   © r   r   ú<module>r¹      s3  ðñó 
Û 
Û Û Ý  ã Ý ð (€ØÐKÑK€Ø0€	Ø€Ø
€ð ð  Dð€ð ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ Ø ‡�× Ñ Ð$ fÔ -òò9óx'òT#0òL(óV4ðn ˆzÒØ€EÙ
ˆ3�8‰8ƒ}�qÒØ—8‘8˜A˜B�<ò 	ˆCØ�~‰~˜jÕ)ðÙ §	¡	¨#£¨qÑ 1Ó2‘Eð	ñ 	�5Öð øð "ò Ùðús   ÃC8Ã8D Ã?D 