Ë
    è‡zjñ3  ã                   ó.  — 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 ej                  d«       ddlmZ ej                  j                  ej                  j                  e«      «      Zej                  j                  de«       ej                  j                  dej                  j                  edd«      «       ddlmZ dZd	Zd
Z ej*                  dd«      ZdZd„ Zd„ Zd„ Zefd„Zd„ Zd„ Zd„ Zdd„Ze dk(  r�dZ!ejD                  dd Z# e$e#«      D ])  \  Z%Z&e&dk(  sŒe%dz    e'e#«      k  sŒ	  e(e#e%dz      «      Z!Œ+ e!€?e#D ]:  Z&e&jU                  d«      jW                  «       sŒ# e(e&jU                  d«      «      Z! n  ee!¬«       yy# e)$ r Y Œw xY w)uË   
æµ·å®�å¸‚äººæ°‘æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�° çˆ¬è™« (JCMS/JPAAS)
ç«™ç‚¹: www.haining.gov.cn
æ �ç›®: col1455897 - é‡�ç‚¹é¢†åŸŸä¿¡æ�¯å…¬å¼€ > çŽ¯å¢ƒä¿�æŠ¤ (E1-2)
APIè¿”å›žå…¨é‡�åˆ—è¡¨HTMLï¼Œé€�æ�¡æŠ“å�–è¯¦æƒ…
é    NÚignore)Údatetimez..Úcrawler)Ú
fetch_pageu#   æµ·å®�å¸‚-é‡�ç‚¹é¢†åŸŸ-çŽ¯å¢ƒä¿�æŠ¤zwww.haining.gov.cnzhttps://www.haining.gov.cnÚ	SEARCH_DBz/root/search.dbaÇ  https://www.haining.gov.cn/api-gateway/jpaas-publish-server/front/page/build/unit?parseType=bulidstatic&webId=2780&tplSetId=oo54alAKysOEKkUzWqYCa&pageType=column&tagId=%E7%BB%84%E9%85%8D%E5%88%86%E7%B1%BBlist&editType=null&pageId=1455897&paramJson=%7B%22pageNo%22%3A1%2C%22pageSize%22%3A99999%2C%22search%22%3A%22%7B%5C%22xxgkId%5C%22%3A%5C%22E1-2%5C%22%2C%5C%22xxgkType%5C%22%3A%5C%22xxgk_combination%5C%22%2C%5C%22className%5C%22%3A%5C%22%5C%22%7D%22%7Dc                 óî  — | syt        j                  t        «      }|j                  d«       |j                  d«       |j                  d«       |j                  d«       |j                  d«       |j	                  «        d}d}| D ]Ø  }	 |j                  d«      xs d	dd
 }|j                  d«      xs |dd
 }|j                  d«      xs d	}|j                  d«      xs d	dd }|j                  d«      xs d	}	|j                  d«      xs |	}
|j                  d«      xs d	}|j                  dt        |	|
||||d|f	«       |j                  dkD  r|dz  }n|dz  }ŒÚ |j	                  «        	 |j                  dt        f«       |j	                  «        |j                  «        t        d|› d|› �«       |S # t        $ r	 |dz  }Y �ŒGw xY w# t        $ r}t        d|› �«       Y d}~ŒTd}~ww xY w)u;   ç›´æŽ¥è¿žæŽ¥ /root/search.dbï¼Œå†™å…¥ gov_raw + å�Œæ­¥ FTS5NzPRAGMA journal_mode=WALzPRAGMA busy_timeout=8000zPRAGMA synchronous=NORMALa"  CREATE TABLE IF NOT EXISTS gov_raw (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        site_name TEXT, source_url TEXT UNIQUE, page_url TEXT,
        title TEXT, publish_date TEXT, summary TEXT,
        content TEXT, status TEXT, category TEXT, tags TEXT,
        attachments TEXT
    )zˆCREATE VIRTUAL TABLE IF NOT EXISTS gov_search USING fts5(
        title, site_name, summary, content='gov_raw', content_rowid='id'
    )r   ÚtitleÚ iô  ÚsummaryÚcontentÚpublish_dateé
   Ú
