Ë
    ¸¬ujr  ã                   óì   — d 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dl	m	Z	m
Z
 ddlmZmZ  ej                  dd«      Zd	Zd
ZdZe› d�ZddiZ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_guiding.py â€” è´µå®šåŽ¿äººæ°‘æ”¿åºœÂ·çŽ¯å¢ƒä¿�æŠ¤
===========================================
CMS: è´µå·žçœ�æ”¿åºœç½‘ç«™ç¾¤

åˆ—è¡¨ï¼šhttps://www.guiding.gov.cn/zwgk/xxgkml/zdlyxx/hjbh/index{_N}.html
      16é¡µï¼Œ236æ�¡æ€»é‡�
è¯¦æƒ…ï¼š/zwgk/xxgkml/zdlyxx/hjbh/{YYYYMM}/t{YYYYMMDD}_{id}.html
      æ ‡é¢˜ <meta name="ArticleTitle">
      æ—¥æœŸ <meta name="PubDate">
      æ­£æ–‡ <div class="content">

ç”¨æ³•:
    python3 crawl_guiding.py               # å…¨é‡�
    python3 crawl_guiding.py 1             # å¢žé‡�
é    N)ÚBeautifulSoup)Úurljoin)ÚdatetimeÚ	timedelta)ÚThreadPoolExecutorÚas_completedÚ	SEARCH_DBz/root/search.dbu   è´µå®šåŽ¿äººæ°‘æ”¿åºœu   çŽ¯å¢ƒä¿�æŠ¤zhttps://www.guiding.gov.cnz/zwgk/xxgkml/zdlyxx/hjbh/z
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36é   c                 ó    — t        d| › �«       y )Nz
[guiding] )Úprint)Úmsgs    ú"/root/gov_crawler/crawl_guiding.pyÚlogr   +   s   € Ü	ˆJ�s�eÐ
Õó    c                 óò  — | dk(  rt         }nt         › d| › d�}	 t        j                  |t        d¬«      }d|_        |j
                  }g }t        j                  d
