Ë
    ¸¬ujÒ  ã                   óH  — 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ZddlmZ dZdZdZd	Z e	j(                  «        e
d
¬«      z
  j+                  d«      ZdZdZ ej2                  ej4                  dd¬«        ej6                  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jL                  «       Z'e'jQ                  dd¬«       e'jS                  «       Z* e%e*jV                  ¬«      Z, e- ej\                  e,d ¬!«      «       yy)#uŠ  é¢�ä¸œåŒºäººæ°‘æ”¿åºœ - é‡�å¤§è¡Œæ”¿å†³ç­–é¢„å…¬å¼€ çˆ¬è™«
URL: https://www.yd.gov.cn/OpennessContent/showList/1650/192939/page_1.html
CMS: æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�° (Hanweb OpennessTarget)
AJAXåˆ—è¡¨: /OpennessTarget/1650/192939/page_N.html (> table tr > td.bt + td.cwrq)
è¯¦æƒ…: /OpennessContent/show/{id}.html (> div.g-detailbox#zoom æ­£æ–‡)
åˆ†é¡µ: page_2.html, page_3.html (å…±3é¡µ, 35æ�¡)
é    N)ÚdatetimeÚ	timedelta)Úurljoin)ÚBeautifulSoupzhttps://www.yd.gov.cnz/OpennessTarget/1650/192939u%   é¢�ä¸œåŒº-é‡�å¤§è¡Œæ”¿å†³ç­–é¢„å…¬å¼€é   iG  )Údaysz%Y-%m-%dg333333Ó?z/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_yd.pyÚinit_dbr      s1   € Ü	�‰œÓ	!€BØ‡J�Jð 		ô 	
ð ‡I�I„KØ€Ió    c                 óH   — | j                  d|f«      j                  «       d uS )Nz&SELECT 1 FROM gov_raw WHERE page_url=?)r   Úfetchone)r   Úpage_urls     r   Úrecord_existsr   -   s%   € Ø�:‰:Ð>ÀÀÓL×UÑUÓWÐ_cÐcÐcr   c                 óØ   — | j                  d|d   |d   |d   |j                  dd«      |j                  dd«      |j                  dd«      f«       | j                  «       j                  S )	NzrINSERT OR IGNORE INTO gov_raw (site_name, title, page_url, publish_date, source_url, content) VALUES (?,?,?,?,?,?)Ú	site_nameÚtitler   Úpublish_dateÚ Ú
source_urlÚcontent)r   ÚgetÚcursorÚrowcount)r   Úitems     r   Úsave_recordr%   0   sŒ   € Ø‡J�Jð  DØ�[Ñ! 4¨¡=°$°zÑ2BÀDÇHÁHÈ^Ð\^ÓD_Ðae×aiÑaiÐjvÐwyÓazð  }A÷  }Eñ  }Eð  FOð  PRó  }Sð  TôUà�9‰9‹;×ÑÐr   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   è¯·æ±‚å¤±è´¥ é<   z: )Úrequestsr!   ÚHEADERSÚencodingÚtextÚ	ExceptionÚlogÚerror)ÚurlÚrÚes      r   Úfetchr5   5   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«      }|r|sŒ*|j                  dd¬«      }|sŒ@|j	                  d¬«      }|d	   }|j                  d
«      st        t        |«      }|j	                  d¬«      }	|j                  |||	dœ«       Œ  |S )u   ä»ŽAJAXåˆ—è¡¨HTMLæ��å�–æ–‡ç« úhtml.parserÚtrztd.btztd.cwrqÚaT)Úhref©Ústripr:   Úhttp)r   r   r   )	r   ÚselectÚ
select_oneÚfindÚget_textÚ
startswithr   ÚBASE_URLÚappend)
ÚhtmlÚsoupÚitemsr8   ÚbtÚcwrqr9   r   r:   Údates
             r   Úparse_list_itemsrK   >   sÄ   € ä˜˜}Ó-€DØ€EØ�k‰k˜$Óò OˆØ�]‰]˜7Ó#ˆØ�}‰}˜YÓ'ˆÙ™ØØ�G‰G�C˜dˆGÓ#ˆÙØØ—
‘
 �
Ó&ˆØ�‰yˆØ�‰˜vÔ&Üœ8 TÓ*ˆDØ�}‰} 4ˆ}Ó(ˆØ�‰˜u°$ÈÑMÕNðOð €Lr   c                 óp  — 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                  «       }|||fS )
u   è§£æž�è¯¦æƒ…é¡µr7   Úh1Tr;   r   z(\d{4}-\d{2}-\d{2})é   zdiv.g-detailboxzscript,style)r   r@   rA   ÚreÚsearchÚgroupr?   r>   Ú	decomposeÚstrr<   )
rE   r   rF   rM   r   ÚmÚpub_dateÚcontent_divÚcontent_htmlÚss
             r   Úparse_detailrY   R   s«   € ä˜˜}Ó-€DØ	�‰�4‹€BÙ')ˆB�K‰K˜dˆKÔ#¨r€EÜ
