Ë
    ¸¬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dlZddlZddl	m	Z	m
Z
 ddlmZ ddlmZmZ ddlZddlmZ dZdZd	Zd
ZdZdZ e	j2                  «        e
d¬«      z
  j5                  d«      ZdZ ej:                  ej<                  dd¬«        ej>                  e «      Z!ddiZ"d„ Z#d„ Z$d„ Z%d„ Z&d„ Z'd„ Z(d$d„Z)e dk(  rb ejT                  «       Z+e+jY                  dd¬ «       e+j[                  «       Z. e)e.j^                  ¬!«      Z0 e1 ejd                  e0d"¬#«      «       yy)%u~   æŸžæ°´åŽ¿äººæ°‘æ”¿åºœ - å…¬ç¤ºå…¬å‘Š çˆ¬è™« v2 (å¹¶å�‘ç‰ˆ)
VSB9 å��å�‘åˆ†é¡µ: gsgg.htm â†’ gsgg/73.htm â†’ ... â†’ gsgg/1.htm
é    N)ÚdatetimeÚ	timedelta)Úurljoin)ÚThreadPoolExecutorÚas_completed)ÚBeautifulSoupzhttps://www.snzs.gov.cnz
/zwdt/gsggu"   æŸžæ°´åŽ¿äººæ°‘æ”¿åºœ-å…¬ç¤ºå…¬å‘ŠéJ   é   é   iG  )Údaysz%Y-%m-%dz/root/search.dbz'[%(asctime)s] %(levelname)s %(message)sz%H:%M:%S)ÚlevelÚformatÚdatefmtz
User-AgentzMozilla/5.0c                  óz   — t        j                  t        «      } | j                  d«       | j	                  «        | S )NaE  CREATE TABLE IF NOT EXISTS gov_raw (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        site_name TEXT NOT NULL,
        title TEXT NOT NULL,
        page_url TEXT NOT NULL UNIQUE,
        publish_date TEXT,
        source_url TEXT,
        content TEXT,
        crawl_time TEXT DEFAULT (datetime('now','localtime'))
    ))Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcommit)Údbs    ú/root/gov_crawler/crawl_snzs.pyÚinit_dbr      s1   € Ü	�‰œÓ	!€BØ‡J�Jð 		ô 	
ð ‡I�I„KØ€Ió    c                 óÊ   — 	 t        j                  | dt        ¬«      }d|_        |j                  S # t
        $ r(}t        j                  d| d d › d|› �«       Y d }~y d }~ww xY w)Né   )ÚtimeoutÚheaderszutf-8u   è¯·æ±‚å¤±è´¥ é<   ú: )ÚrequestsÚgetÚHEADERSÚencodingÚtextÚ	ExceptionÚlogÚerror)ÚurlÚrÚes      r   Úfetchr+   *   s[   € ðÜ�L‰L˜ b´'Ô:ˆØˆŒ
Ø�v‰vˆøÜò Ü�	‰	�M # c r ( ¨2¨a¨SÐ1Ô2Üûðús   ‚.1 ±	A"ºAÁA"c                 ó´  — t        | d«      }g }|j                  d«      D ]µ  }|j                  d«      }|j                  dd¬«      }|r|rd|j                  dd	«      v sŒ@|j	                  d¬
«      }t        j                  d|«      sŒi|d   }|j                  d«      st        t        |«      }|j	                  d¬
«      }|j                  |||dœ«       Œ· |S )Núhtml.parserÚliÚspanÚaT)Úhrefz	info/1071r1   Ú ©Ústripz\d{4}-\d{2}-\d{2}Úhttp)ÚtitleÚpage_urlÚpublish_date)r   Úfind_allÚfindr!   Úget_textÚreÚmatchÚ
startswithr   ÚBASE_URLÚappend)	ÚhtmlÚsoupÚitemsr.   r/   r0   Údater1   r6   s	            r   Úparse_list_itemsrE   3   sÓ   € Ü˜˜}Ó-€DØ€EØ�m‰m˜DÓ!ò OˆØ�w‰w�v‹ˆØ�G‰G�C˜dˆGÓ#ˆÙ™˜{¨a¯e©e°F¸2Ó.>Ñ>ØØ�}‰} 4ˆ}Ó(ˆÜ�x‰xÐ,¨dÔ3ØØ�‰yˆØ�‰˜vÔ&Üœ8 TÓ*ˆDØ—
‘
 �
