Ë
    ñµ£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dlZ ej                  «       Zej                  dedd¬«       ej#                  «       \  ZZej(                  dkD  rej(                  ne
Zd	Zd
ZdddœZ ej2                  d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)u1  
çˆ¬è™«ï¼šå¹¿å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - å»ºè®¾é¡¹ç›®çŽ¯è¯„å®¡æ‰¹å…¬å‘Š
ç«™ç‚¹ï¼šhttps://sthjj.gz.gov.cn/hjgl/jsxm/hpspgg/
CMSï¼šNFCMS (å¹¿ä¸œçœ�æ”¿åºœç½‘ç«™ç¾¤ç³»ç»Ÿ)
åˆ†é¡µï¼šindex_N.html (N=1~100)ï¼Œæ¯�é¡µ16æ�¡
ç»“æž„: <div class="conts-list"><span><a href="...">æ ‡é¢˜</a></span><span>æ—¥æœŸ</span></div>
é    N)ÚBeautifulSoup)Úurljoinéd   z--pagesu   é™�åˆ¶é¡µæ•°)ÚtypeÚdefaultÚhelpz)https://sthjj.gz.gov.cn/hjgl/jsxm/hpspgg/u   å¹¿å·žå¸‚-çŽ¯è¯„å®¡æ‰¹å…¬å‘Šz[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36zhttps://sthjj.gz.gov.cn/)z
User-AgentÚRefererÚ	SEARCH_DBz/root/search.dbc                  ó¢   — 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    úcrawl_gz_hpspgg.pyÚ_get_dbr   #   s>   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø‡L�LÐ,Ô-Ø€Kó    c                 óŠ   — | j                  d«       | j                  d«       | j                  d«       | j                  «        y )NaS  
        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%   ?   s5   € Ø‡L�LØoØ	�˜ \´9Ð=ôð ×Ñ˜AÒØØr   c                 ó2  — | j                  d«      }|�r|j                  d«      D ]{  }|j                  dd«      }|rU|j                  d«      sD|j                  d«      st	        t
        |«      n|}|j                  dj                  |«      «       Œl|j                  «        Œ} |j                  dd	¬
«      D ]S  }|d   }|sŒ|j                  d«      rŒ|j                  d«      rŒ/|j                  d«      rŒAt	        t
        |«      |d<   ŒU t        |«      S y)u)   ä»Žè¯¦æƒ…é¡µæ��å�–æ­£æ–‡ - NFCMSå¹¿å·žç«™z	#logPanelÚimgÚsrcÚ zdata:Úhttpz<img src="{}">ÚaT)Úhrefr,   ú#Ú
javascript)
Ú
select_oneÚfind_allÚgetÚ
startswithr   ÚBASE_URLÚreplace_withÚformatÚ	decomposeÚstr)ÚsoupÚdivr'   r(   Úimg_urlÚa_tagÚhs          r   Úextract_contentr=   H   sõ   € ð �/‰/˜+Ó
&€CÚ
à—<‘< Ó&ò 	 ˆCØ—'‘'˜% Ó$ˆCÙ˜3Ÿ>™>¨'Ô2Ø8;¿¹ÀvÔ8Nœ'¤(¨CÔ0ÐTW�Ø× Ñ Ð!1×!8Ñ!8¸Ó!AÕBà—‘•ð	 ð —\‘\ #¨D�\Ó1ò 	5ˆEØ�f‘ˆAÚ˜Ÿ™ fÕ-°a·l±lÀ3Õ6GÐPQ×P\ÑP\Ð]iÕPjÜ '¬°!Ó 4��f’ð	5ô �3‹xˆØr   c                 ó  — t        |«      D ]¶  }	 |j                  | t        d¬«      }d|_        |j                  dk(  r…t        |j                  d«      }t        |«      }d}dD ]W  }t        j                  ||j                  «      }	|	sŒ&|	j                  d«      j                  d	d
«      j                  dd
«      } n ||fc S Œ¸ y# t        j                  $ r*}
||dz
  k  rt        j                  d|z  «       Y d}
