Ë
    H«£j#8  ã                   ó&  — 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mZmZ ddl	Z	ddl
mZ ddlmZ ddlZdZe› d�Z ej"                  dd	«      Zd
ZdZdZdZddiZd„ Zdd„Zd„ Zefd„Z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$  
crawl_yueyang_tzgg.py - å²³é˜³å¸‚äººæ°‘æ”¿åºœ å…¬å‘Šå…¬ç¤º çˆ¬è™«
ç«™ç‚¹: yueyang.gov.cn/gggs/szbm/
ç¼–ç �: GB2312
åˆ—è¡¨: ul.news-list > li > a + span (æ—¥æœŸ), li.line è·³è¿‡
åˆ†é¡µ: default_0.htm ~ default_4.htm (5é¡µ, 15æ�¡/é¡µ)
è¯¦æƒ…: div.content#zoom, æ ‡é¢˜ h1.content-title
é™„ä»¶: <a href="...pdf|doc|docx|xls|xlsx">text</a>

ç”¨æ³•:
    python3 crawl_yueyang_tzgg.py              # å¢žé‡�çˆ¬å�– (7å¤©å†…)
    python3 crawl_yueyang_tzgg.py --full       # å…¨é‡�çˆ¬å�– (æœ€å¤š5é¡µ)
    python3 crawl_yueyang_tzgg.py --help       # å¸®åŠ©
é    N)ÚdatetimeÚ	timedelta©ÚBeautifulSoup)Úurljoinzhttps://www.yueyang.gov.cnz
/gggs/szbmÚ	SEARCH_DBz/root/search.dbu   å²³é˜³å¸‚-å…¬å‘Šå…¬ç¤ºu   æ¹–å�—é   é   z
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36c                 ó2   — t        dt        › d| › �d¬«       y )Nú[z] T)Úflush)ÚprintÚ	SITE_NAME)Úmsgs    úcrawl_yueyang_tzgg.pyÚlogr   2   s   € Ü	ˆAŒiˆ[˜˜3˜%Ð
 ¨Ö-ó    c           
      ó¢  — t        d|dz   «      D ]o  }	 t        j                  | t        d¬«      }d|_        |j
                  dk(  r|j                  c S |j
                  dk(  r yt        d|j
                  › d	| › �«       Œq y# t        j                  $ r8}t        d
|› d|› d|› �«       ||k  rt        j                  |«       Y d}~Œ¹d}~ww xY w)u"   æŠ“å�–é¡µé�¢ï¼Œè¿”å›ž decoded texté   é   )ÚheadersÚtimeoutÚgb2312éÈ   i”  NzHTTP z for u   è¯·æ±‚å¤±è´¥ (å°�è¯• ú/z): )ÚrangeÚrequestsÚgetÚHEADERSÚencodingÚstatus_codeÚtextr   ÚRequestExceptionÚtimeÚsleep)ÚurlÚretriesÚdelayÚattemptÚrespÚes         r   Úfetchr,   6   sÍ   € ä˜˜G a™KÓ(ò "ˆð	"Ü—<‘< ¬W¸bÔAˆDØ$ˆDŒMØ×Ñ 3Ò&Ø—y‘yÒ Ø×!Ñ! SÒ(Ùä�e˜D×,Ñ,Ð-¨U°3°%Ð8Õ9ð"ð øô	 ×(Ñ(ò 	"ÜÐ'¨ y°°'°¸#¸a¸SÐAÔBØ˜Ò Ü—
‘
˜5Ô!ÿøð	"ús#   ”=BÁBÁ%BÂCÂ.C	Ã	Cc                 óv   — | sy| j                  d«      s| j                  d«      r| S t        t        dz   | «      S )u   å°†ç›¸å¯¹URLè½¬ä¸ºç»�å¯¹URLÚ zhttp://zhttps://r   )Ú
startswithr   ÚCHANNEL_URL©Úhrefs    r   Úmake_abs_urlr3   I   s6   € áØØ‡��yÔ! T§_¡_°ZÔ%@ØˆÜ”; Ñ$ dÓ+Ð+r   c                 ó¸   — | sy	 t        j                  | j                  «       d«      }|t        j                  «       t	        |¬«      z
  k\  S # t
        $ r Y yw xY w)u$   æ£€æŸ¥æ—¥æœŸæ˜¯å�¦åœ¨æŒ‡å®šå¤©æ•°å†…Tz%Y-%m-%d)Údays)r   ÚstrptimeÚstripÚnowr   Ú