Ó&ˆØ�‰˜u°$ÈÑMÕNðOð €Lr   c                 óf   — | dk(  rt         › t        › d�S t        dz   | z
  }t         › t        › d|› d�S )Né   z.htmú/)r?   ÚLIST_URLÚTOTAL_PAGES)Úpage_numÚpage_ids     r   Úget_page_urlrM   E   s?   € Ø�1‚}Ü�œH˜: TÐ*Ð*Ü˜A‰o Ñ(€GÜˆZœ�z  7 )¨4Ð0Ð0r   c                 óR  — 	 t        | d   «      }|sy t        |d«      }|j                  d«      }|r|j                  d¬«      nd}t	        j
                  d|«      }|r|j                  d«      nd}|j                  d	«      }d}|r?|j                  d
«      D ]  }	|	j                  «        Œ t        |«      j                  «       }|xs | d   | d<   |xs | d   | d<   || d<   t        | d<   d| d<   | S # t        $ r+}
t        j                  d| d   d d › d|
› �«       Y d }
~
y d }
~
ww xY w)Nr7   r-   Úh1Tr3   r2   z(\d{4}-\d{2}-\d{2})rG   z.v_news_contentzscript,styler6   r8   ÚcontentÚ	site_nameu   æŸžæ°´åŽ¿äººæ°‘æ”¿åºœÚ
source_urlu   è¯¦æƒ…å¤±è´¥ é2   r   )r+   r   r:   r;   r<   ÚsearchÚgroupÚ
select_oneÚselectÚ	decomposeÚstrr4   Ú	SITE_NAMEr%   r&   r'   )ÚitemrA   rB   rO   r6   ÚmÚpub_dateÚcontent_divÚcontent_htmlÚsr*   s              r   Úfetch_detailra   K   s8  € ðÜ�T˜*Ñ%Ó&ˆÙ˜DÜ˜T =Ó1ˆØ�Y‰Y�t‹_ˆÙ+-�—‘ $�Ô'°2ˆÜ�I‰IÐ,¨dÓ3ˆÙ!"�1—7‘7˜1”:¨ˆØ—o‘oÐ&7Ó8ˆØˆÙØ ×'Ñ'¨Ó7ò �Ø—‘•ðä˜{Ó+×1Ñ1Ó3ˆLØÒ.  g¡ˆˆW‰Ø'Ò?¨4°Ñ+?ˆˆ^ÑØ&ˆˆY‰Ü%ˆˆ[ÑØ4ˆˆ\ÑØˆøÜò Ü�	‰	�M $ zÑ"2°3°BÐ"7Ð!8¸¸1¸#Ð>Ô?Üûðús   ‚C2 “CC2 Ã2	D&Ã;!D!Ä!D&c                 ó  — d}|D ]s  }| j                  d|d   |d   |d   |j                  dd«      |j                  dd«      |j                  d	d«      f«       | j                  «       j                  sŒo|d
z  }Œu | j	                  «        |S )Nr   zrINSERT OR IGNORE INTO gov_raw (site_name, title, page_url, publish_date, source_url, content) VALUES (?,?,?,?,?,?)rQ   r6   r7   r8   r2   rR   rP   rG   )r   r!   ÚcursorÚrowcountr   )r   rC   Úsavedr[   s       r   Ú
save_batchrf   d   s·   € Ø€EØò ˆØ
�
‰
ð  HØ˜Ñ% t¨G¡}°d¸:Ñ6FÈÏÉÐQ_Ð`bÓHcÐei×emÑemÐnzÐ{}Óe~ð  AE÷  AIñ  AIð  JSð  TVó  AWð  Xô	Yà�9‰9‹;×ÓØ�Q‰J‰Eð	ð
 ‡I�I„KØ€Lr   c                 óÒ  — t        «       }| rt        nd}g }t        d|dz   «      D ]á  }t        |«      }t	        j
                  d«       t        |«      }|s n²t        |«      }|s n£|D �cg c]  }|d   sŒ	|d   ‘Œ }	}|	r?t        |	«      t        k  r-t        j                  d|› d|d   d   › d|d   d   › d	�«        nJt        j                  d|› d
t        |«      › d|d   d   › d|d   d   › d�	«       |j                  |«       Œã t        «       }
g }|D ]f  }|d   |
v rŒ|
j                  |d   «       |d   r|d   t        k  rŒ1|j!                  d|d   f«      j#                  «       rŒV|j%                  |«       Œh t        j                  dt        |«      › dt        |«      › �«       d}t'        t(        ¬«      5 }t+        |«      D ��ci c]  \  }}|j-                  t.        |«      |“Œ }}}g }t+        t1        |«      «      D ]{  \  }}|j3                  «       }|r|j%                  |«       |dz   dz  dk(  r(t        j                  d|dz   › dt        |«      › d�«       t        |«      dk\  sŒk|t5        ||«      z  }g }Œ} |r|t5        ||«      z  }d d d «       t        j                  dt        |«      › d|› �«       t        |«      |dœS c c}w c c}}w # 1 sw Y   ŒFxY w)NrG   g333333Ó?r8   u   ç¬¬u   é¡µ [r   u   â†’éÿÿÿÿu   ] â†’ ç»ˆæ­¢u   é¡µ: u    æ�¡ [ú]r7   z&SELECT 1 FROM gov_raw WHERE page_url=?u   å¾…çˆ¬è¯¦æƒ…: rH   )Úmax_workersr   u   è¯¦æƒ… [u   å®Œæˆ�: crawled=z, saved=)Útotalre   )r   rJ   ÚrangerM   ÚtimeÚsleepr+   rE   ÚmaxÚDATE_CUTOFFr&   ÚinfoÚlenÚextendÚsetÚaddr   Úfetchoner@   r   ÚNUM_THREADSÚ	enumerateÚsubmitra   r   Úresultrf   )Úfullr   Útotal_pagesÚ	all_itemsÚpager(   rA   rC   ÚiÚdatesÚseenÚto_crawlr[   Úsaved_countÚexecutorÚfuturesÚbatchÚfuturerz   s                      r   Úcrawlrˆ   n   sø  € Ü	‹€BÙ!%•+¨1€Kð €IÜ�a˜ q™Ó)ò  ˆÜ˜4Ó ˆÜ�
‰
�3ŒÜ�S‹zˆÙ‘UÜ  Ó&ˆÙ‘eØ,1ÖG q°Q°~Ó5F��>Ó"ÐGˆÐGÙ”S˜“Z¤+Ò-Ü�H‰H�s˜4˜&  e¨A¡h¨~Ñ&>Ð%?¸sÀ5ÈÁ9È^ÑC\ÐB]Ð]iÐjÔkÙÜ�‰�3�t�f˜E¤# e£* ¨V°E¸!±H¸^Ñ4LÐ3MÈSÐQVÐWYÑQZÐ[iÑQjÐPkÐklÐmÔnØ×Ñ˜Õð ô ‹5€DØ€HØò ˆØ�
Ñ˜tÑ# XØ�‰��jÑ!Ô"Ø�Ò D¨Ñ$8¼;Ò$FÈØ�:‰:Ð>ÀÀjÑAQÐ@SÓT×]Ñ]Ô_ÐaiØ�‰˜Õðô ‡H�Hˆ~œc (›m˜_¨A¬c°)«nÐ-=Ð>Ô?ð €KÜ	¬Ô	4ð 1¸ÜIRÐS[ÓI\×]¹g¸aÀ�8—?‘?¤<°Ó6¸Ñ9Ð]ˆÑ]ØˆÜ"¤<°Ó#8Ó9ò 		‰IˆAˆvØ—]‘]“_ˆFÙØ—‘˜VÔ$Ø�!‘�r‰z˜QŠÜ—‘˜8 A a¡C 5¨¬#¨h«-¨¸Ð:Ô;ä�5‹z˜RÓØœz¨"¨eÓ4Ñ4�Ø‘ð		ñ Øœ: b¨%Ó0Ñ0ˆK÷1ô  ‡H�HÐ¤ H£˜¨h°{°mÐDÔEÜ˜“]¨[Ñ9Ð9ùòM Hùó, ^÷1ð 1ús1   Á+
KÁ6KÇ KÇ!KÇ0BKÉ4$KËKËK&Ú__main__z--fullÚ
store_true)Úaction)r{   F)Úensure_ascii)T)3Ú__doc__ÚsysÚosr<   rm   ÚjsonÚloggingÚargparser   r   r   Úurllib.parser   Úconcurrent.futuresr   r   r    Úbs4r   r?   rI   rZ   rJ   Ú	PAGE_SIZErw   ÚnowÚstrftimerp   r   ÚbasicConfigÚINFOÚ	getLoggerÚ__name__r&   r"   r   r+   rE   rM   ra   rf   rˆ   ÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsr{   rz   ÚprintÚdumps© r   r   ú<module>r¥      s)  ðñ÷ ;× :× :× :ß (Ý  ß ?ã Ý à$€Ø€Ø0€	Ø€Ø€	Ø€Øˆx�|‰|‹~¡	¨uÔ 5Ñ5×?Ñ?À
ÓK€Ø
€à €× Ñ ˜'Ÿ,™,Ð/XÐblÕ mØ€g×Ñ˜Ó!€Ø˜Ð
'€òòòò$1òò2ó3:ðj ˆzÒØ$ˆX×$Ñ$Ó&€FØ
×Ñ˜¨ÐÔ6Ø×ÑÓ€DÙ˜Ÿ	™	Ô"€FÙ	ˆ*ˆ$�*‰*�V¨%Ô
0Õ1ð r   