Ë
    %&˜jý  ã                   óÔ   — 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m	Z	 dZ
dZddiZ ej                  d	d
«      ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zedk(  r e«        yy)uo   
çˆ¬è™«ï¼šå¹¿å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - çŽ¯è¯„å®¡æ‰¹å‰�å…¬ç¤º
ç«™ç‚¹ï¼šhttps://sthjj.gz.gov.cn/hjgl/jsxm/hpspqgs/
é    N)ÚBeautifulSoup)Úurljoinz*https://sthjj.gz.gov.cn/hjgl/jsxm/hpspqgs/u   å¹¿å·žå¸‚-çŽ¯è¯„å®¡æ‰¹å‰�å…¬ç¤ºz
User-Agentz[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36Ú	SEARCH_DBz/root/search.dbéd   c                  ó¢   — t        j                  t        d¬«      } | j                  d«       | j                  d«       | j                  d«       | S )Né   )ÚtimeoutzPRAGMA journal_mode=WALzPRAGMA synchronous=NORMALzPRAGMA busy_timeout=30000)Úsqlite3ÚconnectÚDB_PATHÚexecute©Úconns    ú%/root/gov_crawler/crawl_gz_hpspqgs.pyÚ_get_dbr      s>   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø‡L�LÐ,Ô-Ø€Kó    c                 óŠ   — | j                  d«       | j                  d«       | j                  d«       | j                  «        y )NzçCREATE TABLE IF NOT EXISTS gov_raw (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT, source_url TEXT NOT NULL UNIQUE, publish_date TEXT, site_name TEXT, created_at TEXT DEFAULT (datetime('now','localtime')))zACREATE INDEX IF NOT EXISTS idx_gov_raw_site ON gov_raw(site_name)zDCREATE INDEX IF NOT EXISTS idx_gov_raw_date ON gov_raw(publish_date))r   Úcommitr   s    r   Úensure_tabler      s8   € Ø‡L�Lð  {ô  |Ø‡L�LÐTÔUØ‡L�LÐWÔXØ‡K�K…Mr   c                 óL   — | j                  d|f«      }|j                  «       d uS )Nz(SELECT 1 FROM gov_raw WHERE source_url=?)r   Úfetchone)r   Ú
source_urlÚcurs      r   Ú
row_existsr   #   s&   € Ø
�,‰,ÐAÀJÀ=Ó
Q€CØ�<‰<‹> Ð%Ð%r   c                 óZ   — | j                  d||||t        f«       | j                  dkD  ryy)NzeINSERT OR IGNORE INTO gov_raw(title, content, source_url, publish_date, site_name) VALUES (?,?,?,?,?)r   TF)r   Ú	SITE_NAMEÚtotal_changes)r   ÚtitleÚcontentr   Úpublish_dates        r   Ú
insert_rowr!   '   s4   € Ø‡L�LÐxØ˜ *¨l¼IÐFôHà×Ñ˜AÒØØr   c                 ó.  — | j                  d«      }|r‚|j                  d«      D ]c  }|j                  dd«      }|r=|j                  d«      s,|j	                  d|j                  d«      sd|z   n|› d	�«       ŒT|j                  «        Œe t        |«      S y)
Nz	#logPanelÚimgÚsrcÚ zdata:z
<img src="Úhttpúhttps://sthjj.gz.gov.cnz">)Ú
select_oneÚfind_allÚgetÚ
startswithÚreplace_withÚ	decomposeÚstr)ÚsoupÚdivr#   r$   s       r   Úextract_contentr1   .   s‘   € Ø
�/‰/˜+Ó
&€CÙ
Ø—<‘< Ó&ò 	 ˆCØ—'‘'˜% Ó$ˆCÙ˜3Ÿ>™>¨'Ô2Ø× Ñ  :ÐUX×UcÑUcÐdjÔUkÐ.GÈ#Ò.MÐqtÐ-uÐuwÐ!xÕyà—‘•ð	 ô �3‹xˆØr   c                 ó°   — dD ]Q  }| j                  |«      }|sŒdt        |j                  d¬«      «      cxk  rdk  sŒ<n Œ?|j                  d¬«      c S  y)N)z.h1Úh1z.titleé   T©ÚstripéÈ   r%   )r(   ÚlenÚget_text)r/   ÚselÚels      r   Úextract_titler<   :   sT   € Ø&ò +ˆØ�_‰_˜SÓ!ˆÚ�!”s˜2Ÿ;™;¨T˜;Ó2Ó3Ô:°sÖ:Ø—;‘; T�;Ó*Ò*ð+ð r   c                 ó^  — t        |«      D ]_  }	 |j                  | t        d¬«      }d|_        |j                  dk(  r.t        |j                  d«      }t        |«      t        |«      fc S Œa y# t        j                  $ r*}||dz
  k  rt        j                  d|z  «       Y d }~Œ›d }~ww xY w)	Né<   ©Úheadersr	   úutf-8r7   úhtml.parseré   é   )r%   r%   )Úranger*   ÚHEADERSÚencodingÚstatus_coder   Útextr1   r<   ÚrequestsÚRequestExceptionÚtimeÚsleep)ÚurlÚsessionÚretriesÚattemptÚrr/   Úes          r   Ú