source_urlÚurlÚattachmentszÏINSERT OR IGNORE INTO gov_raw
                (site_name, source_url, page_url, title, publish_date,
                 summary, content, status, attachments)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)Úactiveé   zÛINSERT INTO gov_search(rowid, title, site_name, summary)
            SELECT r.id, r.title, r.site_name, r.summary
            FROM gov_raw r
            WHERE r.site_name=? AND r.id NOT IN (SELECT rowid FROM gov_search)z  [FTS ERROR] u     [DB] æ–°å¢ž: u
   , è·³è¿‡: )Úsqlite3Úconnectr   ÚexecuteÚcommitÚgetÚ	SITE_NAMEÚtotal_changesÚ	ExceptionÚprintÚclose)ÚitemsÚdbÚokÚskipÚitemr	   r   r   Úpub_dater   Úpage_urlr   Úes                ú"/root/gov_crawler/crawl_haining.pyÚ	insert_dbr'   %   s
  € áØÜ	�‰œÓ	#€BØ‡J�JÐ(Ô)Ø‡J�JÐ)Ô*Ø‡J�JÐ*Ô+ð ‡J�Jð 	ô 
ð ‡J�Jð 	ô 
ð ‡I�I„Kà	
€BØ€DØò ˆð	Ø—X‘X˜gÓ&Ò,¨"¨d¨sÐ3ˆEØ—x‘x 	Ó*Ò3¨e°T°cÐ:ˆGØ—h‘h˜yÓ)Ò/¨RˆGØŸ™ Ó0Ò6°B¸¸Ð<ˆHØŸ™ ,Ó/Ò5°2ˆJØ—x‘x “Ò4¨*ˆHØŸ(™( =Ó1Ò7°RˆKà�J‰Jð 6ô ˜: x°¸Ø˜ (¨Kð8ôð ×Ñ !Ò#Ø�a‘‘à˜‘	�øð)ð0 ‡I�I„Kð$Ø
�
‰
ð Rô ˆLô		ð
 	�	‰	Œð ‡H�H„JÜ	ˆO˜B˜4˜z¨$¨Ð
0Ô1Ø€Iøô% ò 	Ø�A‰I‹Dð	ûô ò $Ü�˜q˜cÐ"×#Ñ#ûð$ús+   ÂCF>Å4'G Æ>GÇGÇ	G4ÇG/Ç/G4c                 óV  — | syt        j                  dd| t         j                  t         j                  z  ¬«      } t        j                  dd| t         j                  t         j                  z  ¬«      } t        j                  dd| t         j                  ¬«      } | j	                  «       S )uD   ä»Ž HTML ä¸­æ��å�–çº¯æ–‡æœ¬ï¼ŒåŽ»æŽ‰ <style>/<script>ï¼Œä¿�ç•™è¡¨æ ¼r
   z<style[^>]*>.*?</style>©Úflagsz<script[^>]*>.*?</script>z
<!--.*?-->)ÚreÚsubÚDOTALLÚ
IGNORECASEÚstrip)Úhtmls    r&   Úclean_contentr1   h   sp   € áØä�6‰6Ð,¨b°$¼b¿i¹iÌ"Ï-É-Ñ>WÔX€Dä�6‰6Ð.°°DÄÇ	Á	ÌBÏMÉMÑ@YÔZ€Dä�6‰6�-  T´·±Ô;€DØ�:‰:‹<Ðó    c                 ó�  — | sy| }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  dd|t         j                  ¬«      }t        j                  d	d|t         j                  ¬«      }t        j                  d
d|t         j                  ¬«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }|j                  «       S )uK   å°†æ¸…æ´—å�Žçš„ HTML è½¬ä¸ºçº¯æ–‡æœ¬ï¼ˆä½†ä¿�ç•™è¡¨æ ¼ HTML æ ‡ç­¾å� ä½�ï¼‰r
   z	<br\s*/?>ú
r)   z</p>z</div>z</li>z</tr>z</th>z</td>zT<(?!/?table|/?tr|/?td|/?th|/?thead|/?tbody|/?tfoot|/?caption|/?colgroup|/?col)[^>]*>z&nbsp;ú z&lt;ú<z&gt;ú>z&amp;ú&z\n{3,}z