~
Œòd}
~
ww xY w)u   èŽ·å�–è¯¦æƒ…é¡µå†…å®¹é<   ©Úheadersr   úutf-8éÈ   úhtml.parserr)   )z(\d{4}-\d{2}-\d{2})u6   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}[-/\.]\d{1,2}[-/\.]\d{1,2})u6   å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}[-/\.]\d{1,2}[-/\.]\d{1,2})é   ú/ú-ú.é   N)r)   r)   )Úranger1   ÚHEADERSÚencodingÚstatus_coder   Útextr=   ÚreÚsearchÚgroupÚreplaceÚrequestsÚRequestExceptionÚtimeÚsleep)ÚurlÚsessionÚretriesÚattemptÚrr8   r#   Údate_strÚpÚmÚes              r   Ú
get_detailr`   ]   s  € ä˜“>ò )ˆð	)Ø—‘˜C¬¸"�Ó=ˆAØ ˆAŒJØ�}‰} Ò#Ü$ Q§V¡V¨]Ó;�Ü)¨$Ó/�ð �ðò �Aô
 Ÿ	™	 ! Q§V¡VÓ,�AÚØ#$§7¡7¨1£:×#5Ñ#5°c¸3Ó#?×#GÑ#GÈÈSÓ#Q˜Ùðð  Ð(Ò(ð! $ð	)ð0 øô ×(Ñ(ò 	)Ø˜ 1™Ò$Ü—
‘
˜1 ™<Ô(ÿøð	)ús   �A8CÂ	7CÃDÃ C>Ã>Dc                 ó¾  — g }	 |j                  | t        d¬«      }d|_        |j                  dk7  r|S 	 t        |j                  d«      }|j                  d«      D ]í  }|j                  d«      }t        |«      dk  rŒ#|d	   j                  d
«      }|r|j                  d«      sŒK|d   }d|vrŒU|j                  d¬«      }	|	rt        |	«      dk  sd|	v rŒ||j                  d«      r|nt        | |«      }
t        |«      dkD  r|d   j                  d¬«      nd}|rt        j                  d|«      sd}|j!                  |	|
|f«       Œï |S # t        $ r |cY S w xY w)u9   è§£æž�åˆ—è¡¨é¡µï¼Œè¿”å›ž [(title, detail_url, date), ...]r?   r@   rB   rC   rD   zdiv.conts-listÚspanrI   r   r+   r,   zcontent/post_T©Ústripé   u	   ç©—å¥½åŠžr*   rE   r)   z\d{4}-\d{2}-\d{2})r1   rK   rL   rM   Ú	Exceptionr   rN   Úselectr0   ÚlenÚfindÚget_textr2   r   rO   ÚmatchÚappend)rW   rX   Úresultsr[   r8   r9   Úspansr+   r,   r"   Ú
detail_urlr\   s               r   Úparse_list_pagerp   y   se  € à€GðØ�K‰K˜¤W°bˆKÓ9ˆØˆŒ
Ø�=‰=˜CÒØˆNð  ô
 ˜Ÿ™ Ó/€Dð �{‰{Ð+Ó,ò 6ˆØ—‘˜VÓ$ˆÜˆu‹:˜Š>ØØ�!‰H�M‰M˜#ÓˆÙ˜Ÿ™˜fœØØ�‰yˆØ $Ñ&ØØ—
‘
 �
Ó&ˆÙœ˜E›
 Qš¨+¸Ñ*>Øà!Ÿ_™_¨VÔ4‘T¼'À#ÀtÓ:Lˆ
Ü47¸³JÀ²N�5˜‘8×$Ñ$¨4Ð$Ô0ÈˆÙœBŸH™HÐ%9¸8ÔDØˆHà�‰˜˜z¨8Ð4Õ5ð'6ð* €Nøô7 ò ØŠðús   „/E ÅEÅEc            
      óÞ  — t        «       } t        | «       t        j                  «       }|j                  j                  t        «       d}d}t        dt        dz   «      D �][  }|dk(  rt        }ndj                  |«      }t        ||«      }|st        dj                  |«      «        �n|D ]Ë  \  }}}	t        | |«      r|dz  }Œt        ||«      \  }
}|s|	r|	}t        |
xs dd«      j!                  d¬«      }t#        |«      d	k  r#t        d
j                  |d d «      «       |dz  }Œt%        | ||
||«      r9|dz  }| j'                  «        t        dj                  ||d d |xs d«      «       ŒÇ|dz  }ŒÍ t        dj                  |t        t#        |«      ||«      «       t)        j*                  d«       �Œ^ | j-                  «        t        dj                  ||||z   «      «       y )Nr   rE   z6https://sthjj.gz.gov.cn/hjgl/jsxm/hpspgg/index_{}.htmlu"     ç¬¬{}é¡µæ— æ–‡ç« ï¼Œé‡‡é›†ç»“æ�Ÿr)   rD   Trc   é   u      âš  å†…å®¹è¿‡çŸ­: {}... è·³è¿‡r   u     âœ“ [{}] {} ({})é(   u	   æ— æ—¥æœŸu0     ç¬¬{}/{}é¡µ: {}æ�¡, ç´¯è®¡æ–°{}æ�¡/è·³è¿‡{}æ�¡u8   
âœ… é‡‡é›†å®Œæˆ�ï¼�æ–°å¢ž{}æ�¡ï¼Œè·³è¿‡{}æ�¡ï¼Œå…±{}æ�¡)r   r   rS   ÚSessionrA   ÚupdaterK   rJ   Ú	MAX_PAGESr3   r5   rp   Úprintr   r`   r   rj   rh   r%   r   rU   rV   Úclose)r   rX   Ú	total_newÚ
total_skipÚpagerW   Úarticlesr"   ro   r\   r#   Údetail_dateÚcontent_texts                r   Úcrawlr   ž   sß  € Ü‹9€DÜ�Ôä×ÑÓ €GØ‡O�O×Ñœ7Ô#à€IØ€Jä�aœ Q™Ó'ó "ˆØ�1Š9Ü‰CàJ×QÑQÐRVÓWˆCä" 3¨Ó0ˆÙÜÐ6×=Ñ=¸dÓCÔDÚà+3ò 	 Ñ'ˆE�:˜xÜ˜$ 
Ô+Ø˜a‘�
Øä#-¨j¸'Ó#BÑ ˆG�[Ù¡8Ø&�ä(¨ª°B¸ÓF×OÑOÐVZÐOÓ[ˆLÜ�<Ó  2Ò%ÜÐ8×?Ñ?ÀÀcÀrÀ
ÓKÔLØ˜a‘�
Øä˜$  w°
¸KÔHØ˜Q‘�	Ø—‘”ÜÐ*×1Ñ1°)¸UÀ3ÀB¸ZÈÒIcÐXcÓdÕeà˜a‘‘
ð)	 ô, 	Ð@×GÑGÈÌiÔY\Ð]eÓYfÐhqÐs}Ó~ÔÜ�
‰
�1ŽðE"ðH 	‡J�J„LÜ	Ð
E×
LÑ
LÈYÐXbÐdmÐnxÑdxÓ
yÕzr   Ú__main__)é   )$Ú__doc__rS   rO   r   ÚosrU   Úbs4r   Úurllib.parser   ÚMAX_PAGES_DEFAULTÚargparseÚ_APÚArgumentParserÚ
_AP_PARSERÚadd_argumentÚintÚparse_known_argsÚ_AP_ARGSÚ_Úpagesrv   r3   r    rK   Úgetenvr   r   r   r   r%   r=   r`   rp   r   Ú__name__© r   r   ú<module>r”      sç   ðñó Û 	Û Û 	Û Ý Ý  ØÐ ó ØˆS×ÑÓ!€
Ø 
× Ñ ˜	¨°Q¸^Ð Ô LØ×)Ñ)Ó+�€ˆ!Ø&Ÿn™n¨qÒ0ˆH�NŠNÐ6G€	à6€Ø*€	àoØ)ñ€ð ˆ"�)‰)�KÐ!2Ó
3€òòò"&òòó*ò8#òJ/{ðb ˆzÒÙ	…Gð r   