Ë
    ¸¬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mZ ddlZddlm	Z	 dZ
e
› d�ZdZdZd	Zd
ZdddœZ ej"                  «       Zej&                  j)                  e«       d„ Zd„ Zd„ Zdd„Zd„ Zd„ Zefd„Zedk(  rbe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ä   
è‚‡åº†å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - å»ºè®¾é¡¹ç›®çŽ¯å¢ƒå½±å“�è¯„ä»·ä¿¡æ�¯å…¬å¼€å¹³å�° çˆ¬è™«
ç³»ç»Ÿ: Vue SPA + REST API
API: GET /zqhjj/gkmlpt/api/all/21022?page=N
è¿”å›žJSONå�«articles[].{id,title,url,date,publisher,classify_main_name}
é    N)Údatetime)ÚBeautifulSoupzhttp://www.zhaoqing.gov.cnz/zqhjj/gkmlpt/api/all/21022u   è‚‡åº†å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€u	   å¹¿ä¸œçœ�z/mnt/data/search.dbé   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z!application/json, text/plain, */*)z
User-AgentÚAcceptc                 óR   — | syt        j                  dd| «      j                  «       S )NÚ z\s+ú )ÚreÚsubÚstrip)Útexts    ú(/root/gov_crawler/crawl_zhaoqing_hpjz.pyÚ
clean_textr   &   s$   € ÙØÜ�6‰6�&˜#˜tÓ$×*Ñ*Ó,Ð,ó    c                 óJ   — t        j                  | «      j                  d«      S )z$Convert UNIX timestamp to YYYY-MM-DDz%Y-%m-%d)r   ÚfromtimestampÚstrftime)Útss    r   Útimestamp_to_dater   ,   s   € ä×!Ñ! "Ó%×.Ñ.¨zÓ:Ð:r   c                 ó~  — | syt        | d«      } |ddg«      D ]  }|j                  «        Œ g }|j                  D �]m  }|j                  sŒ|j                  dk(  r'|j	                  d¬«      }|sŒ5|j                  |«       ŒG|j                  dk(  r|j                  t        |«      «       Œq|j                  d	v r„|j                  dd¬
«      D ]:  }|j                  d«      rŒ|j	                  d¬«      }|sŒ*|j                  |«       Œ< |j                  dd¬
«      D ]  }|j                  t        |«      «       Œ �Œ|j                  dk(  s�Œ|j                  dd«      }|j                  dd«      }	|s�Œ<|j                  d«      r	t        |z   }|j                  d|	› d|› d�«       �Œp dj                  |«      S )uF   æ��å�–æ­£æ–‡ï¼Œå�ªå¤„ç�†ç›´æŽ¥å­�å…ƒç´ é�¿å…�é‡�å¤�ï¼Œè¡¨æ ¼ä¿�æŒ�HTMLr   úhtml.parserÚscriptÚstyleÚpT)r   Útable)ÚdivÚsectionÚarticle)Ú	recursiveÚimgÚsrcÚaltú/z![z](ú)ú

)r   Ú	decomposeÚchildrenÚnameÚget_textÚappendÚstrÚfind_allÚfind_parentÚgetÚ
startswithÚBASE_URLÚjoin)
Úhtml_contentÚsoupÚtagÚpartsÚchildÚtr   Útblr!   r"   s
             r   Úclean_content_htmlr9   1   s”  € áØÜ˜ }Ó5€DÙ�X˜wÐ'Ó(ò ˆØ�‰�ðð €EØ—‘ó 1ˆØ�zŠzØØ�:‰:˜ÒØ—‘ T�Ó*ˆAÚØ—‘˜Q•Ø�Z‰Z˜7Ò"à�L‰Lœ˜U›Õ$Ø�Z‰ZÐ8Ñ8à—^‘^ C°4�^Ó8ò $�à—=‘= Ô)ØØ—J‘J T�JÓ*�ÚØ—L‘L •Oð$ð —~‘~ g¸�~Ó>ò '�Ø—‘œS ›XÕ&ò'à�Z‰Z˜5Ô Ø—)‘)˜E 2Ó&ˆCØ—)‘)˜E 2Ó&ˆCÛà—>‘> #Ô&Ü" S™.�CØ—‘˜r #  b¨¨¨QÐ/Ö0ð;1ð< �;‰;�uÓÐr   c                 ó
  — g }t        d| dz   «      D ]È  }t        d|› d�«       	 t        j                  t        d|id¬«      }|j
                  dk7  rt        d|j
                  › �«       ŒY|j                  «       }|j                  d	g «      }|st        d
