Ë
    ©��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mZ ddl	m
Z
 ddlmZmZ dZdZdZd	Zd
ZdZdZdZdZddiZ ej.                  «       Zej2                  j5                  e«       d„ Zd„ Zd„ Zd„ Zd„ ZdZ dZ!d„ Z"d„ Z#d0d„Z$d„ Z%d„ Z&d„ Z'e(dk(  rÖ e)ejT                  «      d kD  rejT                  d    nd!Z+e+d!k(  r e%«        ye+d"k(  r5 e)ejT                  «      d#kD  r e,ejT                  d#   «      ndZ- e$e-«       ye+d$k(  rJ ed «      Z. ee.«      Z/ ed% e)e/«      › d&�«       e/dd' D ]  Z0 ed(e0d)   › d*e0d+   dd, › d*e0d-   › �«       Œ! y ed.ejT                  d   › d/�«       yy)1u:  è´µæºªå¸‚äººæ°‘æ”¿åºœ-ç”Ÿæ€�çŽ¯å¢ƒ (www.guixi.gov.cn)
URL: http://www.guixi.gov.cn/col/col6947/index.html?vc_xxgkarea=Y01000&number=G01000G01006G01003G01004G01004
CMS: Hanweb - XXGKä¿¡æ�¯å…¬å¼€ç³»ç»Ÿ
åˆ—è¡¨: POST /module/xxgk/search.jsp (infotypeId/colId/currpage)
è¯¦æƒ…: /art/.../art_6947_xxxxx.html -> div#zoom
é    N)ÚBeautifulSoup)Úurljoin)ÚdatetimeÚ	timedeltaz.http://www.guixi.gov.cn/module/xxgk/search.jspzhttp://www.guixi.gov.cnu   ç”Ÿæ€�çŽ¯å¢ƒu   è´µæºªå¸‚äººæ°‘æ”¿åºœu   æ±Ÿè¥¿ÚG10000G00006G00003G00000Ú6947é   z/root/search.dbz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36c                 ó„   — t         j                  j                  | dz   «       t         j                  j                  «        y )Nú
)ÚsysÚstderrÚwriteÚflush)Úmsgs    ú*/root/gov_crawler/crawl_guixi_sthj_xxgk.pyÚlogr      s(   € Ü‡J�J×Ñ�S˜4‘ZÔ Ü‡J�J×ÑÕó    c           	      óæ   — dt         dddt        t        | «      dœ}	 t        j	                  t
        |d¬«      }d|_        |j                  S # t        $ r}t        d	| › d
|› �«       Y d}~yd}~ww xY w)zFetch one page of list results.Údiv4Ú56Ú Ú1)ÚdividÚ
infotypeIdÚjdidÚareaÚstandardXxgkÚcolIdÚcurrpager	   )ÚdataÚtimeoutúutf-8z  [ERROR] list page z: N)
ÚINFOTYPE_IDÚCOL_IDÚstrÚsessionÚpostÚ
SEARCH_URLÚencodingÚtextÚ	Exceptionr   )Úpager    ÚrÚes       r   Ú
fetch_listr/   #   sv   € ð Ü!ØØØÜÜ˜“Iñ€DðÜ�L‰Lœ¨$¸ˆLÓ;ˆØˆŒ
Ø�v‰vˆøÜò ÜÐ" 4 &¨¨1¨#Ð.Ô/Üûðús   �.A Á	A0ÁA+Á+A0c                 óN  — g }t        j                  d| t         j                  «      D ]z  }|j                  d«      j	                  «       }|j                  d«      j	                  «       }|j                  d«      j	                  «       }|sŒc|sŒf|j                  |||dœ«       Œ| |S )z/Extract (title, url, date) from list page HTML.zi<a title="([^\"]*?)"\s+target="_blank"\s+href="([^\"]+?)"[^>]*>.*?</a>\s*<b>\s*(\d{4}-\d{2}-\d{2})\s*</b>é   é   é   )ÚtitleÚurlÚdate)ÚreÚfinditerÚDOTALLÚgroupÚstripÚappend)ÚhtmlÚitemsÚmr4   r5   Údate_strs         r   Ú
parse_listrA   7   s�   € à€EÜ�[‰[ØtØŒb�i‰ióò Iˆð —‘˜“
× Ñ Ó"ˆØ�g‰g�a‹j×ÑÓ ˆØ—7‘7˜1“:×#Ñ#Ó%ˆÚ’SØ�L‰L 5°¸hÑGÕHðIð €Lr   c                 óŽ   — t        j                  d| «      }|r-t        |j                  d«      «      }|t        z   dz
  t        z  S y)zExtract total number of pages.u   å…±(\d+)æ�¡è®°å½•r1   r   )r7   ÚsearchÚintr:   ÚPER_PAGE)r=   r?   Útotals      r   Úget_total_pagesrG   F   s?   € ä
