Ë
    ¸¬uj  ã                   óz  — 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 e	ej                  «      dkD  r2ej                  d   j                  «       r eej                  d   «      ndZe� ed ee«      z   «       dZdZ ej$                  dd«      Zd	d
ddœZdZdZd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u  Crawler for æ±Ÿé—¨å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - é€šçŸ¥å…¬å‘Š


URL: https://www.jiangmen.gov.cn/bmpd/jmssthjj/zwgk/tzgg/
Pattern: Static HTML pagination (index.html, index_2.html, ... index_20.html)
Content: <div id="zoomcon"> with full HTML (tables, paragraphs, attachments)
é    Né   z[AutoPg] max_pages=z3https://www.jiangmen.gov.cn/bmpd/jmssthjj/zwgk/tzggu%   æ±Ÿé—¨å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-é€šçŸ¥å…¬å‘ŠÚ	SEARCH_DBz/root/search.dbzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Language)g333333Ó?g      à?é   c                 óP   — t        dt        j                  d«      › d| › �d¬«       y )Nú[z%H:%M:%Sz] T)Úflush)ÚprintÚtimeÚstrftime)Úmsgs    ú#/root/gov_crawler/crawl_jiangmen.pyÚlogr   "   s#   € Ü	ˆAŒd�m‰m˜JÓ'Ð(¨¨3¨%Ð
0¸Ö=ó    c                 óæ  — | dk(  r
t         › d�}nt         › d| › d�}	 t        j                  |t        d¬«      }d|_        |j                  }t        j                  d|t        j                  «      }g }|D ]P  \  }}}	|j                  d«      r|}
nd|› �}
|j                  |
|j                  «       |	j                  «       dœ«       ŒR |S # t
        $ r}t        d| › d	|› �«       g cY d
}~S d
}~ww xY w)z6Crawl a list page and extract article URLs + metadata.r   z/index.htmlz/index_z.htmlé   ©ÚheadersÚtimeoutúutf-8zERROR fetching list page ú: NzO<li><a href="([^"]*)"[^>]*title="([^"]*)"[^>]*>.*?</a><span>([^<]+)</span></li>Úhttpzhttps://www.jiangmen.gov.cn)ÚurlÚtitleÚdate)ÚBASE_URLÚrequestsÚgetÚHEADERSÚencodingÚ	Exceptionr   ÚtextÚreÚfindallÚDOTALLÚ
startswithÚappendÚstrip)Úpager   ÚrÚeÚhtmlÚitemsÚresultsÚhrefr   Údate_strÚfull_urls              r   Ú
crawl_listr2   &   s  € àˆq‚yÜ�
˜+Ð&‰ä�
˜' $  uÐ-ˆðÜ�L‰L˜¤g°rÔ:ˆØˆŒ
ð
 �6‰6€Dô �J‰JØZØÜ
�	‰	ó€Eð €GØ!&ò Ñˆˆe�Xà�?‰?˜6Ô"Ø‰Hà4°T°FÐ;ˆHà�‰ØØ—[‘[“]Ø—N‘NÓ$ñ
õ 	ðð €Nøô7 ò ÜÐ'¨ v¨R°¨sÐ3Ô4Ø�	ûðús   �#C
 Ã
	C0ÃC+Ã%C0Ã+C0c                 ó²  — 	 t        j                  | t        d¬«      }d|_        |j                  }t        j                  d|«      }t        j                  d	|«      }t        j                  d