z[ \t]+)r+   r,   r.   r/   )r0   Útexts     r&   Úextract_text_contentr:   u   sB  € áØà€Dä�6‰6�,  d´"·-±-Ô@€DÜ�6‰6�'˜4 ¬R¯]©]Ô;€DÜ�6‰6�)˜T 4¬r¯}©}Ô=€DÜ�6‰6�(˜D $¬b¯m©mÔ<€DÜ�6‰6�(˜D $¬b¯m©mÔ<€DÜ�6‰6�(˜D $¬b¯m©mÔ<€DÜ�6‰6�(˜D $¬b¯m©mÔ<€Dä�6‰6ÐiÐkmÐosÓt€Dä�6‰6�)˜S $Ó'€DÜ�6‰6�'˜3 Ó%€DÜ�6‰6�'˜3 Ó%€DÜ�6‰6�(˜C Ó&€DÜ�6‰6�)˜V TÓ*€DÜ�6‰6�)˜S $Ó'€DØ�:‰:‹<Ðr2   c                 ód  — | syd}t        j                  d|z   dz   | t         j                  «      }|syg }|D ]f  \  }}}}|j                  d«      r|n%|j	                  d«      dz   |j                  d«      z   }|j                  d|j                  «       › d|› d	�«       Œh d
j                  |«      S )u9   ä»Ž HTML ä¸­æ��å�–é™„ä»¶é“¾æŽ¥ï¼Œè¿”å›žé™„ä»¶æ��è¿°æ–‡æœ¬r
   z1\.(doc|docx|pdf|xls|xlsx|rar|zip)(\?[^\s"\'<>]*)?z<a[^>]*href=["\']([^"\']*?(?:z))["\'][^>]*>([^<]*)</a>Úhttpú/u	   [é™„ä»¶: z](ú)r4   )	r+   Úfindallr.   Ú
startswithÚrstripÚlstripÚappendr/   Újoin)	r0   Úbase_urlÚext_patternÚlinksÚpartsÚhrefÚ_r9   Úfull_urls	            r&   Úextract_attachmentsrL   �   s¼   € áØØF€KÜ�J‰JØ(¨;Ñ6Ð9TÑTØŒb�m‰mó€Eñ ØØ€EØ!ò >Ñˆˆa��DØŸ?™?¨6Ô2‘4¸¿¹ÈÓ9MÐPSÑ9SÐVZ×VaÑVaÐbeÓVfÑ9fˆØ�‰�y §¡£ ¨b°°
¸!Ð<Õ=ð>ð �9‰9�UÓÐr2   c           	      ó  — g }| s|S t        j                  dt         j                  t         j                  z  «      }|j	                  | «      D ]º  }|j                  d«      j                  «       }|j                  d«      j                  «       }|j                  d«      j                  «       }|r|sŒe|j                  d«      s*t        j                  d«      dz   |j                  d«      z   n|}|}|j                  |||||dœ«       Œ¼ |S )u<   ä»Ž API è¿”å›žçš„ json['data']['html'] ä¸­æ��å�–æ–‡ç« åˆ—è¡¨z¹<li\s+class=["\']cf["\'][^>]*>.*?<a\s+class=["\']fl["\'][^>]*href=["\']([^"\']+)["\'][^>]*title=["\']([^"\']*)["\'][^>]*>.*?</a>.*?<span\s+class=["\']fr["\'][^>]*>([^<]*)</span>.*?</li>r   é   é   r<   r=   )rI   r$   r   r	   Údate)r+   Úcompiler-   r.   ÚfinditerÚgroupr/   r@   ÚBASE_URLrA   rB   rC   )	r0   r   ÚpatternÚmrI   r	   Údate_strr$   r   s	            r&   Úparse_list_htmlrX   £   sø   € à€EÙØˆô �j‰jð	ô 	�	‰	”B—M‘MÑ!ó€Gð ×Ñ˜dÓ#ò ˆØ�w‰w�q‹z×ÑÓ!ˆØ—‘˜“
× Ñ Ó"ˆØ—7‘7˜1“:×#Ñ#Ó%ˆÙ™5ØØHLÏÉÐX^ÔH_”8—?‘? 3Ó'¨#Ñ-°·±¸CÓ0@Ò@ÐeiˆØˆ
Ø�‰ØØ Ø"ØØñ
õ 	ðð €Lr2   c                 ó’  — | d   }t        |d¬«      }|st        d|› �«       yd}t        j                  d|t        j                  «      }|r |j                  d«      j                  «       }n�t        j                  d|t        j                  «      }|r |j                  d«      j                  «       }nFt        j                  d	|t        j                  «      }|r|j                  d«      j                  «       }t        j                  d
|t        j                  t        j                  z  «      }|s6t        j                  d|t        j                  t        j                  z  «      }|st        d|› �«       y|j                  d«      }t        |«      }	t        |«      }
t        |	«      }|
r|j                  «       dz   |
z   }|||
dœS )u"   èŽ·å�–è¯¦æƒ…é¡µ div.article å†…å®¹r$   é   ©Útimeoutu     âš  è¯¦æƒ…é¡µèŽ·å�–å¤±è´¥: NzC<meta\s+name=["\']ArticleTitle["\'][^>]*content=["\']([^"\']+)["\']r   z7<div[^>]*class=["\']title["\'][^>]*>\s*([^<]+)\s*</div>z<title>([^<]+)</title>z;<div[^>]*class=["\']article["\'][^>]*>(.*?)</div>\s*(?:<|$)zi<div[^>]*class=["\'](?:content|main|text|TRS_Editor)["\'](?:[^>]*class=["\'][^>]*)?>(.*?)</div>\s*(?:<|$)u     âš  æœªæ‰¾åˆ°å†…å®¹å®¹å™¨: u   