«        |S |j                  |«       t        dt        |«      › d�«       t        j                  d«       ŒÊ |S # t        $ r}t        d|› �«       Y d}~ |S d}~ww xY w)u   ä»ŽAPIèŽ·å�–æ‰€æœ‰æ–‡ç« åˆ—è¡¨é   u     èŽ·å�–åˆ—è¡¨ ç¬¬u   é¡µ...Úpageé   )ÚparamsÚtimeoutéÈ   z	    HTTP Úarticlesu       æ— æ•°æ�®u
       èŽ·å�–u   æ�¡ç333333Ó?ú
    [ERR] N)ÚrangeÚprintÚsessionr.   ÚAPI_URLÚstatus_codeÚjsonÚextendÚlenÚtimeÚsleepÚ	Exception)Ú	max_pagesÚall_articlesr<   ÚrÚdatarA   Úes          r   Ú
fetch_listrT   \   s  € à€LÜ�a˜ Q™Ó'ò ˆÜÐ" 4 &¨Ð/Ô0ð	Ü—‘œG¨V°T¨NÀB�ÓGˆAØ�}‰} Ò#Ü˜	 !§-¡- Ð1Ô2ØØ—6‘6“8ˆDØ—x‘x 
¨BÓ/ˆHÙÜ˜Ô'Øð Ðð ×Ñ Ô)Ü�Jœs 8›}˜o¨SÐ1Ô2Ü�J‰J�s�Oðð$ Ðøô ò 	Ü�J˜q˜cÐ"Ô#ÜØÐûð	ús$   ¥ACÁ+/CÂ>CÃ	DÃ(C=Ã=Dc           	      ó  — t        | d«      }d}d}d}d}|j                  d«      }|D ]&  }t        |j                  «       «      }	|	sŒd|	vsŒ$|	} n |s|rt        |d   j                  «       «      }t	        j
                  d| «      }
|
r|
j                  d«      }t	        j
                  d| «      }|r|j                  d«      j                  «       }|j                  d	d
¬«      }|s|j                  d	d¬«      }|rt        t        |«      «      }|sn|j                  d«      }|D �cg c]A  }t        t        |j                  «       «      «      dkD  sŒ)t        |j                  «       «      ‘ŒC }}dj                  |«      }||||fS c c}w )u?   è§£æž�è¯¦æƒ…é¡µï¼Œè¿”å›ž (title, publish_date, source, content)r   r   Úh1u   æ”¿åºœä¿¡æ�¯éÿÿÿÿu(   å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}-\d{2}-\d{2})r;   u   å�‘å¸ƒæœºæž„[ï¼š:]\s*([^<\n]+)r   zarticle-content)Úclass_zcontent-containerr   r=   r%   )r   r,   r   r)   r
   ÚsearchÚgroupr   Úfindr9   r+   rK   r1   )ÚhtmlÚurlr3   ÚtitleÚpublish_dateÚsourceÚcontentÚh1srV   r7   Ú
