Ë
    ¸¬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ZdZdZ	e	dz   Z
dZdZ ej                  «       Zde_        ej                   e_        d	„ Zd
„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)u§  
ä¸œæ¸¯å¸‚æ”¿åºœ - ç”Ÿæ€�çŽ¯å¢ƒé¢†åŸŸ (donggang.gov.cn)
CMS: è‡ªå®šä¹‰ PHP, JS åˆ†é¡µ (client-side only, 30æ�¡)
List: /dgszf/zfxxgk/fdzdgknr/zdly/sthjly/glist.html
  Container: ul > li > div.time (date) + div.name > a (title)
Detail: /html/DGSZF/{YYYYMM}/{id}.html
  Content: div.center-info (p paragraphs)
  Title: <title> (strip suffix)
  Date: YYYY-MM-DD from page
  No WAF, curl OK, 30 items on single page (2024-2026)
é    Nu   ä¸œæ¸¯å¸‚-ç”Ÿæ€�çŽ¯å¢ƒé¢†åŸŸzhttps://www.donggang.gov.cnz-/dgszf/zfxxgk/fdzdgknr/zdly/sthjly/glist.htmlz/root/search.dbz
2023-01-01Fc                 ó&  — t         j                  j                  | ddi¬«      }	 t         j                  j                  |dt        ¬«      }|j                  «       j                  dd¬«      S # t        $ r}t        d	| › d
|› �«       Y d }~y d }~ww xY w)Nz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36)Úheadersé   )ÚtimeoutÚcontextzutf-8Úreplace)Úerrorsz  [FETCH ERROR] ú: )	ÚurllibÚrequestÚRequestÚurlopenÚssl_ctxÚreadÚdecodeÚ	ExceptionÚprint)ÚurlÚreqÚrespÚes       ú(/root/gov_crawler/crawl_donggang_sthj.pyÚfetchr       s‹   € Ü
�.‰.×
 Ñ
  ØÐTð/Ð
 ó €CðÜ�~‰~×%Ñ% c°2¼wÐ%ÓGˆØ�y‰y‹{×!Ñ! '°)Ð!Ó<Ð<øÜò ÜÐ    R¨ sÐ+Ô,Üûðús   ¥AA, Á,	BÁ5BÂBc                 ó   — g }| j                  d«      }|dk  r|S | j                  d|«      }|dkD  r| ||dz    n| |d }d}t        j                  ||t        j                  «      D ]¥  }|j	                  d«      j                  «       }|j	                  d«      j                  «       }|j	                  d	«      j                  «       }	t        j                  d
d|	«      }	|j                  d«      s	t        |z   }|j                  ||	|dœ«       Œ§ |S )z'Parse list - extract items from ul > liz<ul style="display:block;">r   z</ul>é   Nzy<li>.*?<div class="time">(\d{4}-\d{2}-\d{2})</div>.*?<div class="name">.*?<a[^>]*href="([^"]*)"[^>]*title="([^"]*)"[^>]*>é   é   é   z^\[.*?\]\s*Ú Úhttp)r   ÚtitleÚdate)
ÚfindÚreÚfinditerÚDOTALLÚgroupÚstripÚsubÚ
startswithÚBASE_URLÚappend)
ÚhtmlÚitemsÚul_idxÚul_endÚul_htmlÚpatternÚmatchr"   Úhrefr!   s
             r   Ú