--- é™„ä»¶ ---
)r	   r   r   )r   r   r+   Úsearchr.   rS   r/   r-   r1   rL   r:   rA   )r"   r   r0   Údetail_titleÚmtÚdtÚttrV   Úraw_htmlÚcleanedr   Útext_contents               r&   Úfetch_detailre   Å   s¾  € à
ˆzÑ
€CÜ�c 2Ô&€DÙÜÐ-¨c¨UÐ3Ô4Øð €Lä	�‰ÐYÐ[_Ôac×anÑanÓ	o€BÙ	Ø—x‘x “{×(Ñ(Ó*‰ô �Y‰YÐQÐSWÔY[×YbÑYbÓcˆÙØŸ8™8 A›;×,Ñ,Ó.‰Lô —‘Ð4°d¼B¿M¹MÓJˆBÙØ!Ÿx™x¨›{×0Ñ0Ó2�ô 	�	‰	ÐPÐRVÔXZ×XaÑXaÔdf×dqÑdqÑXqÓr€AÙä�I‰Ið  Cð  EIô  KM÷  KTñ  KTô  WY÷  Wdñ  Wdñ  Kdó  eˆÙÜÐ-¨c¨UÐ3Ô4Øà�w‰w�q‹z€Hä˜HÓ%€Gä% hÓ/€Kä'¨Ó0€Lñ Ø#×*Ñ*Ó,Ð/EÑEÈÑSˆð ØØ"ñð r2   c                 ó  — | sy| j                  «       } t        j                  d| «      }|r…t        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d«      «      }}}d|cxk  rdk  r,n n)d|cxk  rdk  rn nd|cxk  rd	k  rn n|d
›d|d›d|d›�S t        j                  d| «      }|r…t        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d«      «      }}}d|cxk  rdk  r,n n)d|cxk  rdk  rn nd|cxk  rd	k  rn n|d
›d|d›d|d›�S t        j                  d| «      }|r…t        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d«      «      }}}d|cxk  rdk  r,n n)d|cxk  rdk  rn nd|cxk  rd	k  rn n|d
›d|d›d|d›�S t        j                  d| «      }|r…t        |j	                  d«      «      t        |j	                  d«      «      t        |j	                  d«      «      }}}d|cxk  rdk  r,n n)d|cxk  rdk  rn nd|cxk  rd	k  rn n|d
›d|d›d|d›�S | dd S )u)   å°†å�„ç§�æ ¼å¼�çš„æ—¥æœŸè½¬ä¸º YYYY-MM-DDr
   z(\d{4})-(\d{1,2})-(\d{1,2})r   rN   rO   iÆ  i3  é   é   Ú04dú-Ú02dz(\d{4})/(\d{1,2})/(\d{1,2})u"   (\d{4})å¹´(\d{1,2})æœˆ(\d{1,2})æ—¥z(\d{4})(\d{2})(\d{2})Nr   )r/   r+   ÚmatchÚintrS   )rW   rV   ÚyÚmoÚds        r&   Únormalize_daterq   û   s,  € áØØ�~‰~Ó€Hä
