Ë
    V_ŠjÜ-  ã                   óØ  — 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mZm	Z	 ddl
Z
ddlmZ ddlmZ dZedz   Zedz   Zd	Zd
ZdZdZ ej,                  dd«      ZdddddddœZddiZ e
j4                  «       Zej8                  j;                  e«       d„ Zd„ Zd„ Z d#d„Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&d$d!„Z'e(d"k(  r/ e)ejT                  «      dkD  rejT                  d   nd Z+ e'e+«       yy)%uI  
å¹¿æ˜ŒåŽ¿äººæ°‘æ”¿åºœ - éƒ¨é—¨å…¬å‘Š
URL: http://www.jxgc.gov.cn/col/col6875/index.html
CMS: TRS WCM (jpage dataproxy POST åˆ†é¡µ)
List: HTMLç¬¬1é¡µå†…åµŒXML datastore (45æ�¡/é¡µ)
      è¡¥å……æ•°æ�®ä»Ž dataproxy.jsp?page=1 POST èŽ·å�– (301æ�¡, åŽ»é‡�å�Žçº¦å�¯è¦†ç›–5é¡µ)
Detail: div#zoom (è¡¨æ ¼HTMLä¿�ç•™ï¼Œæ®µè�½æ��å�–æ–‡æœ¬)
é    N)ÚdatetimeÚ	timedelta)ÚBeautifulSoup)Úurljoinzhttp://www.jxgc.gov.cnz/col/col6875/index.htmlz/module/web/jpage/dataproxy.jspu   å¹¿æ˜ŒåŽ¿äººæ°‘æ”¿åºœu   éƒ¨é—¨å…¬å‘Šu   æ±Ÿè¥¿é   Ú	SEARCH_DBz/root/search.dbé   é	   ú/iÛ  i7 )ÚpageÚappidÚwebidÚpathÚcolumnidÚunitidz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36c                 ó<   — t        | t        j                  d¬«       y )NT)ÚfileÚflush)ÚprintÚsysÚstderr)Úmsgs    ú/root/gov_crawler/crawl_jxgc.pyÚlogr   &   s   € Ü	ˆ#”C—J‘J dÖ+ó    c                 ó*  — | syt        j                  | «      } t        j                  dd| t        j                  ¬«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd	| «      } | j                  «       S )
z1Convert HTML to clean plain text for FTS summary.Ú zH</?(?:p|div|h[1-6]|li|tr|blockquote|section|article|table|br\s*/?)[^>]*>ú
)Úflagsz<[^>]+>z[ \t]+ú z\n{3,}ú

)ÚhtmlÚunescapeÚreÚsubÚ
IGNORECASEÚstrip)Útexts    r   Ú
strip_htmlr)   *   sv   € áØÜ�=‰=˜Ó€DÜ�6‰6Ð]Ð_cÐeiÔqs×q~Ñq~Ô€DÜ�6‰6�*˜b $Ó'€DÜ�6‰6�)˜S $Ó'€DÜ�6‰6�)˜V TÓ*€DØ�:‰:‹<Ðr   c           
      óH  — 	 t        j                  t        d¬«      }| j                  d«      xs ddd }| j                  d«      xs ddd }t	        | j                  d	«      xs d«      }| j                  d