�	‰	Ð&¨Ó-€AÙÜ�A—G‘G˜A“J“ˆØœÑ  1Ñ$¬Ñ1Ð1Ør   c                 óþ  — 	 t         j                  | d¬«      }d|_        t        |j                  d«      }d}|j                  d	«      }|r$|j                  d
«      r|d
   j                  «       }d}|j                  d«      }|r'|j                  d
«      r|d
   j                  «       dd }|j                  d«      }t        ||| «      \  }	}
|||	|
fS # t        $ r!}t	        d| › d|› �«       dddg fcY d}~S d}~ww xY w)z*Extract content from detail page div#zoom.é   ©r!   r"   u     [ERROR] è¯¦æƒ…é¡µ: z - r   Nzhtml.parserzmeta[name=ArticleTitle]Úcontentzmeta[name=pubdate]é
   zdiv#zoom)
r&   Úgetr)   r+   r   r   r*   Ú
select_oner;   Úextract_content)Ú
detail_urlÚrespr.   Úsoupr4   Ú
meta_titler@   Ú	meta_dateÚcontent_divrK   Úattachmentss              r   Úextract_detailrW   O   s  € ðÜ�{‰{˜:¨rˆ{Ó2ˆØˆŒô
 ˜Ÿ™ MÓ2€Dð €EØ—‘Ð!:Ó;€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆð €HØ—‘Ð 4Ó5€IÙ�Y—]‘] 9Ô-Ø˜YÑ'×-Ñ-Ó/°°Ð4ˆð —/‘/ *Ó-€KÜ*¨;¸¸zÓJÑ€Gˆ[à�(˜G [Ð0Ð0øô- ò ÜÐ# J <¨s°1°#Ð6Ô7Ø�2�r˜2ˆ~Õûðús   ‚C Ã	C<ÃC7Ã1C<Ã7C<ú P )z.docz.docxz.pdfz.xlsz.xlsxz.pptz.pptxz.zipz.rarz.7zz.tarz.gzz.txtzdownfile.jspzdownload.jspÚdownfileÚdownloadc                 óZ   ‡— | sy| j                  «       Št        ˆfd„t        D «       «      S )z,Check if a URL points to an attachment file.Fc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w)N© )Ú.0ÚextÚlows     €r   ú	<genexpr>z!_is_attachment.<locals>.<genexpr>z   s   øè ø€ Ò1˜cˆs�cŒzÑ1ùs   ƒ)ÚlowerÚanyÚATTACH_EXTS)Úhrefr`   s    @r   Ú_is_attachmentrf   u   s%   ø€ áØØ
�*‰*‹,€CÜÓ1¤[Ô1Ó1Ð1r   c                 ó:  — | s|rd|› d|› d�g fS dg fS g }| j                  dd¬«      D ]¹  }|d   }|j                  d¬	«      }t        |«      rKt        t        |«      }|r	d|› d|› d�nd
|› d�}|j                  |«       |j                  |xs d|dœ«       Œp|j                  d«      sŒ‚|j                  d«      rŒ”|}|r	d|› d|› d�nd}|sŒ¦|sŒ©|j                  |«       Œ» g }	| j                  d«      D ]-  }
	 |	j                  t        |
«      «       |
j                  «        Œ/ | j                  g d¢«      D ]-  }|j                  dt        «       |j                  t        «       Œ/ | j                  d«      D ]  }|j                  t        «       Œ | j                  g d¢«      D ]  }|j                  «        Œ | j                  dd¬«      }t        j                  dd|«      }|j!                  dd«      }t        j                  dd|«      }|j#                  «       }|	D ]
  }|d|› �z  }Œ |j#                  «       rt%        |j#                  «       «      dk  r|r	d|› d|› d�}||fS # t        $ r& |	j                  |
j                  dd¬«      «       Y �Œƒw xY w)z�Extract formatted content with proper paragraphs, table preservation, and attachment links.

    Returns: (content_text, attachments_list)
    ú[z](ú)r   ÚaT)re   re   )r;   u	   [é™„ä»¶](u   é™„ä»¶)Únamer5   ÚhttpÚ