get_detailrT   A   s¥   € Ü˜“>ò 	)ˆð	)Ø—‘˜C¬¸"�Ó=ˆAØ ˆAŒJØ�}‰} Ò#Ü$ Q§V¡V¨]Ó;�Ü& tÓ,¬m¸DÓ.AÐAÒAð $ð		)ð øô ×(Ñ(ò 	)Ø˜ 1™Ò$Ü—
‘
˜1 ™<Ô(ÿøð	)ús   �AA/Á/B,Â B'Â'B,c                 ó¦  — g }	 |j                  | t        d¬«      }d|_        |j                  dk7  r|S 	 t        |j                  d«      }|j                  dd¬«      D ]ß  }|d	   }d
|vrŒ|j                  dd¬«      }d}|rL|j                  d«      }	t        |	«      dk\  r-|	d   j                  d¬«      }
t        j                  d|
«      r|
}|j                  d¬«      }|rt        |«      dk  sd|v rŒ—|j                  d«      r|n!|j                  d«      rd|z   nt        | |«      }|j                  |||f«       Œá |S # t        $ r |cY S w xY w)Nr>   r?   rA   r7   rB   ÚaT)ÚhrefrW   zcontent/post_r0   z
conts-list)Úclass_r%   ÚspanrD   éÿÿÿÿr5   z\d{4}-\d{2}-\d{2}r4   u	   ç©—å¥½åŠžr&   ú/r'   )r*   rF   rG   rH   Ú	Exceptionr   rI   r)   Úfind_parentr8   r9   ÚreÚmatchr+   r   Úappend)rN   rO   ÚresultsrR   r/   rV   ÚhÚ	date_spanÚdate_strÚspansÚdsr   Ú
detail_urls                r   Úparse_list_pagerh   N   sj  € Ø€GðØ�K‰K˜¤W°bˆKÓ9ˆØˆŒ
Ø�=‰=˜CÒØˆNð  ô ˜Ÿ™ Ó/€DØ�]‰]˜3 Tˆ]Ó*ò 6ˆØˆf‰IˆØ !Ñ#ØØ—M‘M %°�MÓ=ˆ	ØˆÙØ×&Ñ& vÓ.ˆEÜ�5‹z˜QŠØ˜2‘Y×'Ñ'¨dÐ'Ó3�Ü—8‘8Ð0°"Ô5Ø!�HØ—
‘
 �
Ó&ˆÙœ˜E›
 Qš¨+¸Ñ*>ØØŸ,™, vÔ.‘QÐUV×UaÑUaÐbeÔUfÐ4MÐPQÒ4QÔlsÐtwÐyzÓl{ˆ
Ø�‰˜˜z¨8Ð4Õ5ð!6ð" €Nøô) ò ØŠðús   „/E ÅEÅEc                  óJ  — t        «       } t        | «       t        j                  «       }|j                  j                  t        «       d}d}t        dt        dz   «      D �]  }|dk(  rt        nt        › d|› d�}t        ||«      }|st        d|› d�«        nè|D ]£  \  }}}	t        | |«      r|dz  }Œt        ||«      \  }
}|r|n|}t        |
xs dd«      j                  d	¬
«      }t!        |«      dk  r|dz  }Œbt#        | ||
||	«      r.|dz  }| j%                  «        t        d|› d|d d › d|	› d�«       ŒŸ|dz  }Œ¥ t        d|› dt        › dt!        |«      › d|› d|› d�«       t'        j(                  d«       �Œ! | j+                  «        t        d|› d|› d�«       y )Nr   rC   Úindex_z.htmlu     ç¬¬u   é¡µæ— æ–‡ç« ï¼Œç»“æ�Ÿr%   rB   Tr5   é   u     âœ“ [z] é(   z (ú)r[   u   é¡µ: u   æ�¡, ç´¯è®¡æ–°u
   æ�¡/è·³è¿‡u   æ�¡u   
âœ… å®Œæˆ�ï¼�æ–°å¢žu   æ�¡ï¼Œè·³è¿‡)r   r   rJ   ÚSessionr@   ÚupdaterF   rE   Ú	MAX_PAGESÚBASE_URLrh   Úprintr   rT   r   r9   r8   r!   r   rL   rM   Úclose)r   rO   Ú	total_newÚ
total_skipÚpagerN   ÚarticlesÚ
list_titlerg   rd   r   Úproper_titleÚfinal_titleÚcts                 r   Úcrawlr|   k   s¿  € Ü‹9€DÜ�ÔÜ×ÑÓ €GØ‡O�O×Ñœ7Ô#Ø€IØ€JÜ�aœ Q™Ó'ó ˆØ !š)�h¬H¨:°V¸D¸6ÀÐ)GˆÜ" 3¨Ó0ˆÙÜ�E˜$˜Ð4Ð5Ô6ÙØ08ò 	 Ñ,ˆJ˜
 HÜ˜$ 
Ô+Ø˜a‘�
ØÜ$.¨z¸7Ó$CÑ!ˆG�\Ù*6™,¸JˆKÜ˜wš}¨"¨mÓ<×EÑEÈDÐEÓQˆBÜ�2‹w˜Š|Ø˜a‘�
ØÜ˜$ ¨W°jÀ(ÔKØ˜Q‘�	Ø—‘”Ü˜ 	˜{¨"¨[¸¸"Ð-=Ð,>¸bÀÀ
È!ÐLÕMà˜a‘‘
ð	 ô  	��d�V˜1œY˜K u¬S°«]¨O¸>È)ÈÐT^Ð_iÐ^jÐjmÐnÔoÜ�
‰
�1Žð/ð0 	‡J�J„LÜ	Ð! ) ¨L¸¸ÀCÐ
HÕIr   Ú__main__)é   )Ú__doc__rJ   r^   r
   ÚosrL   Úbs4r   Úurllib.parser   rq   r   rF   Úgetenvr   rp   r   r   r   r!   r1   r<   rT   rh   r|   Ú__name__© r   r   ú<module>r†      s‘   ðñó
 Û 	Û Û 	Û Ý Ý  à7€Ø-€	ØÐvÐ
w€Ø
ˆ"�)‰)�KÐ!2Ó
3€Ø€	òòò&òò
òóòò: JðD ˆzÒÙ	…Gð r   