«      xs ddd }| j                  d«      xs ddd }t        j                  | j                  d«      xs g d¬«      }|j                  d|f«      j                  «       }|D ]  \  }	|j                  d|	f«       Œ |j                  d|||||||f«       |j                  d«      j                  «       d   }
|r|dd n|dd }|j                  d|
|||f«       |j                  «        |j                  «        y# t        $ r}t        d|› �«       Y d}~yd}~ww xY w)u:   å°†å�•æ�¡è®°å½•å†™å…¥ search.db (gov_raw + gov_search FTS)é
   ©ÚtimeoutÚtitler   Niô  Úpage_urliè  ÚcontentÚpublish_dateé   Ú	site_nameÚunknownéd   ÚattachmentsF©Úensure_asciiz,SELECT rowid FROM gov_raw WHERE page_url = ?z&DELETE FROM gov_search WHERE rowid = ?zšINSERT OR REPLACE INTO gov_raw (title, page_url, content, publish_date, site_name, source_url, status, attachments) VALUES (?, ?, ?, ?, ?, ?, 'synced', ?)zSELECT last_insert_rowid()r   zWINSERT OR REPLACE INTO gov_search(rowid, title, site_name, summary) VALUES (?, ?, ?, ?)Tz  [ERR] DB import failed: )Úsqlite3ÚconnectÚDB_PATHÚgetr)   ÚjsonÚdumpsÚexecuteÚfetchallÚfetchoneÚcommitÚcloseÚ	Exceptionr   )ÚrecordÚdbr.   r/   r0   r1   r3   Úattachments_strÚ
old_rowidsÚridÚ	new_rowidÚsummaryÚes                r   Úimport_to_dbrM   6   s¬  € ð"Ü�_‰_œW¨bÔ1ˆØ—‘˜GÓ$Ò*¨¨D¨SÐ1ˆØ—J‘J˜zÓ*Ò0¨b°%°4Ð8ˆÜ˜VŸZ™Z¨	Ó2Ò8°bÓ9ˆØŸ
™
 >Ó2Ò8°b¸#¸2Ð>ˆØ—Z‘Z Ó,Ò9°	¸4¸CÐ@ˆ	ÜŸ*™* V§Z¡Z°Ó%>Ò%DÀ"ÐSXÔYˆð —Z‘ZØ:¸X¸Kó
ç
‰(‹*ð 	ð !ò 	I‰FˆSØ�J‰JÐ?À#ÀÕHð	Ið 	�
‰
ð iØ�H˜g |°YÀÈ/ÐZô	
ð —J‘JÐ;Ó<×EÑEÓGÈÑJˆ	Ù#*�'˜$˜3‘-°°d°s°ˆØ
�
‰
ØeØ˜˜y¨'Ð2ô	
ð 	�	‰	ŒØ
�‰Œ
ØøÜò ÜÐ(¨¨Ð,Ô-Üûðús   ‚E=F  Æ 	F!Æ	FÆF!c                 óø   — 	 |rt         j                  | |d¬«      }nt         j                  | d¬«      }d|_        |j                  dk(  r|j
                  S dS # t        $ r}t        d|› �«       Y d}~yd}~ww xY w)uE   è¯·æ±‚æ”¿åºœç«™ï¼ˆæ”¿åºœç«™å“�åº”å�¯èƒ½è¾ƒæ…¢ï¼Œä½¿ç”¨è¾ƒé•¿è¶…æ—¶ï¼‰)r+   é   )Údatar-   r,   zutf-8éÈ   Nz  [ERR] fetch failed: )ÚsessionÚpostr<   ÚencodingÚstatus_coder(   rD   r   )ÚurlÚ	post_dataÚrrL   s       r   ÚfetchrY   ]   st   € ð	ÙÜ—‘˜S y¸(�ÓC‰Aä—‘˜C¨�Ó2ˆAØˆŒ
ØŸ™¨#Ò-ˆq�v‰vÐ7°4Ð7øÜò ÜÐ$ Q CÐ(Ô)Üûðús   ‚AA ÁA Á	A9Á!A4Á4A9c                 óÊ  — g }t        j                  d| t         j                  «      }|D ]¶  }t        j                  d|«      }t        j                  d|«      }|sŒ2|sŒ5|j	                  d«      j                  «       }|j	                  d«      j                  «       }|j	                  d«      j                  «       }t        t        |«      }	|j                  |	||dœ«       Œ¸ |S )uE   ä»ŽCDATAç‰‡æ®µè§£æž�åˆ—è¡¨é¡¹ï¼šurl, title(dateå®Œæ•´ä¸�æˆªæ–­), datez&<record><!\[CDATA\[(.*?)\]\]></record>z%<a\s+href='([^']+)'\s*title='([^']*)'z(class="bt-data-time"[^>]*>([^<]+)</span>r	   é   )rV   r.   Údate)	r$   ÚfindallÚDOTALLÚsearchÚgroupr'   r   ÚBASEÚappend)
Ú
cdata_textÚitemsÚrecordsÚcdataÚa_matchÚ
span_matchÚhrefr.   Údate_strÚfull_urls
             r   Úparse_list_itemsrl   k   sÆ   € à€EÜ�j‰jÐBÀJÔPR×PYÑPYÓZ€GØò NˆÜ—)‘)ÐDÀeÓLˆÜ—Y‘YÐJÈEÓRˆ