parse_listr5   ,   sý   € à€Eà�Y‰YÐ4Ó5€FØ�‚zØˆà�Y‰Y�w Ó'€FØ)/°!ªˆd�6˜& 1™*Ñ%¸¸f¸g¸€Gð K€GÜ—‘˜W g¬r¯y©yÓ9ò BˆØ�{‰{˜1‹~×#Ñ#Ó%ˆØ�{‰{˜1‹~×#Ñ#Ó%ˆØ—‘˜A“×$Ñ$Ó&ˆä—‘�~ r¨5Ó1ˆØ�‰˜vÔ&Ü˜d‘?ˆDØ�‰˜T¨E¸4Ñ@ÕAðBð €Ló    c                 óP  — d}t        j                  d| «      }|r:|j                  d«      }t        j                  dd|«      j	                  «       }|s|}d}t        j                  d| «      }|r|j                  d«      }d}| j                  d«      }|dk  r| j                  d«      }|dkD  �rs| j                  dd|«      }|dk  r|}| j                  d	|«      }	|	dk  r| j                  d
|«      }	|	dk  r| j                  d|«      }	|	dk  r|dz   }	| ||	 }
t        j                  dd|
t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|«      }t        j                  dd|«      }|j                  dd«      j                  dd«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      j	                  «       }|}|||dœS )zExtract title, date, contentr   z<title>(.*?)</title>r   u!   [-â€“â€”][^-â€“â€”]*-[^-â€“â€”]*$z(\d{4}-\d{2}-\d{2})zclass="center-info"r   z<divz<div class="info-bottom"zclass="wenjianfeizhi"z<div class="fl"i¸  z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z	<br\s*/?>ú
z</p>z

úz&nbsp;ú z<[^>]+>z[ \t]+z *\n *z\n{3,})r!   r"   Úcontent)	r$   Úsearchr'   r)   r(   r#   Úrfindr&   r   )r-   r!   ÚtmÚtr"   Údmr<   ÚidxÚstartÚendÚsectionÚtextÚcleans                r   Úparse_detailrH   D   sõ  € ð €EÜ	�‰Ð*¨DÓ	1€BÙ	Ø�H‰H�Q‹Kˆä—‘Ð;¸RÀÓC×IÑIÓKˆÙØˆEð €DÜ	�‰Ð)¨4Ó	0€BÙ	Ø�x‰x˜‹{ˆð €GØ
�)‰)Ð)Ó
*€CØ
ˆQ‚wØ�i‰iÐ-Ó.ˆØ
ˆQƒwØ—
‘
˜6 1 cÓ*ˆØ�1Š9˜c�eØ�i‰iÐ2°CÓ8ˆØ�Š7˜$Ÿ)™)Ð$;¸SÓA�CØ�Š7˜$Ÿ)™)Ð$5°sÓ;�CØ�Š7˜% $™,�Cà�u˜S�/ˆÜ�v‰vÐ2°B¸ÄrÇyÁyÔQˆÜ�v‰vÐ0°"°dÄ"Ç)Á)ÔLˆÜ�v‰v�l D¨$Ó/ˆÜ�v‰v�g˜v tÓ,ˆØ�|‰|˜D "Ó%×-Ñ-¨h¸Ó<ˆä—‘�z 2 tÓ,ˆÜ—‘�y # uÓ-ˆÜ—‘�y $¨Ó.ˆÜ—‘�y &¨%Ó0×6Ñ6Ó8ˆØˆà D°WÑ=Ð=r6   c                 ó(  — t        j                  t        d¬«      }|j                  «       }d}d}| D ]Œ  }|j	                  dd«      }|j	                  dd«      }|j	                  dd«      }|j	                  dd«      }	|	s|s|d	z  }ŒU	 |j                  d
||t        ||	||f«       |j                  dkD  r|d	z  }n|d	z  }ŒŽ |j                  «        |j                  «        ||fS # t        $ r#}
t        d|d d › d|
› �«       |d	z  }Y d }
~
ŒÚd }
~
ww xY w)Né   ©r   r   r!   r   r   r"   r<   r   a  
                INSERT OR IGNORE INTO gov_raw
                (title, page_url, site_name, publish_date, content, summary, attachments, source_url, date_rank)
                VALUES (?, ?, ?, ?, ?, '', '', ?, CAST(strftime('%s', ?) AS INTEGER))
            z  [DB ERROR] r
   )Úsqlite3ÚconnectÚDB_PATHÚcursorÚgetÚexecuteÚ	SITE_NAMEÚrowcountr   r   ÚcommitÚclose)r.   ÚconnÚcÚinsertedÚskippedÚitemr!   r   r"   r<   r   s              r   Úinsert_to_dbr[   s   s'  € Ü�?‰?œ7¨BÔ/€DØ�‰‹€AØ€HØ€GØò ˆØ—‘˜ "Ó%ˆØ�h‰h�u˜bÓ!ˆØ�x‰x˜ Ó#ˆØ—(‘(˜9 bÓ)ˆÙ™uØ�q‰LˆGØð	Ø�I‰Ið ð ˜œi¨¨w¸¸TÐBô	Dð
 �z‰z˜AŠ~Ø˜A‘‘à˜1‘�øð#ð* 	‡K�K„MØ‡J�J„LØ�WÐÐøô ò 	Ü�M %¨¨ * ¨R°¨sÐ3Ô4Ø�q‰L�Gûð	ús   Â7C%Ã%	DÃ.DÄDc            	      ó  — t        dt        › d�«       t        t        «      } | st        d«       y t	        | «      }t        dt        |«      › d�«       g }|D ]�  }|d   t        k  rt        d|d   › dt        › �«        nwt        d	|d   › d