|t        j                  «      D ]Û  }|j                  «       }t        j                  d|t        j                  «      }t        j                  d|t        j                  «      }	|sŒ`|j                  d«      }
|j                  d«      j                  «       }|	r|	j                  d«      nd}|
j                  d«      r|
nt        t         |
«      }|j#                  |||f«       ŒÝ |S # t        $ r}t        d| › d|› �«       g cY d	}~S d	}~ww xY w)z<Fetch one list page. Returns list of (url, title, date_str).é   Úindex_z.htmlé   ©ÚheadersÚtimeoutúutf-8z  ERROR list page ú: Nz<tr class="c">.*?</tr>z$<a[^>]*href="([^"]+)"[^>]*>(.*?)</a>z.<td class="tn5">\s*(\d{4}-\d{2}-\d{2})\s*</td>é   Ú Úhttp)ÚLIST_URLÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	Exceptionr   ÚreÚfinditerÚDOTALLÚgroupÚsearchÚstripÚ
startswithr   ÚBASE_URLÚappend)Úpage_noÚurlÚrespÚhtmlÚeÚitemsÚtrÚtr_htmlÚaÚdÚhrefÚtitleÚdate_strÚfull_urls                 r   Úfetch_list_pager;   /   sB  € à�!‚|Ü‰ä�
˜&  	¨Ð/ˆðÜ�|‰|˜C¬¸"Ô=ˆØˆŒØ�y‰yˆð
 €Eä�k‰kÐ3°T¼2¿9¹9ÓEò 	6ˆØ—(‘(“*ˆÜ�I‰IÐ=¸wÌÏ	É	ÓRˆÜ�I‰IÐGÈÔRT×R[ÑR[Ó\ˆÚØ—7‘7˜1“:ˆDØ—G‘G˜A“J×$Ñ$Ó&ˆEÙ%&�q—w‘w˜q”z¨BˆHØ#Ÿ™¨vÔ6‘t¼GÄHÈdÓ<SˆHØ�L‰L˜( E¨8Ð4Õ5ð	6ð €Løô# ò ÜÐ   	¨¨A¨3Ð/Ô0Ø�	ûðús   š/E Å	E6ÅE1Å+E6Å1E6c                 óÔ  — 	 t        j                  | t        d¬«      }d|_        |j                  }t        |d«      }|j                  d	d
di¬«      }|r$|j                  d«      r|d   j                  «       nd}d}|j                  d	d
di¬«      }|rK|j                  d«      r:t        j                  d|d   j                  «       «      }	|	r|	j                  d«      }|j                  dd¬«      }
|
s'|j                  dd¬«      xs |j                  d¬«      }
|
rt        |
«      nd}|st        d| › �«       d||fS |||fS # t
        $ r}t        d| › d|› �«       Y d}~yd}~ww xY w)z=Return (content_html, date_str, title) or (None, None, None).r   r   r   z  ERROR r   N©NNNzhtml.parserÚmetaÚnameÚArticleTitle)ÚattrsÚcontentr   ÚPubDatez(\d{4}-\d{2}-\d{2})r   Údiv)Úclass_zarticle-contentÚzoom)Úidz  WARNING: no content for )r   r   r    r!   r"   r#   r   r   Úfindr)   r$   Úmatchr'   Ústr)r.   r/   r0   r1   ÚsoupÚ
meta_titler8   r9   Ú	meta_dateÚmÚcontent_divÚcontent_htmls               r   Úfetch_detailrQ   N   sn  € ð Ü�|‰|˜C¬¸"Ô=ˆØˆŒØ�y‰yˆô
 ˜˜}Ó-€Dð —‘˜6¨&°.Ð)A�ÓB€JÙ-7¸J¿N¹NÈ9Ô<UˆJ�yÑ!×'Ñ'Ô)Ð[]€Eð €HØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ü�H‰HÐ+¨Y°yÑ-A×-GÑ-GÓ-IÓJˆÙØ—w‘w˜q“zˆHð —)‘)˜E¨)�)Ó4€KÙà—i‘i Ð.?�iÓ@ÒXÀDÇIÁIÐQWÀIÓDXˆÙ'2”3�{Ô#¸€LáÜÐ(¨¨Ð.Ô/Ø�X˜uÐ$Ð$à˜ 5Ð(Ð(øô; ò  Üˆh�s�e˜2˜a˜SÐ!Ô"Üûð ús   ‚/E Å	E'ÅE"Å"E'c                 ó$  — i }t        t        ¬«      5 }| D �ci c]  }|j                  t        |«      |“Œ }}t	        |«      D ]  }||   }	 |j                  «       ||<   Œ 	 d d d «       |S c c}w # t        $ r d||<   Y Œ>w xY w# 1 sw Y   |S xY w)N)Úmax_workersr=   )r   ÚMAX_WORKERSÚsubmitrQ   r   Úresultr#   )ÚurlsÚresultsÚexr.   Úfut_mapÚfuts         r   Úfetch_detail_batchr\   t   s£   € Ø€GÜ	¬Ô	4ð 2¸Ø@DÖE¸�2—9‘9œ\¨3Ó/°Ñ4ÐEˆÐEÜ Ó(ò 	2ˆCØ˜#‘,ˆCð2Ø"Ÿz™z›|�˜’ñ	2÷2ð €Nùò Føô
 ò 2Ø1�˜“ð2ú÷2ð €Nús?   “B˜A,¶BÁA1ÁBÁ,BÁ1BÁ?BÂBÂBÂBc           
      óT  — | sydd l }|j                  t        «      }|j                  «       }d}| D ]-  \  }}}}	 |j	                  dt
        ||||t        f«       |dz  }Œ/ |j                  «        |j                  «        |S # t        $ r}	t        d|› d|	› �«       Y d }	~	Œqd }	~	ww xY w)Nr   zœINSERT OR REPLACE INTO gov_raw
                   (site_name, page_url, title, publish_date, content, category)
                   VALUES (?, ?, ?, ?, ?, ?)r   z  DB error for r   )Úsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚ	SITE_NAMEÚCOLUMN_NAMEr#   r   ÚcommitÚclose)
r2   r^   ÚconnÚcÚinsertedr.   r8   r9   rP   r1   s
             r   Ú
save_to_dbrj   �   s·   € ÙØÛØ�?‰?œ7Ó#€DØ�‰‹€AØ€HØ.3ò 
.Ñ*ˆˆU�H˜lð		.Ø�I‰Ið0ô ˜C ¨°,ÄÐLô	ð ˜‰M‰Hð
.ð 	‡K�K„MØ‡J�J„LØ€Oøô	 ò 	.Ü�/ #  b¨¨Ð,×-Ñ-ûð	.ús   º%BÂ	B'ÂB"Â"B'c                  ó  — 	 dd l } | j                  t        «      }|j                  dt        f«       |j                  «        |j                  «        t        d«       y # t        $ r}t        d|› �«       Y d }~y d }~ww xY w)Nr   a  INSERT OR REPLACE INTO gov_search(rowid, title, site_name, summary)
               SELECT rowid, title, site_name,
                      CASE WHEN length(content) > 200 THEN substr(content, 1, 200) ELSE content END
               FROM gov_raw WHERE category = ?zFTS index updatedz
FTS note: )	r^   r_   r`   rb   rd   re   rf   r   r#   )r^   rg   r1   s      r   Úrebuild_ftsrl   ˜   so   € ðÛØ�‰œwÓ'ˆØ�‰ð2ô ˆNô	
ð 	�‰ŒØ�
‰
ŒÜÐÕ øÜò Üˆj˜˜Ð×Ñûðús   ‚AA Á	A?Á'A:Á:A?c                  óN  — t        t        j                  «      dkD  xr t        j                  d   dk(  } t        j                  «       t        d¬«      z
  j                  d«      }t        d|› �«       g }d}t        d|dz   «      D ]¨  }t        |«      }|st        d|› d	�«       Œ t        d|› d