Ú’zØ—=‘= Ó#×)Ñ)Ó+ˆDØ—M‘M !Ó$×*Ñ*Ó,ˆEØ!×'Ñ'¨Ó*×0Ñ0Ó2ˆHÜœt TÓ*ˆHØ�L‰L °EÀ8ÑLÕMðNð €Lr   c                  ó®   — t        t        «      } | sg S t        j                  d| t        j                  «      }|sg S t        |j                  d«      «      S )u)   ä»ŽHTMLç¬¬1é¡µå†…åµŒdatastoreèŽ·å�–åˆ—è¡¨z<datastore>(.*?)</datastore>r	   )rY   ÚLIST_URLr$   r_   r^   rl   r`   )r"   Úms     r   Úget_page1_itemsrp   {   sE   € ä”‹?€DÙØˆ	Ü
�	‰	Ð1°4¼¿¹ÓC€AÙØˆ	Ü˜AŸG™G A›JÓ'Ð'r   c                  ó\   — t        t        t        t        «      ¬«      } | sg S t	        | «      S )u%   ä»Ždataproxy page=1èŽ·å�–è¡¥å……æ•°æ�®)rW   )rY   Ú	PROXY_URLÚdictÚPROXY_PARAMSrl   )Úxml_texts    r   Úget_proxy_itemsrv   †   s&   € ä”Y¬$¬|Ó*<Ô=€HÙØˆ	Ü˜HÓ%Ð%r   c                 óè  — t        | «      }|sdg |fS t        |d«      }|j                  dddi¬«      }|r%|j                  d«      r|d   j	                  «       }n>|j                  d«      }|r|j                  d	¬
«      n|}t        j                  dd|«      }|r||k(  r|}d}|j                  dddi¬«      }|r'|j                  d«      r|d   j	                  «       dd }g }	|j                  dt        j                  dt        j                  «      ¬«      D ]Y  }
|
j                  dd«      j	                  «       }|sŒ&|
j                  d	¬
«      xs d}|	j                  |t        | |«      dœ«       Œ[ |j                  dd¬«      }|s&|j                  dt        j                  d«      ¬«      }|sd|	|fS |j                  g d¢«      D ]  }|j                  «        Œ g }|j                  D �]
  }|j                  €Œ|j                  j!                  «       }|dk(  rXt        t#        |«      d«      }|j                  ddg«      D ]  }|j%                  «        Œ |j                  t#        |«      «       Œˆ|dk(  rœ|j                  d«      }|r_|D ]Y  }t        t#        |«      d«      }|j                  ddg«      D ]  }|j%                  «        Œ |j                  t#        |«      «       Œ[ Œÿ|j                  dd	¬«      }|s�Œ|j                  |«       �Œ)|dk(  r¯|j                  dd ¬!«      }|r`|D ]Y  }t        t#        |«      d«      }|j                  ddg«      D ]  }|j%                  «        Œ |j                  t#        |«      «       Œ[ �Œ£|j                  dd	¬«      }|s�Œºt'        |«      d"kD  s�ŒÊ|j                  |«       �ŒÝ|d#v s�Œã|j                  dd	¬«      }|s�Œú|j                  |«       �Œ d$j)                  |«      j	                  «       }t'        |«      d"k  r%|	r#d%| › d&|› d'�}|	D ]  }|d(|d   › d)|d*   › d+�z  }Œ n"|r |	r|d,z  }|	D ]  }|d(|d   › d)|d*   › d+�z  }Œ ||	|fS )-u^   æ��å�–è¯¦æƒ…é¡µï¼šå®Œæ•´æ ‡é¢˜(meta ArticleTitle)ã€�æ­£æ–‡(è¡¨æ ¼HTMLä¿�ç•™)ã€�é™„ä»¶ã€�æ—¥æœŸNzhtml.parserÚmetaÚnameÚArticleTitle)Úattrsr0   r.   T)r'   u   ^å¹¿æ˜ŒåŽ¿äººæ°‘æ”¿åºœ\s*\S*\s*r   ÚPubDater+   Úaz"\.(doc|docx|pdf|xls|xlsx|zip|rar)$)ri   ri   u   é™„ä»¶)ry   rV   ÚdivÚzoom)Úidz!bt-article-02|bfr_article_content)Úclass_)ÚscriptÚstylerx   ÚtableÚspanÚfontÚp)Ú	separatorr'   F)Ú	recursiver2   )Úh1Úh2Úh3Úh4Úh5r!   z<p><a href="z">z</a></p>z
[z](rV   ú)u   

**é™„ä»¶ï¼š**)rY   r   Úfindr<   r'   Úget_textr$   r%   Úfind_allÚcompileÚIrb   r   Ú	decomposeÚchildrenry   ÚlowerÚstrÚunwrapÚlenÚjoin)Ú
detail_urlÚ
list_titler"   ÚsoupÚ
meta_titleÚ
full_titleÚ	title_tagrj   Ú	meta_dater6   Úa_tagri   ry   r   ÚtagÚpartsÚchildÚtag_nameÚtbl_soupÚspÚinner_tablesÚtr(   r0   Úatts                            r   Úextract_detailr­   Ž   s}  € ä�Ó€DÙØ�R˜Ð#Ð#ä˜˜}Ó-€Dð —‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ø 	Ñ*×0Ñ0Ó2‰
à—I‘I˜gÓ&ˆ	Ù7@�Y×'Ñ'¨dÐ'Ô3Àjˆ
Ü—V‘VÐ>ÀÀJÓOˆ
á˜ zÒ1Øˆ
ð €HØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø˜YÑ'×-Ñ-Ó/°°Ð4ˆð €KØ—‘˜s¬¯©Ð4YÔ[]×[_Ñ[_Ó)`�Óaò QˆØ�y‰y˜ Ó$×*Ñ*Ó,ˆÚØ—>‘>¨�>Ó-Ò9°ˆDØ×Ñ¨´W¸ZÈÓ5NÑOÕPð	Qð �9‰9�U˜vˆ9Ó&€DÙØ�y‰y˜¤r§z¡zÐ2VÓ'WˆyÓXˆÙØ�[ *Ð,Ð,ð �}‰}Ò8Ó9ò ˆØ�‰�ðð €EØ—‘ó &#ˆØ�:‰:ÐØØ—:‘:×#Ñ#Ó%ˆà�wÒä$¤S¨£Z°Ó?ˆHØ×'Ñ'¨°Ð(8Ó9ò �Ø—	‘	•ðà�L‰Lœ˜X›Õ'Ø˜Š_Ø Ÿ>™>¨'Ó2ˆLÙØ%ò 0�AÜ,¬S°«V°]ÓC�HØ&×/Ñ/°¸Ð0@ÓAò $˜ØŸ	™	�ð$à—L‘L¤ X£Õ/ñ	0ð —~‘~°¸$�~Ó?�ÛØ—L‘L Ö&Ø˜ÒØ Ÿ>™>¨'¸U˜>ÓCˆLÙØ%ò 0�AÜ,¬S°«V°]ÓC�HØ&×/Ñ/°¸Ð0@ÓAò $˜ØŸ	™	�ð$à—L‘L¤ X£Õ/ò	0ð —~‘~°¸$�~Ó?�ÛœC ›I¨œNØ—L‘L Ö&ØÐ7Ó7Ø—>‘>¨B°d�>Ó;ˆDÛØ—‘˜TÖ"ðM&#ðP �k‰k˜%Ó ×&Ñ&Ó(€Gô ˆ7ƒ|�bÒ™[Ø   ¨B¨z¨l¸(ÐCˆØò 	:ˆCØ˜˜S ™[˜M¨¨C°©J¨<°qÐ9Ñ9‰Gñ	:á	‘[ØÐ&Ñ&ˆØò 	:ˆCØ˜˜S ™[˜M¨¨C°©J¨<°qÐ9Ñ9‰Gð	:ð �K Ð+Ð+r   c           	      ó<  — | j                  dd«      | j                  dd«      | j                  dd«      | j                  dd«      | j                  dg «      t        › dt        › �t        t        dœ}t	        t        j                  |d	¬
«      «       t        |«      }|S )Nr.   r   rV   r\   r0   r6   ú-)r.   r/   r1   r0   r6   r3   ÚcolumnÚprovinceFr7   )r<   ÚSITEÚCOLUMNÚPROVINCEr   r=   r>   rM   )ÚitemÚidxrE   Úoks       r   Úoutput_itemr¸   ó   s‡   € à—‘˜' 2Ó&Ø—H‘H˜U BÓ'ØŸ™ ¨Ó,Ø—8‘8˜I rÓ*Ø—x‘x ¨rÓ2Ü�v˜Qœv˜hÐ'ÜÜñ	€Fô 
Œ$�*‰*�V¨%Ô
0Ô1ä	�fÓ	€BØ€Ir   Úincrementalc                 óT  — | dk(  rƒt        dd› �«       t        dt        › dt        › �«       t        d«       t        d› «       t        j                  «       t        d¬«      z
  }t        «       }t        d	t        |«      › d