|d   d d › d�«       t        |d   «      }|st        d«       Œ`t        |«      }|d   r|d   |d<   |d   r|d   |d<   |d   |d<   |j                  |«       ŒŸ |r�t        |«      \  }}t        d|› d|› d�«       t        d|› d|› �«       |dkD  rXt        j                  t        d¬«      }|j                  d«       |j                  «        |j                  «        t        d«       y y y )Nz[INFO] u	    - çˆ¬è™«z[ERROR] Cannot fetch listz  Found z itemsr"   z  [STOP] Date z < z    r;   r!   é2   z...r   z    [SKIP] Cannot fetch detailr<   z  [DB] +z new, z	 existingu   
[DONE] æ–°å¢ž: u
   , è·³è¿‡: r   rJ   rK   z4INSERT INTO gov_search(gov_search) VALUES('rebuild')zFTS rebuilt)r   rR   r   ÚLIST_URLr5   ÚlenÚCUTOFF_DATErH   r,   r[   rL   rM   rN   rQ   rT   rU   )	r-   r.   Ú	all_itemsrZ   Údetail_htmlÚdetailÚnewÚoldrV   s	            r   Úmainrf   ’   sž  € Ü	ˆG”I�;˜iÐ
(Ô)ä”‹?€DÙÜÐ)Ô*Øä�tÓ€EÜ	ˆH”S˜“Z�L Ð
'Ô(à€IØò ˆØ�‰<œ+Ò%Ü�N 4¨¡< .°´K°=ÐAÔBÙÜ��T˜&‘\�N ! D¨¡M°#°2Ð$6Ð#7°sÐ;Ô<Ü˜D ™KÓ(ˆÙÜÐ2Ô4ØÜ˜kÓ*ˆØ�'Š?¨F°7©O˜D ™MØ�&Š>¨&°©.˜4 ™<Ø  Ñ+ˆˆY‰Ø×Ñ˜Õðñ Ü 	Ó*‰ˆˆSÜ�˜˜˜V C 5¨	Ð2Ô3ÜÐ! #  j°°Ð6Ô7Ø�Š7Ü—?‘?¤7°BÔ7ˆDØ�L‰LÐOÔPØ�K‰KŒMØ�J‰JŒLÜ�-Õ ð ð	 r6   Ú__main__)Ú__doc__Úsysr$   ÚosrL   Úurllib.requestr   ÚsslrR   r+   r^   rN   r`   Úcreate_default_contextr   Úcheck_hostnameÚ	CERT_NONEÚverify_moder   r5   rH   r[   rf   Ú__name__© r6   r   ú<module>rs      s’   ðñ
ó Û 	Û 	Û Û Û 
ð +€	Ø(€ØÐEÑE€Ø
€Ø€à
$ˆ#×
$Ñ
$Ó
&€Ø€Ô Ø—m‘m€Ô ò	òò0,>ò^ò>$!ðN ˆzÒÙ…Fð r6   