|«      }|r|j                  d«      j                  «       nd}|r"|j                  d«      j                  «       dd nd}|r|j                  d«      j                  «       nd}	t        j                  d|«      }
|
s|||	dfS |
j                  «       }|j                  d|«      }|dk(  r|||	dfS d}|dz   }|t        |«      k  re|dkD  r`|||dz    dk(  r|dz  }|dz  }n6|||dz    dk(  r&|dz   t        |«      k  r||dz      dv r|dz  }|dz  }n|dz  }|t        |«      k  r|dkD  rŒ`|||dz    }|||	|fS # t        $ r}t        d| › d|› �«       Y d}~yd}~ww xY w)z-Crawl a detail page and extract full content.r   r   r   zERROR fetching detail r   N)NNNz+<meta name="ArticleTitle" content="([^"]*)"z&<meta name="PubDate" content="([^"]*)"z,<meta name="ContentSource" content="([^"]*)"r   Ú é
   zid="zoomcon"ú>éÿÿÿÿr   é   z</div>é   z<div)ú r6   ú
ú	úú'ú")r   r   r   r    r!   r   r"   r#   ÚsearchÚgroupr(   ÚstartÚfindÚlen)r   r*   r+   r,   Útitle_mÚdate_mÚsrc_mr   Úpub_dateÚsourceÚmrB   Úgt_posÚdepthÚiÚcontents                   r   Úcrawl_detailrO   N   sû  € ð Ü�L‰L˜¤g°rÔ:ˆØˆŒ
ð
 �6‰6€Dô �i‰iÐFÈÓM€GÜ�Y‰YÐ@À$ÓG€FÜ�I‰IÐEÀtÓL€Eá(/ˆG�M‰M˜!Ó×"Ñ"Ô$°R€EÙ/5ˆv�|‰|˜A‹×$Ñ$Ó& s¨Ñ+¸2€HÙ',ˆU�[‰[˜‹^×!Ñ!Ô#°"€Fô 	�	‰	�/ 4Ó(€AÙØ�h ¨Ð*Ð*à�G‰G‹I€Eà�Y‰Y�s˜EÓ"€FØ�‚|Ø�h ¨Ð*Ð*ð €EØ�‰
€AØ
Œc�$‹iŠ-˜E AšIØ��!�A‘#ˆ;˜(Ò"Ø�Q‰JˆEØ�‰F‰AØ�!�A�a‘Cˆ[˜FÒ" q¨1¡u¬s°4«yÒ'8¸TÀ!ÀAÁ#¹YÐJpÑ=pØ�Q‰JˆEØ�‰F‰Aà�‰FˆAð Œc�$‹iŠ-˜E A›Ið �5˜˜1™ˆo€GØ�(˜F GÐ+Ð+øôS ò  ÜÐ$ S E¨¨A¨3Ð/Ô0Üûð ús   ‚#F2 Æ2	GÆ;GÇGc                 óÌ  — t        j                  t        d¬«      }|j                  d«       |j                  d«       |j	                  «       }d}| D ]B  }	 |j                  dt
        |d   |d   |d	   |d
   |d   f«       |j                  dkD  r|dz  }ŒD |j                  «        |j                  «        |S # t        $ r!}t        d|d   dd › d|› �«       Y d}~ŒŒd}~ww xY w)z(Insert crawled items into production DB.é<   )r   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=5000r   zžINSERT OR IGNORE INTO gov_raw 
                   (site_name, title, page_url, publish_date, source_url, content)
                   VALUES (?, ?, ?, ?, ?, ?)r   r   r   rI   rN   r   zERROR inserting Nr   )Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚ	SITE_NAMEÚrowcountr!   r   ÚcommitÚclose)r-   ÚconnÚcurÚinsertedÚitemr+   s         r   Ú
save_to_dbr_      sö   € ä�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ+Ô,Ø
�+‰+‹-€Cà€HØò <ˆð	<Ø�K‰Kð0ô Ø˜‘MØ˜‘KØ˜‘LØ˜‘NØ˜‘Oðô	ð �|‰|˜aÒØ˜A‘�øð!<ð( 	‡K�K„MØ‡J�J„LØ€Oøô ò 	<ÜÐ" 4¨¡;¨s°Ð#3Ð"4°B°q°cÐ:×;Ñ;ûð	<ús   Á?B9Â9	C#ÃCÃC#c                  óê  — t        dt        › �«       t        dt        › �«       g } t        dt	        t
        t        xs t
        «      dz   «      D �]Z  }t        d|› dt
        › d�«       t        |«      }|st        d|› d�«        �n%t        d	t        |«      › d