ValueError)Údate_strr5   Údts      r   Údate_in_ranger<   R   sS   € áØðÜ×Ñ˜xŸ~™~Ó/°Ó<ˆØ”X—\‘\“^¤i°TÔ&:Ñ:Ñ:Ð:øÜò Ùðús   …AA Á	AÁAc                 óØ  — ddl m}  |t        | «      d«      }|j                  d«      D ]P  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r t        j                  j                  ||«      n||d<   ŒR |j                  d«      D ]P  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r t        j                  j                  ||«      n||d	<   ŒR t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   r   úhtml.parserÚar2   r.   )ÚhttpÚ
javascriptú#ÚimgÚsrc)r@   z//zdata:)	Úbs4r   ÚstrÚfind_allr   r/   ÚurllibÚparser   )ÚtableÚbase_urlr   Útblr?   r2   rC   rD   s           r   Úhtml_table_to_htmlrM   ]   sÐ   € å!Ù
œ˜E›
 MÓ
2€CØ�\‰\˜#Óò SˆØ�u‰u�V˜RÓ ˆÚ˜Ÿ™Ð(CÕDÙ@HœŸ™×,Ñ,¨X°tÔ<ÈdˆAˆfŠIðSð �|‰|˜EÓ"ò RˆØ�g‰g�e˜RÓ ˆÚ�s—~‘~Ð&=Õ>Ù@HœŸ™×-Ñ-¨h¸Ô<ÈcˆC�ŠJðRô ˆs‹8€Or   c                 ó¢  — g }t        j                  dt         j                  «      }| j                  dd¬«      D ]y  }|d   j	                  «       }|j                  |«      sŒ(|j                  d¬«      xs t        j                  j                  |«      }t        |«      }|j                  ||dœ«       Œ{ |rt        j                  |d¬	«      S d
S )u6   ä»Žè¯¦æƒ…é¡µæ��å�–é™„ä»¶åˆ—è¡¨ï¼Œè¿”å›ž JSON å­—ç¬¦ä¸²z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$r?   Tr1   r2   ©r7   )Únamer&   F)Úensure_asciir.   )ÚreÚcompileÚIrG   r7   ÚsearchÚget_textÚosÚpathÚbasenamer3   ÚappendÚjsonÚdumps)ÚsouprK   ÚattachmentsÚext_patternÚa_tagr2   rP   Úfull_urls           r   Úextract_attachmentsrb   l   s¶   € à€KÜ—*‘*ÐBÄBÇDÁDÓI€KØ—‘˜s¨�Ó.ò @ˆØ�V‰}×"Ñ"Ó$ˆØ×Ñ˜dÕ#Ø—>‘>¨�>Ó-ÒG´·±×1AÑ1AÀ$Ó1GˆDÜ# DÓ)ˆHØ×Ñ¨°XÑ>Õ?ð@ñ ;FŒ4�:‰:�k°Ô6ÐMÈ2ÐMr   c                 ó,  — | j                  ddd¬«      }|s| j                  dd¬«      }|sdD ]  }| j                  |«      }|sŒ n |sy|j                  d«      D ],  }t        |«      }|j	                  t        d	|› d	�d
«      «       Œ. t        |«      S )uj   æ��å�–è¯¦æƒ…é¡µæ­£æ–‡ (div.content#zoom)ï¼Œä¿�ç•™ HTML ç»“æž„ï¼Œ
    å�Œæ—¶å°†è¡¨æ ¼è½¬ä¸º markdown æ ¼å¼�ÚdivÚcontentÚzoom)Úclass_Úid)rh   )zdiv.TRS_Editorzdiv.Custom_UnionStylezdiv.contentr.   rJ   ú