date_matchÚsource_matchÚarticle_divÚ
paragraphsr   Ú
body_textss                   r   Úparse_detailrh   u   s  € ä˜˜}Ó-€DØ€EØ€LØ€FØ€Gð �-‰-˜Ó
€CØò ˆÜ�r—{‘{“}Ó%ˆÚ� qÒ(ØˆEÙð	ñ
 ‘SÜ˜3˜r™7×+Ñ+Ó-Ó.ˆô —‘ÐFÈÓM€JÙØ!×'Ñ'¨Ó*ˆÜ—9‘9Ð>ÀÓE€LÙØ×#Ñ# AÓ&×,Ñ,Ó.ˆð —)‘)˜EÐ*;�)Ó<€KÙØ—i‘i Ð.A�iÓBˆÙÜ$¤S¨Ó%5Ó6ˆÙØ—]‘] 3Ó'ˆ
Ø8BÖi°1ÄcÌ*ÐUV×U_ÑU_ÓUaÓJbÓFcÐfhÓFh”j §¡£Õ.Ðiˆ
ÐiØ—+‘+˜jÓ)ˆà�, ¨Ð/Ð/ùò js   Ä&*FÅFc                 ó>  — | d   }|xs | d   j                  dd«      }|xs t        | j                  dd«      «      }|xs | j                  d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(  re|j                  j                  «       }|r	 t        |j                  «       «      }nd}|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)u   å†™å…¥gov_raw + FTS gov_searchr]   r^   ú'z''Údater   Ú	publisherNr@   zœINSERT OR IGNORE INTO gov_raw 
        (page_url, title, content, publish_date, source_url, site_name, summary, group_name, industry)
    VALUES 
        ('z', 'u   ', 'æ”¿åºœå…¬å‘Š');
zE
SELECT CASE WHEN changes() > 0 THEN last_insert_rowid() ELSE 0 END;
Úsqlite3Tr=   )ÚinputÚcapture_outputr   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)Úreplacer   r.   Ú	SITE_NAMEÚGROUPÚ
subprocessÚrunÚDB_PATHÚ
returncodeÚstdoutr   ÚintÚ
ValueErrorÚstderrrE   rN   )r   Údetail_titleÚpub_dater`   ra   Úpage_urlr^   r_   Úsource_nameÚsummaryÚ	site_nameÚsql_rawÚcombined_sqlÚresultÚoutÚrowidÚfts_sqlrS   s                     r   Úinsert_articler‡   ž   sø  € à�u‰~€HØÒ-˜W WÑ-×6Ñ6°s¸DÓA€EØÒHÔ0°·±¸VÀQÓ1GÓH€LØÒ?˜GŸK™K¨´YÓ?€KØ×%Ñ% c¨4Ó0€KØ�o‰o˜c 4Ó(€GØ�D�Sˆk€GÜ€Iðð ˆ*�D˜˜˜t G 9¨D°°¸dÀ8À*ÈDÐQZÐP[Ð[_Ð`gÐ_hÐhlÔmrÐlsð tð€Gð ð ñ €Lð'Ü—‘ØœÐ ØØ d°Bô
ˆð
 ×Ñ Ò!Ø—-‘-×%Ñ%Ó'ˆCÙðÜ §	¡	£Ó,‘Eð �à�qŠyðDØDIÀ7ð Kð�ô —‘Ø¤Ð(Ø!Ø#'¨d¸Bõð
 à"¨&¯-©-Ñ7Ü˜	 &§-¡-°°Ð"5Ð!6Ð7Ô8ð øô) "ò Ø’Eðûô$ ò 'ÜÐ! ! Ð%×&Ð&Øûð'úsC   Â,AE; Ã8E* Ä.E; Å )E; Å*E8Å5E; Å7E8Å8E; Å;	FÆFÆFc                 óV  — 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
}|D ]à  }|d   }||v r|dz  }Œ|d   }t        d|d d › d�«       	 t        j                  |d¬«      }	d|	_        t#        |	j$                  |«      \  }}}}|s|}|st'        |j                  dd
«      «      }t        |j                  «       «      }|dk  rt        d|› d�«       Œ²t)        |||||«      r|dz  }n|dz  }t        j                   d«       Œâ t        d|› d|› d�«       t        d«       y # t        $ r Y �Œ*w xY w# t        $ r.}
t        d|
› �«       t        j                   d«       Y d }
~
�ŒCd }
~
ww xY w)Nu9   === è‚‡åº†å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ çŽ¯è¯„ä¿¡æ�¯å…¬å¼€çˆ¬è™« ===u     æ— æ–‡ç« åˆ—è¡¨u   
åˆ—è¡¨æ€»è®¡: u    æ�¡rm   zDSELECT page_url FROM gov_raw WHERE page_url LIKE '%zhaoqing.gov.cn%'Tr=   )ro   r   r?   r   ú
u   å·²çŸ¥URL: r]   r;   r^   u
     æŠ“å�–: é(   z...)r?   zutf-8rC   rk   é   u       [SKIP] æ­£æ–‡è¿‡çŸ­(u   å­—)rB   u   