javascriptÚtableú )Ú	separatorr;   )ÚpÚh1Úh2Úh3Úh4Úh5Úh6r   Úbr)ÚspanÚbÚstrongÚfontÚemÚiÚuÚsz\x00P\x00(\s*\x00P\x00)+rX   z

z\n{3,}r	   )Úfind_allÚget_textrf   r   ÚBASE_URLÚreplace_withr<   Ú
startswithr%   r+   Ú	decomposeÚinsertÚMARKERÚunwrapr7   ÚsubÚreplacer;   Úlen)rU   r4   rP   rV   Úa_tagre   r*   Úfull_urlÚmd_linkÚtables_htmlrn   Útagrx   Útbl_htmls                 r   rO   rO   }   sÂ  € ñ
 ÙØ�u�g˜R 
˜|¨1Ð-¨rÐ1Ð1Ø�2ˆvˆà€Kð ×%Ñ% c°Ð%Ó5ò ,ˆØ�V‰}ˆØ�~‰~ Dˆ~Ó)ˆÜ˜$Ôäœx¨Ó.ˆHá15˜˜$˜˜r ( ¨1Ñ-¸YÀxÀjÐPQÐ;RˆGØ×Ñ˜wÔ'Ø×Ñ¨Ò(8°ÀÑJÕKØ�_‰_˜VÕ$¨T¯_©_¸\Õ-JàˆHÙ15˜˜$˜˜r ( ¨1Ñ-¸2ˆGÚš4Ø×"Ñ" 7Õ+ð,ð$ €KØ×%Ñ% gÓ.ò ˆð	JØ×Ñœs 5›zÔ*ð 	�‰Õðð ×#Ñ#Ò$MÓNò ˆØ�
‰
�1”fÔØ�
‰
”6Õðð ×"Ñ" 4Ó(ò  ˆØ
�‰œÕð ð ×#Ñ#Ò$XÓYò ˆØ�
‰
�ðð ×Ñ¨"°DÐÓ9€Dô �6‰6Ð-¨{¸DÓA€DØ�<‰<˜ VÓ,€DÜ�6‰6�)˜V TÓ*€DØ�:‰:‹<€Dð  ò "ˆØ�$�x�jÐ!Ñ!‰ð"ð �:‰:Œ<œ3˜tŸz™z›|Ó,¨rÒ1ÙØ�u�g˜R 
˜|¨1Ð-ˆDà�ÐÐøôC ò 	JØ×Ñ˜uŸ~™~¸À4˜~ÓH×Ið	Jús   Ã<I+É++JÊJé$   c           
      óú  — | r$t        j                  «       t        | dz  ¬«      z
  nd}t        d«      }|st	        d«       yt        |«      }t	        d|› d�«       g }t        «       }t        d|dz   «      D ]°  }|dkD  rt        |«      }|sŒt        |«      }d}|D ]\  }	|	d	   |vsŒ|r&|	d
   r!	 t        j                  |	d
   d«      }
|
|k  rŒ2	 |j                  |	d	   «       |j                  |	«       |dz  }Œ^ t	        d|› d|› d|› d�«       |dk(  sŒŸ|dkD  sŒ¥t	        d«        n t	        dt        |«      › d�«       t        |d«      D ]d  \  }}	t        |	d	   «      \  }}}}|	d
   s|r||	d