r>   )ÚfindÚ
select_onerG   rM   Úreplace_withr   rF   )r]   Úcontent_divÚselectorrJ   Úmd_tables        r   Úextract_content_htmlrp   y   s®   € ð —)‘)˜E¨)¸�)Ó?€KÙØ—i‘i ¨&�iÓ1ˆÙàRò 	ˆHØŸ/™/¨(Ó3ˆKÚÙð	ñ Øð ×%Ñ% gÓ.ò LˆÜ% eÓ,ˆà×Ñœ=¨2¨h¨Z°rÐ):¸MÓJÕKðLô ˆ{ÓÐr   c                 óp  — t        | d«      }g }|j                  dd¬«      }|s|}|j                  dd¬«      D �]y  }|j                  d«      rd	|j                  d«      xs g v rŒ-|j                  dg «      }t	        |t
        «      r|j                  «       }d	|v rŒd|j                  d
«      }|sŒx|j                  dd«      j                  «       }|j                  d«      xs |j                  d¬«      xs dj                  «       }|r|sŒÔt        |«      }	|j                  d«      }
d}|
rM|
j                  d¬«      }t        j                  d|«      }|r#|j                  d«      }|j                  dd«      }t        j                  dd|«      j                  «       }|j                  ||	|f«       �Œ| |S )u‚   
    è§£æž�åˆ—è¡¨é¡µï¼Œè¿”å›ž [(title, url, date_str), ...]
    ç»“æž„: ul.news-list > li > a + span (æ—¥æœŸ), li.line è·³è¿‡
    r>   Úulz	news-list©rg   ÚliF)Ú	recursiveÚclassÚliner?   r2   r.   ÚtitleTrO   Úspanz(\d{4}[-/]\d{1,2}[-/]\d{1,2})r   r   ú-ú\s+ú )r   rj   rG   r   Ú