�«       �n)t        dd› �«       t        dt        › dt        › �«       t        dt        › d�«       t        d› «       t        j                  «       t        d¬«      z
  }t        «       }t        dt        |«      › d
�«       t        «       }|D �ch c]  }|d   ’Œ	 }}|D �ch c]  }|d   ’Œ	 }}|D �cg c]  }|d   |vsŒ|‘Œ }}t        |«      }	|	t        dz
  z  }
|d|
 }t        dt        dz
  › dt        |«      › d
�«       ||z   }t        dt        |«      › d
�«       t        |«      }d}t        |d«      D ]§  \  }}	 t        j                  |d   d«      }||k  rŒ&	 t        |d   |d   «      \  }}}|€t        d|› d|› d|d   dd › �«       ŒZ||d<   ||d<   ||d<   t        ||«      r|dz  }|d z  dk(  rt        d!|› d|› �«       t!        j"                  d"«       Œ© t        d#|› d$�«       |S c c}w c c}w c c}w # t        t        f$ r Y Œ´w xY w)%ut   çˆ¬å�–ï¼š
    - incremental: å�ªçˆ¬ç¬¬1é¡µï¼ˆ45æ�¡ï¼‰
    - full: çˆ¬5é¡µï¼ˆä»Žç¬¬1é¡µ+è¡¥å……æ•°æ�®ï¼ŒåŽ»é‡�ï¼‰
    r¹   r   z2==================================================u   ðŸ�  z - u   ðŸ“„ å¢žé‡�ï¼ˆç¬¬1é¡µï¼‰é0   )Úhoursu	   ç¬¬1é¡µ: u   æ�¡u   ðŸ“„ å…¨é‡�å‰�u   é¡µiG  )Údaysu   ç¬¬1é¡µ (HTML): rV   r	   Nu   è¡¥å…… (dataproxyåŽ»é‡�, u   é¡µ): u   å�ˆè®¡: r   r\   z%Y-%m-%dr.   z  [r   u   ] â�­ï¸� è¯¦æƒ…ç©º: é(   r0   r6   r2   z  [PROGRESS] g333333Ó?u   
[DONE] å…±å¤„ç�† u    æ�¡)r   r²   r³   r   Únowr   rp   rš   ÚTOTAL_PAGESrv   Ú	enumerateÚstrptimeÚ
ValueErrorÚKeyErrorr­   r¸   ÚtimeÚsleep)ÚlabelÚcutoffrd   Úpage1Úproxy_itemsÚiÚ
proxy_urlsÚ
page1_urlsÚextraÚextra_per_pageÚextra_limitÚtotalÚok_countr¶   rµ   Ú	item_dater0   r6   r    s                      r   Ú	crawl_allrÔ     sÖ  € ð
 �ÒÜˆb��ˆMÔÜˆe”D�6˜œV˜HÐ%Ô&ÜÐ&Ô(ÜˆvˆhÔÜ—‘“¤)°"Ô"5Ñ5ˆäÓ!ˆÜˆiœ˜E›