<   |r||	d<   ||	d<   ||	d<   t!        |	|«       |dz  dk(  sŒKt	        d|› dt        |«      › �«       Œf t#        |«      \  }}t	        d|› d|› �«       t	        dt        |«      › d�«       y# t        $ r Y �Œ*w xY w)zFull crawl all pages.é   )ÚdaysNr1   u   [ERROR] æ— æ³•èŽ·å�–ç¬¬ä¸€é¡µõ   å…± u    é¡µr   r5   r6   z%Y-%m-%dz  [PAGE ú/z] +õ    æ�¡z  [STOP] no new itemsu   
å…± u    æ�¡å¾…çˆ¬è¯¦æƒ…r4   rK   rV   rL   z  [PROGRESS] õ   [DB] å…¥åº“: æ–°å¢žõ    è·³è¿‡u   
[DONE] å…±çˆ¬å�– )r   Únowr   r/   r   rG   ÚsetÚrangerA   ÚstrptimeÚ
ValueErrorÚaddr<   rŒ   Ú	enumeraterW   Úoutput_itemÚ
push_to_db)Úmonths_backÚcutoffr=   Útotal_pagesÚ	all_itemsÚ	seen_urlsr,   r>   Ú	new_countÚitemÚdÚidxr4   r@   rK   rV   ÚaddedÚskippeds                     r   Ú	crawl_allr°   Ä   sJ  € áBMŒX�\‰\‹^œi¨[¸2Ñ-=Ô>Ò>ÐSW€Fä�a‹=€DÙÜÐ+Ô,ØÜ! $Ó'€KÜˆ$ˆ{ˆm˜4Ð Ô!à€IÜ“€Iä�a˜ q™Ó)ò ˆØ�!Š8Ü˜dÓ#ˆDÙØÜ˜4Ó ˆØˆ	Øò 	ˆDØ�E‰{ )Ò+Ù˜d 6šlðÜ$×-Ñ-¨d°6©l¸JÓG˜Ø˜vš:Ø$ð &ð —‘˜d 5™kÔ*Ø× Ñ  Ô&Ø˜Q‘‘	ð	ô 	ˆh�t�f˜A˜k˜]¨#¨i¨[¸Ð=Ô>Ø˜‹>˜d Q›hÜÐ'Ô(Ùð-ô0 ˆ&”�Y“Ð Ð 0Ð1Ô2Ü˜y¨!Ó,ò 
8‰	ˆˆTÜ0>¸tÀE¹{Ó0KÑ-ˆˆx˜ +Ø�FŠ|¡Ø#ˆD�‰LÙØ!ˆD�‰MØ!ˆˆY‰Ø)ˆˆ]ÑÜ�D˜#ÔØ�‰8�q‹=Ü�- ˜u A¤c¨)£nÐ%5Ð6Õ7ð
8ô   	Ó*�N€Eˆ7ÜÐ
˜e˜W G¨G¨9Ð5Ô6ÜÐ
œc )›nÐ-¨TÐ2Õ3øô3 &ò Úðús   Â/G-Ç-	G:Ç9G:c                  ót  — t        d«      } | syt        | «      }t        dt        |«      › d�«       t	        |d«      D ]A  \  }}t        |d   «      \  }}}}|d   s|r||d<   |r||d<   ||d<   ||d	<   t        ||«       ŒC t        |«      \  }}	t        d
|› d|	› �«       t        dt        |«      › d�«       y)zIncremental: only first page.r1   Nz[LIST] page 1 -> r™   r5   r6   r4   rK   rV   rš   r›   u   [DONE] å¢žé‡�çˆ¬å�– )r/   rA   r   rŒ   r¢   rW   r£   r¤   )
r=   r>   r­   r«   r4   r@   rK   rV   r®   r¯   s
             r   Úcrawl_incrementalr²   ü   sÙ   € ä�a‹=€DÙØÜ�tÓ€EÜÐ
œC ›J˜< tÐ,Ô-Ü˜u aÓ(ò ‰	ˆˆTÜ0>¸tÀE¹{Ó0KÑ-ˆˆx˜ +Ø�FŠ|¡Ø#ˆD�‰LÙØ!ˆD�‰MØ!ˆˆY‰Ø)ˆˆ]ÑÜ�D˜#Õðô   Ó&�N€Eˆ7ÜÐ
˜e˜W G¨G¨9Ð5Ô6ÜÐ
œs 5›z˜l¨$Ð/Õ0r   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	¬
«      «       y )Nr4   r   r5   r6   rK   rV   ú-)r4   Úpage_urlÚpublish_daterK   rV   Ú	site_nameÚcolumnÚprovinceF©Úensure_ascii)rM   ÚSITEÚCOLUMNÚPROVINCEÚprintÚjsonÚdumps)r«   r­   Úrecords      r   r£   r£     sx   € à—‘˜' 2Ó&Ø—H‘H˜U BÓ'ØŸ™ ¨Ó,Ø—8‘8˜I rÓ*Ø—x‘x ¨rÓ2Ü�v˜Qœv˜hÐ'ÜÜñ	€Fô 
Œ$�*‰*�V¨%Ô
0Õ1r   c                 ó>  — | syt         j                  j                  t        «      st	        dt        › d�«       yt        j                  t        d¬«      }|j                  d«       dx}}|j                  «       }| D ]Ø  }|j                  dd	«      xs d	}|j                  d
g «      }|rt        j                  |d¬«      nd	}|j                  dd	«      }		 |j                  dt        › dt        › �|	|	|j                  dd	«      |j                  dd	«      ||dd t        d|t        df«       |j                  dkD  r|dz  }n|dz  }|j#                  «        ŒÚ |j%                  «        ||fS # t
        j                   $ r}
