Ë
    ¸¬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mZ ddlm	Z	 dZ
e
dz   ZdZdZd	d
ddœZd„ Zdd„Zd„ Zd„ Zd„ Zdd„Zedk(  r/ eej.                  «      dkD  rej.                  d   ndZ ee«       yy)u  æ¼³å·žå�¤é›·æ¸¯ç»�æµŽå¼€å�‘åŒº - å…¬ç¤ºå…¬å‘Šçˆ¬è™«
ç«™ç‚¹: www.zhangzhou.gov.cn
æ �ç›®: zzglkfq/gsgg (å…¬ç¤ºå…¬å‘Š)
CMS: YL CMS - ä»…ç¬¬ä¸€é¡µé�™æ€�HTMLå�¯è®¿é—®ï¼Œåˆ†é¡µè¢«CloudWAFå°�é”�
ç­–ç•¥: æ¯�æ¬¡å�ªæŠ“ç¬¬ä¸€é¡µ(æœ€æ–°20æ�¡)ï¼Œæ—¥è·‘å¢žé‡�æ£€æŸ¥æ–°æ–‡ç« 
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoupzhttps://www.zhangzhou.gov.cnz!/cms/html/zzglkfq/gsgg/index.htmlz/root/search.dbzzhangzhou.gov.cnzoMozilla/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,image/avif,image/webp,image/apng,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagec                  ó¾   — t        j                  t        «      } | j                  d«       | j                  d«       | j                  d«       | j	                  «        | S )NzPRAGMA journal_mode=WALai  
        CREATE TABLE IF NOT EXISTS gov_raw (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            site_name TEXT NOT NULL,
            page_url TEXT UNIQUE NOT NULL,
            title TEXT NOT NULL,
            pub_date TEXT,
            summary TEXT,
            content TEXT,
            crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )
    zACREATE INDEX IF NOT EXISTS idx_gov_raw_site ON gov_raw(site_name))Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcommit)Úconns    ú$/root/gov_crawler/crawl_zhangzhou.pyÚinit_dbr      sK   € Ü�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�Lð ô 	ð 	‡L�LÐTÔUØ‡K�K„MØ€Kó    c                 ó  — 	 t        j                  | t        |d¬«      }d|_        |j                  dk(  r|j
                  S t        d|j                  › d| › �«       y # t        $ r}t        d| › d|› �«       Y d }~y d }~ww xY w)	NF)ÚheadersÚtimeoutÚverifyzutf-8éÈ   z  HTTP z for z  Error fetching z: )ÚrequestsÚgetÚHEADERSÚencodingÚstatus_codeÚtextÚprintÚ	Exception)Úurlr   ÚrespÚes       r   Ú
fetch_pager!   /   s‚   € ð	Ü�|‰|˜C¬¸'È%ÔPˆØˆŒØ×Ñ˜sÒ"Ø—9‘9ÐÜ�˜×(Ñ(Ð)¨¨s¨eÐ4Ô5ØøÜò ÜÐ! #  b¨¨Ð,Ô-Üûðús   ‚>A ÁA Á	BÁ&A<Á<Bc                 óô  — g }t        | d«      }|j                  dd¬«      }|st        d«       |S |j                  dd¬«      D ]±  }|j                  d	«      }|j                  d
d¬«      }|r|j	                  d«      sŒ;|j	                  dd«      j                  «       }|j                  d«      s	t        |z   }|j                  d¬«      }|r|j                  d¬«      nd}	|j                  |||	dœ«       Œ³ |S )u3   è§£æž�åˆ—è¡¨é¡µï¼Œæ��å�–æ–‡ç« URLã€�æ ‡é¢˜ã€�æ—¥æœŸúhtml.parserÚulÚ	resources©Úidz!  WARNING: resources UL not foundÚliF)Ú	recursiveÚaÚspanz	list-time©Úclass_ÚhrefÚ ÚhttpT©Ústrip)r   ÚtitleÚpub_date)
r   Úfindr   Úfind_allr   r2   Ú
startswithÚBASE_URLÚget_textÚappend)
ÚhtmlÚitemsÚsoupr$   r(   ÚlinkÚ	date_spanr.   r3   r4   s
             r   Ú
parse_listr@   ;   sø   € à€EÜ˜˜}Ó-€DØ	�‰�4˜KˆÓ	(€BÙÜÐ1Ô2Øˆà�k‰k˜$¨%ˆkÓ0ò ˆØ�w‰w�s‹|ˆØ—G‘G˜F¨;�GÓ7ˆ	Ù˜4Ÿ8™8 FÔ+ØØ�x‰x˜ Ó#×)Ñ)Ó+ˆØ�‰˜vÔ&Ü˜d‘?ˆDØ—‘ D�Ó)ˆÙ5>�9×%Ñ%¨DÐ%Ô1ÀBˆØ�‰ØØØ ñ
õ 	ðð €Lr   c                 óæ  ‡— t        | d«      }|j                  dd¬«      }|r|j                  d¬«      nd}|j                  dd¬	«      }d
}|rt        |«      }|rÏ|j	                  ddg«      D ]  }|j                  «        Œ t        |«      }t        j                  dd
|t        j                  ¬«      }t        |d«      }	|	j                  dd¬«      }
t        j                  dd|
«      }
dj                  d„ |
j                  d«      D «       «      }
t        j                  dd|
«      }
nd
}
g }|r¦|j	                  dd¬«      D ]�  }|d   Št        j                  d‰t        j                  «      sŒ.‰j                  d«      s	t        ‰z   Š|j                  d¬«      xs t        j                   j#                  ‰«      }‰}|j%                  ||dœ«       Œ’ |j	                  dd¬«      D ]¨  }|d   Šd‰v sŒt        j                  d‰t        j                  «      sŒ3‰j                  d«      s	t        ‰z   Št'        ˆfd„|D «       «      rŒb|j                  d¬«      xs t        j                   j#                  ‰«      }|j%                  |‰dœ«       Œª d
}|j	                  d«      }|D ]?  }|j                  d¬«      }t        j                  d|«      }|sŒ.|j)                  d «      } n ||
|||d!œS )"u*   è§£æž�è¯¦æƒ…é¡µï¼šæ ‡é¢˜ã€�æ­£æ–‡ã€�é™„ä»¶r#   Údivzcontent-titler,   Tr1   u	   æ— æ ‡é¢˜ÚContentr&   r/   ÚscriptÚstylez(</?(?:b|font|span|strong|em|u|i|a)[^>]*>)Úflagsz

)Ú	separatorr2   z\n{4,}ú
c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­w)Nr1   )Ú.0Úlines     r   ú	<genexpr>zparse_detail.<locals>.<genexpr>s   s   è ø€ ÒI¨T˜DŸJ™JŸLÑIùs   ‚z\n{3,}r*   )r.   r.   z.\.(pdf|doc|docx|xls|xlsx|rar|zip|jpg|png|gif)$r0   )Únamer   z/attachments/z\.(pdf|doc|docx|xls|xlsx)$c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)r   N© )rJ   r*   r.   s     €r   rL   zparse_detail.<locals>.<genexpr>‹   s   øè ø€ Ò=¨A�q˜‘x 4Õ'Ñ=ùs   ƒr+   z(\d{4}-\d{2}-\d{2})é   )r3   ÚcontentÚcontent_htmlr4   Úattachments)r   r5   r9   Ústrr6   Ú	decomposeÚreÚsubÚ
IGNORECASEÚjoinÚsplitÚsearchÚIr7   r8   ÚosÚpathÚbasenamer:   ÚanyÚgroup)r;   r   r=   Útitle_elr3   Úcontent_divrR   ÚtagÚraw_htmlÚcontent_div_cleanrQ   rS   Úa_tagÚfnameÚfull_urlr4   Ú
date_spansr+   r   Úmr.   s                       @r   Úparse_detailrl   U   sÐ  ø€ ä˜˜}Ó-€Dð �y‰y˜ ˆyÓ7€HÙ-5ˆH×Ñ DÐÔ)¸;€Eð —)‘)˜E i�)Ó0€KØ€LÙÜ˜;Ó'ˆñ à×'Ñ'¨°7Ð(;Ó<ò 	ˆCØ�M‰M�Oð	ô
 �{Ó#ˆÜ—6‘6ÐEÀrÈ8Ô[]×[hÑ[hÔiˆä)¨(°MÓBÐØ#×,Ñ,°vÀTÐ,ÓJˆä—&‘&˜ F¨GÓ4ˆà—)‘)ÑI°W·]±]À4Ó5HÔIÓIˆä—&‘&˜ F¨GÓ4‰àˆð €KÙØ ×)Ñ)¨#°DÐ)Ó9ò 	EˆEØ˜‘=ˆDÜ�y‰yÐJÈDÔRT×RVÑRVÕWØ—‘ vÔ.Ü# d™?�DØŸ™¨T˜Ó2ÒL´b·g±g×6FÑ6FÀtÓ6L�Ø�Ø×"Ñ"¨E¸(Ñ#CÕDð	Eð —‘˜s¨�Ó.ò AˆØ�V‰}ˆØ˜dÒ"¤r§y¡yÐ1NÐPTÔVX×VZÑVZÕ'[Ø—?‘? 6Ô*Ü $‘�ÜÓ=°Ô=Õ=ØŸ™¨T˜Ó2ÒL´b·g±g×6FÑ6FÀtÓ6L�Ø×"Ñ"¨E¸$Ñ#?Õ@ðAð €HØ—‘˜vÓ&€JØò ˆØ�}‰} 4ˆ}Ó(ˆÜ�I‰IÐ,¨dÓ3ˆÚØ—w‘w˜q“zˆHÙðð ØØ$ØØ"ñð r   c                 óü   — | j                  dt        f«      }t        d„ |j                  «       D «       «      }|D �cg c]  }|d   |vsŒ|‘Œ }}t	        |«      t	        |«      z
  }|rt        d|› d�«       |S c c}w )u   åŽ»é‡�ï¼šæŽ’é™¤å·²å­˜åœ¨çš„URLz0SELECT page_url FROM gov_raw WHERE site_name = ?c              3   ó&   K  — | ]	  }|d    –— Œ y­w)r   NrO   )rJ   Úrows     r   rL   zdeduplicate.<locals>.<genexpr>¤   s   è ø€ Ò4˜c�3�q•6Ñ4ùs   ‚r   z
  Skipped z existing items)r   Ú	SITE_NAMEÚsetÚfetchallÚlenr   )r   r<   ÚcurÚexistingÚitÚnewÚskippeds          r   Údeduplicatery   ¡   sy   € à