�‰Ð/°Ó:€AÙÜ�q—w‘w˜q“z“?¤C¨¯©°«
£O´S¸¿¹À»³_ˆqˆ2ˆØ�1Ô˜Õ  b¤¨B¥°1¸´<¸Rµ<Ø˜�W˜A˜b ˜X Q q¨ gÐ.Ð.ä
�‰Ð/°Ó:€AÙÜ�q—w‘w˜q“z“?¤C¨¯©°«
£O´S¸¿¹À»³_ˆqˆ2ˆØ�1Ô˜Õ  b¤¨B¥°1¸´<¸Rµ<Ø˜�W˜A˜b ˜X Q q¨ gÐ.Ð.ä
�‰Ð6¸ÓA€AÙÜ�q—w‘w˜q“z“?¤C¨¯©°«
£O´S¸¿¹À»³_ˆqˆ2ˆØ�1Ô˜Õ  b¤¨B¥°1¸´<¸Rµ<Ø˜�W˜A˜b ˜X Q q¨ gÐ.Ð.ä
�‰Ð)¨8Ó4€AÙÜ�q—w‘w˜q“z“?¤C¨¯©°«
£O´S¸¿¹À»³_ˆqˆ2ˆØ�1Ô˜Õ  b¤¨B¥°1¸´<¸Rµ<Ø˜�W˜A˜b ˜X Q q¨ gÐ.Ð.Ø�C�Rˆ=Ðr2   c                 óÌ  — t        dd› �«       t        dt        › �«       t        d› «       t        d«       t        t        d¬«      }|st        d«       y 	 t	        j
                  |«      }|j                  d	i «      j                  d
«      }|st        d«       t        d|d d › �«       y t        |«      }t        dt        |«      › d�«       |st        d«       y | r'| dkD  r"| t        |«      k  r|d |  }t        d| › d�«       d}d}g }t        |d«      D ]Æ  \  }	}
t        d|	› dt        |«      › d|
d   d d › d�«       t        d|
d   › d|
d   d d › d�«       t        |
«      }|€|dz  }ŒXt        |
d   «      }|j                  d«      xs |
d   }|d d }|d   }|j                  ||
d   |
d   ||||d    d!œ«       |dz  }t        d"t        |«      › d#�«       ŒÈ t        dd› �«       t        d$|› d%|› �«       |rt        |«       t        d› «       t        d&t        |«      › d'|› d(|› �«       y # t        j                  $ r}t        d|› �«       Y d }~y d }~ww xY w))Nr4   z<============================================================u   ðŸš€ u   
ðŸ“¥ èŽ·å�–åˆ—è¡¨...é<   r[   u   â�Œ API è¯·æ±‚å¤±è´¥u   â�Œ JSON è§£æž�å¤±è´¥: Údatar0   u   â�Œ æœªæ‰¾åˆ° data.htmlu      APIå“�åº”å‰�200å­—: éÈ   u      APIè¿”å›ž: u    æ�¡u%   â�Œ åˆ—è¡¨ä¸ºç©ºï¼Œæ£€æŸ¥è§£æž�é€»è¾‘r   u      --pages é™�åˆ¶: å�–å‰� r   z
[r=   z] r	   é2   z...u      æ—¥æœŸ: rP   z   URL: r$   r   r   r   )r	   r   r   r   r   r   r   u      âœ… æ­£æ–‡é•¿åº¦: u    å­—u    ðŸ“¦ å†™å…¥æ•°æ�®åº“... æˆ�åŠŸ: u
   , å¤±è´¥: u   âœ… å®Œæˆ�! å…±å¤„ç�† u    æ�¡ï¼Œæˆ�åŠŸ u
   ï¼Œå¤±è´¥ )r   r   r   ÚAPI_URLÚjsonÚloadsÚJSONDecodeErrorr   rX   ÚlenÚ	enumeratere   rq   rC   r'   )Ú	max_itemsÚapi_resprt   r%   Ú	list_htmlÚ	all_itemsÚsuccessÚfailÚdb_itemsÚir"   Údetailr#   Údb_titler   Úcontent_texts                   r&   Úrunrˆ     sÂ  € Ü	ˆBˆvˆhˆ-ÔÜ	ˆE”)�Ð