isinstancerF   Úsplitr7   rV   r3   rR   rU   ÚgroupÚreplaceÚsubrZ   )Úhtmlr]   Úitemsrr   rt   Úli_classr`   r2   rx   ra   ry   r:   Ú
date_matchÚraws                 r   Úparse_list_pager‡   •   sœ  € ô
 ˜˜}Ó-€DØ€Eà	�‰�4 ˆÓ	,€BÙàˆà�k‰k˜$¨%ˆkÓ0ó %2ˆà�6‰6�'Œ?˜v¨"¯&©&°«/Ò*?¸RÑ@Øà—6‘6˜' 2Ó&ˆÜ�h¤Ô$Ø—~‘~Ó'ˆHØ�XÑØà—‘˜“ˆÙØà�y‰y˜ Ó$×*Ñ*Ó,ˆà—‘˜7Ó#ÒG u§~¡~¸D ~Ó'AÒGÀR×NÑNÓPˆÙ™DØä Ó%ˆð �w‰w�v‹ˆØˆÙØ—}‘}¨4�}Ó0ˆHäŸ™Ð#CÀXÓNˆJÙØ ×&Ñ& qÓ)�ØŸ;™; s¨CÓ0�ô —‘�v˜s EÓ*×0Ñ0Ó2ˆà�‰�e˜X xÐ0Ö1ðK%2ðN €Lr   c                 óÐ  — | s||ddfS t        | d«      }|}|j                  dd¬«      }|s|j                  d«      }|r9|j                  d¬«      }|r%t        j                  dd	|«      j                  «       }|}g d
¢}|D ]@  \  }	}
t        j                  |	| «      }|sŒ|j                  d«      j                  dd«      } n t        |«      }|sd}t        |t        «      }||||fS )uK   
    è§£æž�è¯¦æƒ…é¡µï¼Œè¿”å›ž (title, date, content, attachments_json)
    r.   r>   Úh1zcontent-titlers   TrO   r{   r|   ))uP   <meta[^>]*name=["\']?[Pp]ub[Ä�Ä‘]ate["\']?[^>]*content=["\']?(\d{4}-\d{2}-\d{2})N)zO<meta[^>]*name=["\']?dcterms.issued["\']?[^>]*content=["\']?(\d{4}-\d{2}-\d{2})N)u2   å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}[-/]\d{1,2}[-/]\d{1,2})N)u2   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}[-/]\d{1,2}[-/]\d{1,2})N)u,   æ—¥æœŸ[ï¼š:]\s*(\d{4}[-/]\d{1,2}[-/]\d{1,2})N)u,   æ—¶é—´[ï¼š:]\s*(\d{4}[-/]\d{1,2}[-/]\d{1,2})N)u4   (\d{4}[-/]\d{1,2}[-/]\d{1,2})\s*\d{1,2}[:ï¼š]\d{1,2}Nr   r   rz   )r   rj   rV   rR   r�   r7   rU   r   r€   rp   rb   ÚBASE_URL)r‚   Ú
list_titleÚ	list_dater]   rx   r‰   Útr:   Údate_patternsÚpatternÚ_Úmre   r^   s                 r   Úparse_detail_pager’   Î   s   € ñ Ø˜9 b¨"Ð,Ð,ä˜˜}Ó-€Dð €EØ	�‰�4 ˆÓ	0€BÙØ�Y‰Y�t‹_ˆÙ	Ø�K‰K˜dˆKÓ#ˆÙÜ—F‘F˜6 3¨Ó*×0Ñ0Ó2ˆEð €Hò
€Mð $ò ‰
ˆ�Ü�I‰I�g˜tÓ$ˆÚØ—w‘w˜q“z×)Ñ)¨#¨sÓ3ˆHÙð	ô # 4Ó(€GÙØˆô & d¬HÓ5€Kà�(˜G [Ð0Ð0r   c                  ó€   — t        j                  t        d¬«      } | j                  d«       | j                  d«       | S )u   èŽ·å�–æ•°æ�®åº“è¿žæŽ¥r   )r   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=30000)Úsqlite3ÚconnectÚDB_PATHÚexecute)Úconns    r   Úget_db_connectionr™     s1   € ä�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø€Kr   c                 óÆ  — 	 | j                  d|d   |d   |j                  dd«      |d   |j                  dd«      |j                  dd«      |j                  d	d«      |j                  d
d«      |j                  dd«      f	«       | j                  d«      j                  «       d   dkD  S # t        j                  $ r Y yt
        $ r}t        d|› �«       Y d}~yd}~ww xY w)uÂ   
    ä¿�å­˜ä¸€æ�¡è®°å½•åˆ° gov_raw è¡¨
    record = {
        "page_url", "title", "publish_date", "site_name",
        "group_name", "summary", "content", "attachments", "source_url"
    }
    zÀINSERT OR IGNORE INTO gov_raw
               (page_url, title, publish_date, site_name, group_name, summary, content, attachments, source_url)
               VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)Úpage_urlrx   Úpublish_dater.   Ú	site_nameÚ
group_nameÚsummaryre   r^   Ú
source_urlzSELECT changes()r   Fu   DB é”™è¯¯: N)r—   r   Úfetchoner”   ÚIntegrityErrorÚ	Exceptionr   )r˜   Úrecordr+   s      r   Ú
save_to_dbr¥   
  sâ   € ðØ�‰ð5ð �zÑ"Ø�w‘Ø—
‘
˜>¨2Ó.Ø�{Ñ#Ø—
‘
˜<¨Ó,Ø—
‘
˜9 bÓ)Ø—
‘
˜9 bÓ)Ø—
‘
˜=¨"Ó-Ø—
‘
˜<¨Ó,ð
ô		
ð  �|‰|Ð.Ó/×8Ñ8Ó:¸1Ñ=ÀÑAÐAøÜ×!Ñ!ò ÙÜò Üˆk˜!˜ÐÔÜûðús   ‚B(B+ Â+C Ã C ÃCÃC c                  ót  — dt         j                  v } dt         j                  v sdt         j                  v rt        t        «       y t	        d| rdnd› d�«       | st	        dt
        › d	�«       g }| rt        nd
}t        |«      D �]  }|dk(  r
t        › d�}nt        › d|› d�}t	        d|d
z   › d|› d|› �«       t        |«      }|st	        d|› d�«       ŒSt        |«      }t	        dt        |«      › d�«       | so|rm|D �cg c]  }t        |d   t
        «      sŒ|‘Œ }}t	        dt        |«      › d�«       |j                  |«       t        d„ |D «       «      }	|	rt	        d«        n)|j                  |«       t        j                   d«       �Œ t	        dt        |«      › d�«       |st	        d«       y t#        «       }
|
j%                  «       }d}d}d}t'        |«      D �]8  \  }\  }}}|j)                  d|f«       |j+                  «       r|d
z  }Œ4t        |«      }|st	        d |d d! › �«       |d
z  }ŒXt-        |||«      \  }}}}|st	        d"|d d! › �«       |d
z  }Œƒt/        |d#«      j1                  d$¬%«      }|d d& j3                  d'd(«      j5                  «       }|||t6        t8        |||t        d)œ	}t;        |
|«      r9|d
z  }|d*z  dk(  r1|
j=                  «        t	        d+|› dt        |«      › d,�«       n|d
z  }t        j                   d-«       �Œ; |
j=                  «        |
j?                  «        t	        d'd.› �«       t	        d/t6        › �«       t	        d0t        |«      › d1�«       t	        d2|› d1�«       t	        d3|› d4�«       t	        d5|› d1�«       t	        d.› «       y c c}w )6Nz--fullz--helpz-hu   å�¯åŠ¨çˆ¬å�– (mode: u   å…¨é‡�u   å¢žé‡�ú)u   å¢žé‡�çª—å�£: u    å¤©r   r   z/default.htmz	/default_z.htmu   æŠ“å�–åˆ—è¡¨é¡µ r   z: u
   åˆ—è¡¨é¡µ u    èŽ·å�–å¤±è´¥ï¼Œè·³è¿‡u     è§£æž�åˆ° u
    æ�¡è®°å½•é   u     å¢žé‡�è¿‡æ»¤å�Ž: u    æ�¡ (7å¤©å†…)c              3   óD   K  — | ]  }t        |d    t        «       –— Œ y­w)r¨   N)r<   ÚINCREMENTAL_DAYS)Ú.0Úits     r   ú	<genexpr>zmain.<locals>.<genexpr>Q  s   è ø€ ÒUÈœm¨B¨q©EÔ3CÓDÔDÑUùs   ‚ u*     å·²è§¦å�Š7å¤©å‰�çš„æ•°æ�®ï¼Œå�œæ­¢ç¿»é¡µg      à?u
   å…±èŽ·å�– u    æ�¡å¾…å¤„ç�†u   æ— æ–°æ•°æ�®ï¼Œé€€å‡ºz)SELECT id FROM gov_raw WHERE page_url = ?u"     [è·³è¿‡] è¯¦æƒ…é¡µæ— æ³•èŽ·å�–: é(   u     [è·³è¿‡] æ­£æ–‡ä¸ºç©º: r>   TrO   r   ri   r|   )	r›   rx   rœ   r�   rž   rŸ   re   r^   r    r
   u
     è¿›åº¦: u
    å·²å…¥åº“g333333Ó?z-=============================================u   çˆ¬å�–å®Œæˆ�: u
     æ€»è®¡: u    æ�¡u
     æ–°å¢ž: u
     è·³è¿‡: u    æ�¡ (å·²å­˜åœ¨/æ— å†…å®¹)u
     é”™è¯¯: ) ÚsysÚargvr   Ú__doc__r   rª   Ú	MAX_PAGESr   r0   r,   r‡   Úlenr<   ÚextendÚanyr$   r%   r™   ÚcursorÚ	enumerater—   r¡   r’   r   rV   r€   r7   r   ÚGROUPr¥   ÚcommitÚclose)Ú	full_modeÚ	all_itemsÚtotal_pagesÚpager›   r‚   rƒ   r¬   ÚfilteredÚhas_oldr˜   ÚcÚinsertedÚskippedÚerrorsÚidxrx   r:   Údetail_htmlÚdetail_titleÚdetail_datere   r^   Ú	text_onlyrŸ   r¤   s                             r   ÚmainrÊ   -  sÝ  € àœCŸH™HÐ$€IØ”3—8‘8Ñ˜t¤s§x¡xÑ/ÜŒgŒØäÐ
©9™x¸(ÐCÀ1ÐEÔFÙÜˆnÔ-Ð.¨dÐ3Ô4à€Iñ  )•)¨a€KÜ�kÓ"ó ˆØ�1Š9Ü%˜ lÐ3‰Hä%˜ i°¨v°TÐ:ˆHÜÐ˜t a™x˜j¨¨+¨°b¸¸
ÐCÔDä�X‹ˆÙÜ�*˜X˜JÐ&<Ð=Ô>Øä Ó%ˆÜˆlœ3˜u›:˜, jÐ1Ô2á™Uà%*ÖU˜r¬m¸B¸q¹EÔCSÕ.TšÐUˆHÐUÜÐ%¤c¨(£m _°NÐCÔDØ×Ñ˜XÔ&äÑUÈuÔUÓUˆGÙÜÐ@ÔBÙà×Ñ˜UÔ#ä�
‰
�3Žð9ô< ˆ*”S˜“^Ð$ MÐ2Ô3áÜÐ#Ô$Øô Ó€DØ�‰‹€Að €HØ€GØ€Fä,5°iÓ,@ó 0Ñ(ˆÑ(ˆe�X˜xà	�	‰	Ð=À¸{ÔKØ�:‰:Œ<Ø�q‰LˆGØô ˜H“oˆÙÜÐ4°U¸3¸B°Z°LÐAÔBØ�q‰LˆGØô ;LØ˜ ó;
Ñ7ˆ�k 7¨Kñ ÜÐ+¨L¸¸"Ð,=Ð+>Ð?Ô@Ø�q‰LˆGØô " '¨=Ó9×BÑBÈÐBÓNˆ	Ø˜D˜S�/×)Ñ)¨$°Ó4×:Ñ:Ó<ˆð !Ø!Ø'Ü"ÜØØØ&Ü%ñ

ˆô �d˜FÔ#Ø˜‰MˆHØ˜!‰|˜qÒ Ø—‘”Ü�j  
¨!¬C°	«NÐ+;¸:ÐFÕGà�a‰KˆFä�
‰
�3Žða0ðd 	‡K�K„MØ‡J�J„Lô ˆ"ˆXˆJˆÔÜˆ.œ˜Ð$Ô%Üˆ*”S˜“^Ð$ DÐ)Ô*Üˆ*�X�J˜dÐ#Ô$Üˆ*�W�IÐ7Ð8Ô9Üˆ*�V�H˜DÐ!Ô"Üˆ8ˆ*Õùòq Vs   ÄN5ÄN5Ú__main__)é   r   )r.   )%r±   rR   r¯   r$   r[   rW   r”   r   r   r   rE   r   Úurllib.parser   rH   rŠ   r0   Úgetenvr–   r   r¸   rª   r²   r   r   r,   r3   r<   rM   rb   rp   r‡   r’   r™   r¥   rÊ   Ú__name__© r   r   ú<module>rÑ      sÔ   ðñó 
Û 
Û Û Û 	Û ß (ã Ý Ý  Û ð (€Ø�
˜*Ð%€Ø
ˆ"�)‰)�KÐ!2Ó
3€Ø$€	Ø€ØÐ Ø€	ð ð	)ð€ò.óò&,ð "2ó óò
Nòò84òr/1òhòòFxðv ˆzÒÙ…Fð r   