�,‰,ÐIÌIÈ<Ó
X€CÜÑ4 S§\¡\£^Ô4Ó4€HØÖ
;�"  E¡°(Ò!:Š2Ð
;€CÐ
;Ü�%‹jœ3˜s›8Ñ#€GÙÜ�
˜7˜) ?Ð3Ô4Ø€Jùò	 <s   ¼A9Á	A9Úfullc                 óJ  — t        «       }t        dt        › d�«       t        t        «      }|st        d«       |j                  «        yt        |«      }t        dt        |«      › d�«       |s|j                  «        yt        j                  «       j                  d«      }t        j                  «       t        d¬	«      z
  j                  d«      }| d
k(  ra|D �cg c]  }|j                  d«      ||fv sŒ|‘Œ }}t        dt        |«      › d�«       |s"t        d|› d|› �«       |j                  «        yt        ||«      }t        dt        |«      › �«       |s|j                  «        yd}|D ]ä  }	t        d|	d   dd › d�«       t        |	d   «      }
|
sŒ)t        |
|	d   «      }|d   }|d   r!|dz  }|d   D ]  }|d|d   › d|d   › d�z  }Œ 	 |j                  dt        |	d   |	d   |d   xs |	d   |d   xs |	j                  dd«      |	d   dd  |f«       |j!                  «        |dz  }|d!z  dk(  rt        d"|› dt        |«      › �«       Œæ t        d$|› d%�«       |j                  «        yc c}w # t"        $ r}t        d#|› �«       Y d}~�Œ)d}~ww xY w)&u,   mode: 'full'=å…¨é‡�, 'incremental'=ä»…ä»Šå¤©ú[z] Fetching list page...z ERROR: Could not fetch list pageNz  Found z items on first pagez%Y-%m-%drP   )ÚdaysÚincrementalr4   z  After date filter: z itemsz  No new items for ú/z  New items to crawl: r   z  Fetching: r3   é2   z...r   rQ   rS   u   