t        |«      › d�«       |D ���cg c]  \  }}}|sŒ
||k\  sŒ|||f‘Œ }	}}}|j                  |	«       | rt        d«        n-|	sŒ�t        |	«      t        |«      k  sŒ™t        d|› d�«        n t        dt        |«      › �«       |st        d«       y g }
t        dz  }t        dt        |«      |«      D ]�  }||||z    }|D ��cg c]  \  }}}|‘Œ
 }}}t        d|dz   › d|t        |«      z   › dt        |«      › d�«       t        |«      }|D ]A  \  }}}|j                  |d«      \  }}}|xs |}|xs |}|
j                  ||||xs df«       ŒC ŒŸ t        |
«      }t        d|› dt        |
«      › �«       |
rAt!        |
D �cg c]  }|d   sŒ	|d   ‘Œ c}«      }t        d|r|d   nd› d|r|d   nd› �«       t#        «        t        d«       y c c}}}w c c}}w c c}w )Nr   Ú1iG  )Údaysz%Y-%m-%dz3-year cutoff: é   zPage z: no articles foundr   z	 articleszIncremental: page 1 onlyz': some articles before cutoff, stoppingzTotal articles to process: zNo articles within 3 yearsé   r   z  Details [ú-ú/z]...r=   r   zSaved: r   zDate range: zN/Az ~ éÿÿÿÿzDone!)ÚlenÚsysÚargvr   Únowr   Ústrftimer   Úranger;   ÚextendrT   r\   r   r,   rj   Úsortedrl   )ÚincrementalÚthree_years_agoÚall_articlesÚtotal_pagesÚpager2   ÚuÚtr6   ÚfilteredrX   Ú
batch_sizeÚbatch_startÚbatchÚ_Ú
batch_urlsÚ
detail_mapr.   r8   r9   rP   Údetail_dateÚdetail_titleÚfinal_titleÚ
final_dateÚsavedÚrÚdatess                               r   Úmainr’   ª   sÎ  € Ü”c—h‘h“- !Ñ#Ò:¬¯©°©°sÑ(:€KÜ—|‘|“~¬	°wÔ(?Ñ?×IÑIÈ*ÓU€OÜˆ/˜/Ð*Ð+Ô,ð €LØ€Kä�a˜ q™Ó)ò ˆÜ Ó%ˆÙÜ�%˜�vÐ0Ð1Ô2Øäˆe�D�6˜œC ›J˜< yÐ1Ô2à-2×QÐQ¡' ! Q¨²a¸AÀÓ<P�Q˜˜1’IÐQˆÒQØ×Ñ˜HÔ%áÜÐ*Ô+Ùâœ˜H›¬¨E«
Ó2Ü�%˜�vÐDÐEÔFÙð#ô& Ð
%¤c¨,Ó&7Ð%8Ð9Ô:áÜÐ(Ô)Øð €GÜ˜q‘€JÜ˜Q¤ LÓ 1°:Ó>ò 	OˆØ˜[¨°zÑ)AÐBˆØ',×-™G˜A˜q !’aÐ-ˆ
Ñ-Üˆk˜+ a™-˜¨¨+´c¸%³jÑ*@Ð)AÀÄ3À|ÓCTÐBUÐUYÐZÔ[Ü'¨
Ó3ˆ
Ø$)ò 	OÑ ˆC�˜Ø6@·n±nÀSÐJ\Ó6]Ñ3ˆL˜+ |Ø&Ò/¨%ˆKØ$Ò0¨ˆJØ�N‰N˜C ¨j¸,Ò:LÈ"ÐMÕNñ		Oð	Oô �wÓ€EÜˆ'�%�˜œ#˜g›,˜Ð(Ô)áÜ gÖ6 °°1³˜˜!›Ò6Ó7ˆÜˆl¡u˜5 š8°%Ð8¸É¸EÀ"ºIÐTYÐ;ZÐ[Ô\ä„MÜˆ…LùôQ Rùó, .ùò 7s$   ÃJ
ÃJ
ÃJ
ÆJÉ
J"ÉJ"Ú__main__)Ú__doc__Úosr$   rv   r   Úbs4r   Úurllib.parser   r   r   Úconcurrent.futuresr   r   Úgetenvr`   rc   rd   r+   r   r    rT   r   r;   rQ   r\   rj   rl   r’   Ú__name__© r   r   ú<module>rœ      s¤   ðñó" 
Û 	Û 
Û Ý Ý  ß (ß ?à
ˆ"�)‰)�KÐ!2Ó
3€Ø#€	Ø€Ø'€ØˆZÐ0Ð1€ð ð 3ð€ð €òòò>#)òL
òò.ò$9ðx ˆzÒÙ…Fð r   