ç»“æžœ: æ–°å¢ž u    æ�¡, è·³è¿‡ u   === å®Œæˆ� ===)rE   rT   rK   Úsetrs   rt   ru   rv   rw   r   ÚsplitrN   rF   r.   ÚencodingrL   rM   rh   r   r   r‡   )rO   rA   Ú
known_urlsrƒ   ÚaddedÚskippedÚar]   Ú	title_apirQ   rS   r{   r|   r`   ra   Úcontent_lens                   r   Úmainr•   Ö   s7  € Ü	ÐEÔGô ˜)Ó$€HÙÜÐ!Ô"ØÜ	ÐœS ›]˜O¨4Ð
0Ô1ô “€JðÜ—‘ØœÐ!gÐhØ d°Bô
ˆð ×Ñ Ò! f§m¡m×&9Ñ&9Ô&;Ü˜VŸ]™]×0Ñ0Ó2×8Ñ8¸Ó>Ó?ˆJô 
ˆKœ˜J›Ð(Ð
)Ô*ð €EØ€GØò "ˆØ�‰hˆØ�*ÑØ�q‰LˆGØà�g‘Jˆ	Ü�
˜9 S b˜>Ð*¨#Ð.Ô/ð	Ü—‘˜C¨�Ó,ˆAØ ˆAŒJô 3?¸q¿v¹vÀsÓ2KÑ/ˆ�h ¨ÙØ$ˆLÙÜ(¨¯©¨v°qÓ)9Ó:ˆHô ˜'Ÿ-™-›/Ó*ˆØ˜ÒÜÐ,¨[¨M¸Ð>Ô?Øä˜!˜\¨8°V¸WÔEØ�Q‰J‰Eà�q‰LˆGä�
‰
�3�ðE"ôH 
Ð˜e˜W M°'°¸$Ð
?Ô@Ü	Ð
ÕøôY ò Úðûô& ò 	Ü�J˜q˜cÐ"Ô#Ü�J‰J�qŒMÝûð	ús+   ÁA;G! Ä
G1Ç!	G.Ç-G.Ç1	H(Ç:#H#È#H(Ú__main__r;   z--pages=ú=)rO   )r   )%Ú__doc__r
   ÚsysrI   rL   rs   r   ÚrequestsÚbs4r   r0   rG   rq   rr   ru   ÚTOTAL_PAGESÚHEADERSÚSessionrF   ÚheadersÚupdater   r   r9   rT   rh   r‡   r•   Ú__name__ÚpagesrK   ÚargvÚargr/   rx   r�   ry   © r   r   ú<module>r¦      s/  ðñó 
Û 
Û Û Û Ý ã Ý ð (€ØˆJÐ1Ð
2€Ø&€	Ø€Ø
€Ø€ð DØ1ñ€ð
 ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ ò-ò;ò
'óVò2%0òR4ðp ó ?ðD ˆzÒØ€EÙ
ˆ3�8‰8ƒ}�qÒØ—8‘8˜A˜B�<ò 	ˆCØ�~‰~˜jÕ)ðÙ §	¡	¨#£¨qÑ 1Ó2‘Eð	ñ 	�5Öð øð "ò Ùðús   Ã C'Ã'C/Ã.C/