�	‰	Ð(¨$Ó/€AÙˆq�w‰w�qŒz B€HØ—/‘/Ð"3Ó4€KØ€LÙØ×#Ñ# NÓ3ò 	ˆAØ�K‰K�Mð	ä˜;Ó'×-Ñ-Ó/ˆØ�(˜LÐ(Ð(r   c                 óÂ  — t        «       }d}d}d}t        t        › t        › d�«      }|sddddœS t	        |«      }t
        j                  dt        |«      › d�«       | rt        nd}t        d|dz   «      D ]  }t        j                  t        «       t        t        › t        › d|› d	�«      }	|	s nGt	        |	«      }
|
s n8t
        j                  d
|› dt        |
«      › d�«       |j                  |
«       Œ� t
        j                  dt        |«      › d�«       t        |«      D �]  \  }}|d   r2|d   t        k  r&t
        j                  d|d   d d › d|d   › d�«       Œ>t!        ||d   «      r|dz  }ŒS|dz  }t
        j                  d|› dt        |«      › d|d   d d › d�«       t        |d   «      }	|	ret#        |	|d   «      \  }}}|xs |d   |d<   |xs |d   |d<   ||d<   d|d<   t$        |d<   t'        ||«      r|dz  }n|dz  }|j)                  «        t        j                  t        «       �Œ t
        j                  d|› d|› d|› �«       |||dœS ) Nr   z/page_1.html)ÚtotalÚsavedÚskippedu	   ç¬¬1é¡µ: u    æ�¡rN   é   z/page_z.htmlu   ç¬¬u   é¡µ: u   å…± r   u     è·³è¿‡(æ—¥æœŸè¿‡æ—§): r   é(   z (ú)r   u
     è¯¦æƒ… [ú/z]: é2   z...r    u   é¢�ä¸œåŒºäººæ°‘æ”¿åºœr   r   u   å®Œæˆ�: total=z, saved=z
, skipped=)r   r5   rC   ÚLIST_APIrK   r0   ÚinfoÚlenÚ	MAX_PAGESÚrangeÚtimeÚsleepÚREQUEST_DELAYÚextendÚ	enumerateÚDATE_CUTOFFr   rY   Ú	SITE_NAMEr%   r   )Úfullr   Útotal_savedÚtotal_skippedÚtotal_countÚhtml1Ú	all_itemsÚpagesÚpagerE   rG   Úir$   r   rU   r    s                   r   Úcrawlrx   a   s•  € Ü	‹€BØ€KØ€MØ€Kô ”X�Jœx˜j¨Ð5Ó6€EÙØ Q°1Ñ5Ð5ä  Ó'€IÜ‡H�Hˆyœ˜Y›Ð(¨Ð-Ô.ñ �I 1€EÜ�a˜ ™Ó#ò 	 ˆÜ�
‰
”=Ô!Üœ�z¤( ¨6°$°°uÐ=Ó>ˆÙÙÜ  Ó&ˆÙÙÜ�‰�3�t�f˜E¤# e£* ¨TÐ2Ô3Ø×Ñ˜Õð	 ô ‡H�Hˆt”C˜	“NÐ# 4Ð(Ô)ô ˜YÓ'ó "‰ˆˆ4Ø�Ò D¨Ñ$8¼;Ò$FÜ�H‰HÐ/°°W±¸c¸rÐ0BÐ/CÀ2ÀdÈ>ÑFZÐE[Ð[\Ð]Ô^Øä˜˜T *Ñ-Ô.Ø˜QÑˆMØà�qÑˆÜ�‰�:˜k˜]¨!¬C°	«NÐ+;¸3¸tÀG¹}ÈSÈbÐ?QÐ>RÐRUÐVÔWÜ�T˜*Ñ%Ó&ˆÙÜ'3°D¸$¸zÑ:JÓ'KÑ$ˆE�8˜WØ!Ò2 T¨'¡]ˆD�‰MØ#+Ò#C¨t°NÑ/CˆD�Ñ Ø%ˆD�‰OØ!8ˆD�ÑÜ )ˆD�Ñä˜2˜tÔ$Ø˜qÑ ‘à Ñ"�Ø�I‰IŒKÜ�
‰
”=Ö!ð3"ô6 ‡H�Hˆ~˜k˜]¨(°;°-¸zÈ-ÈÐYÔZØ ¨;À=ÑQÐQr   Ú__main__z--fullÚ
store_true)Úaction)ro   F)Úensure_ascii)T)/Ú__doc__ÚsysÚosrO   rh   ÚjsonÚloggingÚargparser   r   r   Úurllib.parser   r+   Úbs4r   rC   rc   rn   rf   ÚnowÚstrftimerm   rj   r   ÚbasicConfigÚINFOÚ	getLoggerÚ__name__r0   r,   r   r   r%   r5   rK   rY   rx   ÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsro   ÚresultÚprintÚdumps© r   r   ú<module>r”      s#  ðñ÷ ;× :× :× :ß (Ý  ã Ý à"€Ø(€Ø3€	Ø€	Øˆx�|‰|‹~¡	¨uÔ 5Ñ5×?Ñ?À
ÓK€Ø€Ø
€à €× Ñ ˜'Ÿ,™,Ð/XÐblÕ mØ€g×Ñ˜Ó!€à˜Ð
'€òòdò ò
òò()ó:Rðx ˆzÒØ$ˆX×$Ñ$Ó&€FØ
×Ñ˜¨ÐÔ6Ø×ÑÓ€DÙ˜Ÿ	™	Ô"€FÙ	ˆ*ˆ$�*‰*�V¨%Ô
0Õ1ð r   