Ë
    ¸¬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mZ ddl	m
Z
 dZedz   ZdZdZd	xZZd
dddœZdZdZd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r ej4                   e«       «       yy)uz  
è¥„åŸŽåŽ¿äººæ°‘æ”¿åºœ - å…¬å‘Šå…¬ç¤º çˆ¬è™«
CMS: è‡ªå®šä¹‰PHP
åˆ—è¡¨: /zwgk/010001/subpage.html (ç¬¬1é¡µ), /zwgk/010001/{N}.html (ç¬¬Né¡µ, N=2~5)
åˆ†é¡µ: 20æ�¡/é¡µ, 5é¡µ
è¯¦æƒ…: /zwgk/010001/YYYYMMDD/uuid.html
è¯¦æƒ…æ ‡é¢˜: <title>
è¯¦æƒ…æ­£æ–‡: div.content

ç”¨æ³•:
  python3 crawl_xiangcheng.py            # é»˜è®¤5é¡µ
  python3 crawl_xiangcheng.py --pages 3  # æŒ‡å®šé¡µæ•°
é    N)ÚBeautifulSoup)Úurljoinz!https://www.xiangchengxian.gov.cnz/zwgk/010001/subpage.htmlz/root/search.dbu   è¥„åŸŽåŽ¿-å…¬å‘Šå…¬ç¤ºu   å…¬ç¤ºå…¬å‘Šz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languageé   é   c                 ó<  — t        d«      D ]7  }	 t        j                  | t        t        ¬«      }d|_        |j                  c S  y # t        $ rK}|dk(  r't        d| ›d|›�t        j                  ¬«       Y d }~ yt        j                  d«       Y d }~ŒŠd }~ww xY w)	Né   )ÚheadersÚtimeoutzutf-8é   u     [WARN] èŽ·å�–å¤±è´¥: ú - ©ÚfileÚ )ÚrangeÚrequestsÚgetÚHEADERSÚTIMEOUTÚencodingÚtextÚ	ExceptionÚprintÚsysÚstderrÚtimeÚsleep)ÚurlÚattemptÚrÚes       ú%/root/gov_crawler/crawl_xiangcheng.pyÚfetchr#   $   sx   € Ü˜“8ò 	ˆð	Ü—‘˜S¬'¼7ÔCˆAØ ˆAŒJØ—6‘6ŠMñ		øô
 ò 	Ø˜!Š|Ýº#¹qÐAÌÏ
É
ÕSÝÜ�J‰J�q�M‰Mûð		ús   �2AÁ	BÁ&BÁ<BÂBc                 óÜ  — g }t        | d«      }|j                  d«      D ]É  }|j                  dd«      }|j                  d¬«      }|r|rt	        |«      dk  rŒ:d|v s|j                  d	«      sŒPd
|v sŒUt        t        |«      }d}t        j                  d|«      }|r7|j                  d«      ›d|j                  d«      ›d|j                  d«      ›�}|j                  |||f«       ŒË |S )Núhtml.parserzul li aÚhrefr   T©Ústripé
   Úsubpagez.htmlz/20z/(20\d{2})(\d{2})(\d{2})/é   ú-r   r	   )r   Úselectr   Úget_textÚlenÚendswithr   ÚBASE_URLÚreÚsearchÚgroupÚappend)	ÚhtmlÚitemsÚsoupÚar&   ÚtitleÚfull_urlÚdateÚms	            r"   Úextract_list_itemsr>   1   sÙ   € Ø€EÜ˜˜}Ó-€DØ�[‰[˜Ó#ò 2ˆØ�u‰u�V˜RÓ ˆØ—
‘
 �
Ó&ˆÙ™5¤C¨£J°¢OØà˜Ñ §¡¨gÕ 6¸5ÀDº=Üœx¨Ó.ˆHàˆDÜ—	‘	Ð6¸Ó=ˆAÙØ%&§W¡W¨Q¥Z°·±¸µ¸Q¿W¹WÀQ¼ZÐH�Ø�L‰L˜( E¨4Ð0Õ1ð2ð €Ló    c                 ó   — t        | d«      }|j                  d«      }|r|j                  d¬«      nd}|s(|j                  dd„ ¬«      }|r|j                  d¬«      }d}t        j                  d	| «      }|r|j                  d
«      }d}|j                  dd„ ¬«      }|r¥g }	|j                  d«      D ]~  }
|
j                  d«      D ]  }|j                  d«       Œ |
j                  D �cg c]  }|sŒ|‘Œ	 }}|sŒIt        |«      d
k(  r|d   }ndj                  |«      }|	j                  |«       Œ€ dj                  |	«      }|||fS c c}w )Nr%   r:   Tr'   r   Úh3c                 ó$   — | xr dt        | «      v S )Nz
article-tt©Ústr©Úcs    r"   ú<lambda>z extract_detail.<locals>.<lambda>L   s   € ¨aÒ.J°LÄCÈÃFÐ4J€ r?   )Úclass_z(\d{4}-\d{2}-\d{2})r+   Údivc                 ó$   — | xr dt        | «      v S )Nzarticle-contentrC   rE   s    r"   rG   z extract_detail.<locals>.<lambda>W   s   € °AÒ4UÐ:KÌsÐSTËvÐ:U€ r?   ÚpÚbrú
r   z

)r   Úfindr.   r2   r3   r4   Úfind_allÚreplace_withÚstripped_stringsr/   Újoinr5   )r6   r8   Ú	title_tagr:   rA   r<   r=   ÚcontentÚcontent_divÚpartsrK   rL   ÚsÚtextsr   s                  r"   Úextract_detailrY   E   sW  € Ü˜˜}Ó-€Dð —	‘	˜'Ó"€IÙ.7ˆI×Ñ TÐÔ*¸R€EÙØ�Y‰Y�tÑ$JˆYÓKˆÙØ—K‘K d�KÓ+ˆEà€DÜ
�	‰	Ð(¨$Ó/€AÙØ�w‰w�q‹zˆð €GØ—)‘)˜EÑ*U�)ÓV€KÙØˆØ×%Ñ% cÓ*ò 	ˆAà—j‘j Ó&ò &�Ø—‘ Õ%ð&ð !"× 2Ñ 2Ö8˜1²a’QÐ8ˆEÐ8ÙØÜ�5‹z˜QŠØ˜Q‘x‘à—y‘y Ó'�Ø�L‰L˜Õð	ð —+‘+˜eÓ$ˆà�$˜ÐÐùò 9s   Ã,EÃ4Ec                 óF  — d}d}|D ]Y  \  }}}}|r|d d j                  dd«      n|}	 | j                  d||t        ||||df«      }	|	j                  dkD  r|dz  }n|dz  }Œ[ ||fS # t        $ r0}
t        d|›d	|
›�t        j                  ¬
«       |dz  }Y d }
~
Œ”d }
~
ww xY w)Nr   éÈ   rM   ú z“INSERT OR REPLACE INTO gov_raw (page_url, title, site_name, publish_date, content, date_rank, summary, attachments) VALUES (?, ?, ?, ?, ?, ?, ?, ?)r   r+   z  [ERR] DB: r   r   )ÚreplaceÚexecuteÚ	SITE_NAMEÚrowcountr   r   r   r   )Úconnr7   ÚsavedÚskippedr   r:   r<   rT   ÚsummaryÚcurr!   s              r"   Ú
push_to_dbrf   l   sÉ   € Ø€EØ€GØ%*ò Ñ!ˆˆU�D˜'Ù6=�'˜$˜3�-×'Ñ'¨¨cÔ2À5ˆð	Ø—,‘,ð2ð �eœY¨¨g°t¸WÀbÐIó	ˆCð �|‰|˜aÒØ˜‘
‘à˜1‘�øðð  �'ˆ>Ðøô ò 	Ýª3±Ð2¼¿¹ÕDØ�q‰L�Gûð	ús   ©8A'Á'	B Á0&BÂB c            	      óX  — t         } t        t        j                  «      D ]K  \  }}|dk(  sŒ|dz   t	        t        j                  «      k  sŒ,t        t        j                  |dz      «      }  n t        j                  t        d¬«      }|j                  d«       g }t        g}|j                  d„ t        d| dz   «      D «       «       t        d| z  «       t        |d«      D ]û  \  }}t        d	|| |fz  «       t        |«      }|sŒ%t        |«      }	|	st        d
«        n¿t        dt	        |	«      z  «       |	D ]¡  \  }
}}t!        j"                  d«       t        dt	        |«      dz   |d d fz  dd¬«       t        |
«      }|st        d«       ŒWt%        |«      \  }}}|s|}|s|}|j'                  |
|||f«       |rdnd}t        d|t	        |«      fz  «       Œ£ Œý |r9t)        ||«      \  }}|j+                  «        t        d||t	        |«      fz  «       |j-                  «        y)Nz--pagesr+   é<   )r   zPRAGMA journal_mode=WALc              3   ó2   K  — | ]  }d t         |fz  –— Œ y­w)z%s/zwgk/010001/%d.htmlN)r1   )Ú.0Úns     r"   ú	<genexpr>zmain.<locals>.<genexpr>Ž   s   è ø€ Ò[À!Ð-´¸1°Õ=Ñ[ùs   ‚r   u%   è¥„åŸŽåŽ¿-å…¬å‘Šå…¬ç¤º: çˆ¬å�– %d é¡µu     [åˆ—è¡¨é¡µ %d/%d] %su       -> æ— æ•°æ�®ï¼Œå�œæ­¢u       -> æ‰¾åˆ° %d æ�¡g      à?z    [%d] %s...é(   r\   T)ÚendÚflushÚfailÚokÚemptyu   (%s, %då­—)u+   
å®Œæˆ�! æ–°å¢ž: %d, è·³è¿‡: %d, æ€»å…±: %dr   )Ú	MAX_PAGESÚ	enumerater   Úargvr/   ÚintÚsqlite3ÚconnectÚDB_PATHr^   Ú
LIST_FIRSTÚextendr   r   r#   r>   r   r   rY   r5   rf   ÚcommitÚclose)ÚpagesÚir9   ra   Ú	all_itemsÚ	list_urlsÚidxÚlist_urlr6   r7   Úitem_urlÚ
item_titleÚ	item_dateÚdetail_htmlr:   r<   rT   Ústatusrb   rc   s                       r"   Úmainr‰   ‚   s  € Ü€EÜœ#Ÿ(™(Ó#ò ‰ˆˆ1Ø�	‹>˜a !™e¤c¬#¯(©(£mÓ3ÜœŸ™  Q¡™Ó(ˆEÙðô
 �?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø€Iä�€IØ×ÑÑ[ÄuÈQÐPUÐXYÑPYÓGZÔ[Ô[ä	Ð
1°EÑ
9Ô:ä" 9¨aÓ0ò :‰ˆˆXÜÐ&¨#¨u°hÐ)?Ñ?Ô@Ü�X‹ˆÙØä" 4Ó(ˆÙÜÐ-Ô.ÙäÐ$¤s¨5£zÑ1Ô2à/4ò 	:Ñ+ˆH�j )Ü�J‰J�sŒOÜÐ"¤c¨)£n°qÑ&8¸*ÀSÀb¸/Ð%JÑJÐPSÐ[_Õ`Ü ›/ˆKÙÜ�f”Øä#1°+Ó#>Ñ ˆE�4˜ÙØ"�ÙØ �à×Ñ˜h¨¨t°WÐ=Ô>Ù$‘T¨'ˆFÜ�- 6¬3¨w«<Ð"8Ñ8Õ9ñ!	:ð:ñ> Ü# D¨)Ó4‰ˆˆwØ�‰ŒÜÐ<ÀÀwÔPSÐT]ÓP^Ð?_Ñ_Ô`à‡J�J„LØr?   Ú__main__)Ú__doc__r2   r   Újsonr   r   rw   Úbs4r   Úurllib.parser   r1   rz   ry   r_   ÚCATEGORYÚGROUPr   rs   r   r#   r>   rY   rf   r‰   Ú__name__Úexit© r?   r"   ú<module>r”      s˜   ðñ÷ .× -× -Ý Ý  à.€ØÐ3Ñ3€
Ø
€Ø$€	Ø!Ð !€ˆ5ð QØOØ0ñ€ð
 €	Ø
€ò
òò($ òNò,5ðp ˆzÒØ€C‡H�H‰T‹VÕð r?   