---
é™„ä»¶:
z
[rM   z](ú)z±
                INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, summary, content)
                VALUES (?, ?, ?, ?, ?, ?, ?)
            r/   r   é   z    Progress: z    DB error: z
  Done! Added z new articles)r   r   rp   r!   ÚLIST_URLÚcloser@   rs   r   ÚnowÚstrftimer   r   ry   rl   r   r   r   )Úmoder   r;   r<   ÚtodayÚ	yesterdayrv   Ú	new_itemsÚaddedÚitemÚdetail_htmlÚdetailrQ   Úattr    s                  r   Úmainr�   «   sÖ  € ä‹9€Dä	ˆAŒiˆ[Ð/Ð
0Ô1Ü”hÓ€DÙÜÐ0Ô1Ø�
‰
ŒØä�tÓ€EÜ	ˆH”S˜“Z�LÐ 4Ð
5Ô6áØ�
‰
ŒØô �L‰L‹N×#Ñ# JÓ/€EÜ—‘“¤)°Ô"3Ñ3×=Ñ=¸jÓI€Iàˆ}ÒØ#ÖP˜ r§v¡v¨jÓ'9¸eÀYÐ=OÒ'O’ÐPˆÐPÜÐ%¤c¨%£j \°Ð8Ô9ÙÜÐ'¨ w¨a°	¨{Ð;Ô<Ø�J‰JŒLØô ˜D %Ó(€IÜ	Ð"¤3 y£>Ð"2Ð
3Ô4áØ�
‰
ŒØà€EØò "(ˆÜ�˜T '™]¨3¨BÐ/Ð0°Ð4Ô5Ü   e¡Ó-ˆÙØä˜k¨4°©;Ó7ˆð ˜Ñ#ˆØ�-Ò ØÐ+Ñ+ˆGØ˜mÑ,ò >�Ø˜S  V¡ ¨R°°E±
¨|¸1Ð=Ñ=‘ð>ð	(Ø�L‰Lð ô Ø�U‘Ø�U‘Ø�w‘Ò0 4¨¡=Ø�zÑ"Ò> d§h¡h¨z¸2Ó&>Ø�W‘˜d˜sÐ#Øðôð �K‰KŒMØ�Q‰JˆEØ�q‰y˜AŠ~Ü˜ u g¨Q¬s°9«~Ð.>Ð?Ô@øðA"(ôH 
Ð˜U˜G =Ð
1Ô2Ø‡J�J…Lùòk Qøôb ò 	(Ü�N 1 #Ð&×'Ò'ûð	(ús%   ÃI;Ã8I;ÇBJ Ê 	J"Ê	JÊJ"Ú__main__rP   )é   )rz   )Ú__doc__r   r   rV   Úsysr]   r   r   Úbs4r   r8   rƒ   r
   rp   r   r   r!   r@   rl   ry   r�   Ú__name__rs   Úargvr‡   rO   r   r   ú<module>r˜      s¤   ðñó Û Û 	Û 
Û 	ß (Ý à)€ØÐ9Ñ9€Ø
€Ø€	ð DØpØ0ñ€òó&
òò4JòXóLð\ ˆzÒÙ˜cŸh™h›-¨!Ò+ˆ3�8‰8�AŠ;°€DÙˆ…Jð r   