�| 3Ð'Ö(äˆb��ˆMÔÜˆe”D�6˜œV˜HÐ%Ô&Üˆnœ[˜M¨Ð-Ô.ÜˆvˆhÔÜ—‘“¤)°Ô"9Ñ9ˆô  Ó!ˆÜÐœs 5›z˜l¨#Ð.Ô/ô &Ó'ˆØ(3Ö4 1�a˜“hÐ4ˆ
Ð4Ø(-Ö. 1�a˜“hÐ.ˆ
Ð.Ø'ÖF�q¨1¨U©8¸:Ò+E’ÐFˆÐFä˜U›ˆØ$¬°a©Ñ8ˆØ�l�{Ð#ˆÜÐ'¬°A© °f¼SÀ»Z¸LÈÐLÔMà˜‘ˆÜˆh”s˜5“z�l #Ð&Ô'ä�‹J€EØ€HÜ˜u aÓ(ò ‰	ˆˆTð	Ü ×)Ñ)¨$¨v©,¸
ÓCˆIØ˜6Ò!Øð "ô
 ,:¸$¸u¹+ÀtÈGÁ}Ó+UÑ(ˆ�˜jØˆ?Ü�#�c�U˜!˜E˜7Ð"6°t¸G±}ÀSÀbÐ7IÐ6JÐKÔLØØ"ˆˆW‰Ø!ˆˆY‰Ø)ˆˆ]ÑÜ�t˜SÔ!Ø˜‰MˆHØ�‰8�qŠ=Ü�- ˜u A e WÐ-Ô.Ü�
‰
�3�ð)ô, Ð
˜h˜Z tÐ,Ô-Ø€OùòK 5ùÚ.ùÚFøô$ œHÐ%ò 	Ùð	ús*   Ä JÄ2JÅJÅJÇJÊJ'Ê&J'Ú__main__)N)r¹   ),Ú__doc__r   Úosr$   r=   rÅ   r9   r"   r   r   ÚrequestsÚbs4r   Úurllib.parser   ra   rn   rr   r²   r³   r´   rÀ   Úgetenvr;   rt   ÚHEADERSÚSessionrR   ÚheadersÚupdater   r)   rM   rY   rl   rp   rv   r­   r¸   rÔ   Ú__name__rš   ÚargvÚmode© r   r   ú<module>rä      s  ðñ÷ .× -× -Ó -ß (Û Ý Ý  ð  €ØÐ+Ñ+€ØÐ4Ñ4€	Ø€Ø	€Ø€Ø€ð ˆ"�)‰)�KÐ!2Ó
3€ð ˜ A¨sØ ñ€ð
 ÐWÐ
X€Ø
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ ò,ò	ò$óNòò (ò&òb,òJó$@ðF ˆzÒÙ˜cŸh™h›-¨!Ò+ˆ3�8‰8�AŠ;°€DÙˆd…Oð r   