ÔÜ	ˆVˆHÔô 
Ð
"Ô#Üœ'¨2Ô.€HÙÜÐ$Ô%ØðÜ�z‰z˜(Ó#ˆð
 —‘˜ Ó$×(Ñ(¨Ó0€IÙÜÐ'Ô(ÜÐ'¨°°#¨Ð'7Ð8Ô9Øô   	Ó*€IÜ	ˆNœ3˜y›>Ð*¨$Ð
/Ô0áÜÐ5Ô6Øñ �Y ’] y´3°y³>Ò'AØ˜j˜yÐ)ˆ	ÜÐ*¨9¨+°TÐ:Ô;ð €GØ€DØ€Hä˜Y¨Ó*ò ?‰ˆˆ4Ü��A�3�aœ˜I›Ð' r¨$¨w©-¸¸Ð*<Ð)=¸SÐAÔBÜ�˜D ™L˜>¨°$°zÑ2BÀ3ÀBÐ2GÐ1HÈÐLÔMä˜dÓ#ˆØˆ>Ø�A‰IˆDØä! $ v¡,Ó/ˆà—:‘:˜gÓ&Ò7¨$¨w©-ˆØ˜4˜C�.ˆØ˜iÑ(ˆà�‰ØØ˜|Ñ,Ø˜
Ñ#Ø$ØØ#Ø! -Ñ0ñ
ô 	ð 	�1‰ˆäÐ%¤c¨,Ó&7Ð%8¸Ð=Õ>ð5?ô: 
ˆBˆvˆhˆ-ÔÜ	Ð,¨W¨I°ZÀ¸vÐ
FÔGÙÜ�(ÔÜ	ˆVˆHÔÜ	Ð"¤3 y£>Ð"2°.ÀÀ	ÈÐTXÐSYÐ
ZÕ[øô} ×Ñò ÜÐ'¨ sÐ+Ô,Üûðús   ÁH8 È8I#ÉIÉI#Ú__main__r   z--pagesrj   )r}   )N),Ú__doc__ÚsysÚosr+   rx   r   ÚwarningsÚfilterwarningsr   ÚpathÚdirnameÚabspathÚ__file__Ú_HEREÚinsertrD   Úcrawler_libr   r   ÚDOMAINrT   Úgetenvr   rw   r'   r1   r:   rL   rX   re   rq   rˆ   Ú__name__Ú	max_pagesÚargvÚargsr|   r„   Úargr{   rm   Ú
ValueErrorrB   Úisdigit© r2   r&   ú<module>r       sª  ðñ÷ ,× +× +Ø €× Ñ ˜Ô !Ý ð 	�‰�‰˜Ÿ™Ÿ™¨Ó1Ó2€Ø ‡�‡���5Ô Ø ‡�‡���2—7‘7—<‘<  t¨YÓ7Ô 8å "ð 2€	Ø	€Ø'€ØˆB�I‰I�kÐ#4Ó5€	ðað ò?òF
òð6 (0ó ò&òD2òlóBL\ð^ ˆzÒà€IØ�8‰8�A�Bˆ<€DÙ˜D“/ò ‰ˆˆ3Ø�)Ó  A¡©¨D«	Ó 1ðÙ  Q¨¡U¡Ó,‘	ðð ÐØò 	ˆCØ�z‰z˜#‹×&Ñ&Õ(Ù §
¡
¨3£Ó0�	Ùð	ñ
 �)Öð# øð ò Ùðús   Ä0FÆFÆF