�«       g }t        |«      D ]³  \  }}t        j                  t        j                  t        Ž «       t        |d   «      }|€Œ@|\  }}}	}
|j!                  |d   |xs |d   |xs |d   |	xs t        j#                  dd«      |
xs ddœ«       |dz   dz  dk(  sŒ—t        d|dz   › dt        |«      › �«       Œµ |s�Œt%        |«      }| j!                  t        |«      «       t        d|› dt        |«      › d|› d�«       �Œ] t'        | «      }t        d«       t        dt        | «      › �«       t        d|› �«       t        d«       y )NzStarting crawl for zDB: r   zPage ú/z...z  No articles found on page z
, stoppingz  Found z	 articlesr   r   r   u   -é€šçŸ¥å…¬å‘Šr4   )r   r   r   rI   rN   r5   r   z	  Detail z  Saved z new items (page ú)z
=== SUMMARY ===zTotal pages crawled: zTotal items saved: zDone!)r   rW   rT   ÚrangeÚminÚ	MAX_PAGESÚ_MAX_PGr2   rD   Ú	enumerater   ÚsleepÚrandomÚuniformÚDELAYrO   r'   Úreplacer_   Úsum)Ú	all_savedr)   ÚarticlesÚ
page_itemsrM   ÚartÚresultr   rH   rI   rN   ÚsavedÚtotals                r   Úmainru       sö  € ÜÐ
œi˜[Ð)Ô*Üˆ$ŒwˆiÐÔà€Iä�aœœY¬Ò(<´9Ó=¸aÑ?Ó@ó !NˆÜˆe�D�6˜œ9˜+ SÐ)Ô*Ü˜dÓ#ˆáÜÐ.¨t¨f°JÐ?Ô@Úäˆh”s˜8“}�o YÐ/Ô0Øˆ
ä Ó)ò 	7‰FˆAˆsÜ�J‰J”v—~‘~¤uÐ-Ô.Ü! # e¡*Ó-ˆFØˆ~Øà/5Ñ,ˆE�8˜V WØ×ÑØ˜5‘zØÒ. # g¡,Ø Ò/ C¨¡KØ ÒJ¤I×$5Ñ$5°oÀrÓ$JØ"š= bñô ð �A‘˜‰|˜qÓ Ü�i  !¡˜u A¤c¨(£m _Ð5Õ6ð!	7ó& Ü˜zÓ*ˆEØ×ÑœS ›_Ô-Ü�(˜5˜' ¤3 z£?Ð"3Ð3DÀTÀFÈ!ÐLÖMðC!NôF �	‹N€EÜÐ
ÔÜÐ
¤ I£Ð/Ð0Ô1ÜÐ
˜e˜WÐ%Ô&Üˆ%…Mr   Ú__main__)Ú__doc__r   r#   rR   r   ri   ÚsysÚosÚ_SYSrD   ÚargvÚisdigitÚintrf   r
   Ústrr   rW   ÚgetenvrT   r   rk   re   r   r2   rO   r_   ru   Ú__name__© r   r   ú<module>r‚      sà   ðñó Û 	Û Û Û Û 
Û 	ã Ù" 4§9¡9›~°Ò1°d·i±iÀ±l×6JÑ6JÔ6L‰#ˆd�i‰i˜‰lÔ
ÐRV€Ø
ÐÙ	Ð
¡# g£,Ñ
.Ô/à@€Ø3€	Ø
ˆ"�)‰)�KÐ!2Ó
3€ð DØOØ0ñ€ð
 	€Ø€	ò>ò%òP.,òbòB-ð` ˆzÒÙ…Fð r   