t	        d|
› �«       |dz  }Y d}
~
ŒQd}
~
ww xY w)uZ   INSERT OR IGNORE ç›´æ�’ gov_raw; FTS è§¦å�‘å™¨ trg_gov_raw_fts_ins è‡ªåŠ¨å�Œæ­¥ gov_search)r   r   u     æœªå�‘çŽ° u   , è·³è¿‡å…¥åº“i"  rJ   zPRAGMA busy_timeout=290000r   rK   r   rV   Frº   r5   zçINSERT OR IGNORE INTO gov_raw
                   (site_name, source_url, page_url, title, publish_date, content, summary, category, script_name, attachments, group_name, industry)
                   VALUES (?,?,?,?,?,?,?,?,?,?,?,?)r´   r4   r6   Niô  zcrawl_guixi_sthj_xxgk.pyÚotherr1   z
  DB err: )ÚosÚpathÚexistsÚDB_PATHr   Úsqlite3ÚconnectÚexecuteÚcursorrM   rÀ   rÁ   r¼   r½   r¾   ÚrowcountÚErrorÚcommitÚclose)r>   Úconnr®   r¯   ÚcurÚitrK   rV   Úatt_jsonr5   r.   s              r   r¤   r¤     s†  € áØÜ�7‰7�>‰>œ'Ô"Üˆlœ7˜) >Ð2Ô3ØÜ�?‰?œ7¨CÔ0€DØ‡L�LÐ-Ô.ØÐ€EˆGØ
�+‰+‹-€CØò ˆØ—&‘&˜ BÓ'Ò-¨2ˆØ—f‘f˜]¨BÓ/ˆÙBM”4—:‘:˜k¸Õ>ÐSUˆØ�f‰f�U˜BÓˆð	Ø�K‰Kð7ô �6˜œ6˜(Ð# S¨#¨r¯v©v°g¸rÓ/BÀBÇFÁFÈ6ÐSUÓDVØ˜' $ 3˜-¬Ð1KÈXÜ˜7ð$ô	ð �|‰|˜aÒØ˜‘
‘à˜1‘�ð 	�‰�ð+ð, 	‡J�J„LØ�'ˆ>Ðøô �}‰}ò 	Ü�*˜Q˜CÐ Ô!Ø�q‰L�Gûð	ús   ÃA0E,Å,FÅ?FÆFÚ__main__r1   ÚincrementalÚfullr2   Úlistr—   r™   é   z  r6   z | r4   é(   r5   zUsage: z [incremental|full [months]])r“   )1Ú__doc__r   rÅ   r7   rÀ   rÉ   ÚrequestsÚbs4r   Úurllib.parser   r   r   r(   rƒ   r½   r¼   r¾   r#   r$   rE   rÈ   ÚHEADERSÚSessionr&   ÚheadersÚupdater   r/   rA   rG   rW   rˆ   rd   rf   rO   r°   r²   r£   r¤   Ú__name__rŒ   ÚargvÚmoderD   Úmonthsr=   r>   rÓ   r]   r   r   ú<module>rç      sÃ  ðñ÷ "× !Ó !Û Ý Ý  ß (à=€
Ø$€Ø	€Ø€Ø€Ø(€Ø	€Ø€Ø
€àÐWÐ
X€Ø
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ �wÔ òò
ò(òò1ð< 
€ðG€ò
2òDóN54òp1ò*2ò"ðJ ˆzÒÙ˜cŸh™h›-¨!Ò+ˆ3�8‰8�AŠ;°€DØˆ}ÒÙÕØ	�ŠÙ%(¨¯©£]°QÒ%6‘�S—X‘X˜a‘[Ô!¸BˆÙ�&ÕØ	�ŠÙ˜!‹}ˆÙ˜4Ó ˆÙˆd‘3�u“:�,˜dÐ#Ô$Ø˜˜�)ò 	FˆBÙ�"�R˜‘Z�L  B w¡K°°Ð$4Ð#5°S¸¸E¹¸ÐDÕEñ	Fñ 	ˆg�c—h‘h˜q‘k�]Ð">Ð?Õ@ð r   