Ë
    H«£j~,  ã                   ót  — 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
mZ ddlmZ ej                  j                  dd«       ddlmZ ddlZddlZdZd„ Zd	Zd
dddœZdZdZ ej4                  «       Zej8                  j;                  e«       d„ Zd„ Zd„ Z dd„Z!d„ Z"d„ Z#d„ Z$e%dk(  r e$«        yy)u¢  éƒ¯åŸŽåŽ¿-å…¬ç¤ºå…¬å‘Šçˆ¬è™«

VSB 9 (Visual SiteBuilder å�šè¾¾)
åˆ—è¡¨: /zfxxgkpt/xzbmxxgk/xxgkml/gsgg.htm (ç¬¬1é¡µ, 50æ�¡/é¡µ)
      ç¬¬Né¡µ: gsgg/{id}.htm (é€’å‡�ID)
è¯¦æƒ…: /info/1694/XXXXX.htm
æ ‡é¢˜: meta ArticleTitle / pageTitle
æ—¥æœŸ: meta PubDate
æ­£æ–‡: div.newscontent_s > p, table

Usage:
  python3 crawl_tancheng_gsgg.py --pages 5    # å‰�5é¡µ
  python3 crawl_tancheng_gsgg.py --pages 1    # æ—¥è·‘å¢žé‡�
é    N)ÚBeautifulSoupÚTagÚNavigableString)Úurljoinz/root/gov_crawler)Úpush_to_searchdbz/root/search.dbc                  óÊ   — 	 t        j                  t        d¬«      } | j                  d«       | j                  d«       | S # t        $ r}t        d|› �«       Y d }~y d }~ww xY w)Né   ©ÚtimeoutzPRAGMA busy_timeout=30000zPRAGMA journal_mode=WALz  WARN DB connect: )Úsqlite3ÚconnectÚDB_PATHÚexecuteÚ	ExceptionÚprint)ÚconnÚes     úcrawl_tancheng_gsgg.pyÚget_db_connectionr   #   sY   € ðÜ�‰œw°Ô3ˆØ�‰Ð0Ô1Ø�‰Ð.Ô/ØˆøÜò ÜÐ# A 3Ð'Ô(Üûðús   ‚>A Á	A"Á
AÁA"zhttp://www.tancheng.gov.cnzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/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õ   éƒ¯åŸŽåŽ¿-å…¬ç¤ºå…¬å‘Šzzfxxgkpt/xzbmxxgk/xxgkmlc                 óV   — t         j                  | d¬«      }d|_        |j                  S )Né   r
   zutf-8)ÚsessÚgetÚencodingÚtext)ÚurlÚresps     r   Ú
fetch_pager    =   s%   € Ü�8‰8�C ˆ8Ó$€DØ€D„MØ�9‰9Ðó    c                 óŒ  — g }t        j                  dt         j                  «      }|j                  | «      D �]  }|j	                  d«      j                  «       }|j	                  d«      j                  «       }|j	                  d«      j                  «       }|r|sŒfd|vrŒk|j                  d«      rt        |dd z   }nk|j                  d	«      rt        |d
d z   }nM|j                  d«      rt        |dd z   }n/|j                  d«      st        dz   |j                  d«      z   }n|}|j                  |||dœ«       �Œ |S )u   è§£æž�åˆ—è¡¨é¡µzu<li[^>]*>.*?<a[^>]*href="([^"]+)"[^>]*class="bt"[^>]*>([^<]+)</a>\s*<span[^>]*class="time">(\d{4}-\d{2}-\d{2})</span>é   é   é   z/info/z	../../../é   Nz../../é   ú../Úhttpú/)Útitler   Úpub_date)
ÚreÚcompileÚDOTALLÚfinditerÚgroupÚstripÚ
startswithÚBASE_URLÚlstripÚappend)ÚhtmlÚitemsÚpatternÚmÚhrefr+   r,   r   s           r   Ú
parse_listr<   C   s0  € à€Eô
 �j‰jð	=ô 	�	‰	ó	€Gð ×Ñ˜dÓ#ó IˆØ�w‰w�q‹z×ÑÓ!ˆØ—‘˜“
× Ñ Ó"ˆØ—7‘7˜1“:×#Ñ#Ó%ˆá™DØØ˜4ÑØð �?‰?˜;Ô'Ü˜T ! "˜XÑ%‰CØ�_‰_˜XÔ&Ü˜T ! "˜XÑ%‰CØ�_‰_˜UÔ#Ü˜T ! "˜XÑ%‰CØ—‘ Ô(Ü˜S‘. 4§;¡;¨sÓ#3Ñ3‰CàˆCà�‰˜u¨S¸hÑGÖHð-Ið. €Lr!   c                 ó|  — t        | d«      }|j                  dd¬«      }|sy|j                  dd¬«      D �]  }|j                  d¬	«      }d
|v sd|v sŒ|d   }d|v r y|j	                  d«      rt
        |z   c S |j	                  d«      r�|j                  dd«      d   }|j                  d«      }d}	|j	                  d«      r|dd }|	dz  }	|j	                  d«      rŒ|	t        |«      k\  rt
        dz   |z   c S dj                  |d|	  «      dz   |z   }
|
c S |j                  dd«      d   }|dz   |z   c S  y)u#   ä»Žåˆ†é¡µåŒºåŸŸèŽ·å�–"ä¸‹é¡µ"é“¾æŽ¥úhtml.parserÚspanÚp_pages©Úclass_NÚaT©r;   ©r2   u   ä¸‹é¡µu	   ä¸‹ä¸€é¡µr;   Ú
javascriptr*   r(   r#   r   r%   )
r   ÚfindÚfind_allÚget_textr3   r4   ÚrsplitÚsplitÚlenÚjoin)r7   Úcurrent_urlÚsoupÚpage_divrC   Útxtr;   Úbase_dirÚpartsÚcountÚresolveds              r   Úget_next_page_urlrV   j   s^  € ä˜˜}Ó-€DØ�y‰y˜¨	ˆyÓ2€HÙØØ×Ñ˜s¨ÐÓ.ó )ˆØ�j‰j˜tˆjÓ$ˆØ�s‰?˜k¨SÒ0Ø�V‘9ˆDØ˜tÑ#ÙØ�‰˜sÔ#Ü $‘Ò&Ø�‰˜uÔ%Ø&×-Ñ-¨c°1Ó5°aÑ8�Ø Ÿ™ sÓ+�Ø�Ø—o‘o eÔ,Ø  ˜8�DØ˜Q‘J�Eð —o‘o eÕ,ð œC ›JÒ&Ü# c™>¨DÑ0Ò0ØŸ8™8 E¨'¨E¨6 NÓ3°cÑ9¸DÑ@�Ø’Ø"×)Ñ)¨#¨qÓ1°!Ñ4ˆHØ˜c‘> DÑ(Ò(ð))ð* r!   c                 óØ  — ddl m}  |t        | «      d«      }|j                  d«      D ]P  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r t        j                  j                  ||«      n||d<   ŒR |j                  d«      D ]P  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r t        j                  j                  ||«      n||d	<   ŒR t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   )r   r>   rC   r;   Ú )r)   rF   ú#ÚimgÚsrc)r)   z//zdata:)	Úbs4r   ÚstrrH   r   r3   ÚurllibÚparser   )ÚtableÚbase_urlr   ÚtblrC   r;   rZ   r[   s           r   Úhtml_table_to_htmlrc   ˆ   sÐ   € å!Ù
œ˜E›
 MÓ
2€CØ�\‰\˜#Óò SˆØ�u‰u�V˜RÓ ˆÚ˜Ÿ™Ð(CÕDÙ@HœŸ™×,Ñ,¨X°tÔ<ÈdˆAˆfŠIðSð �|‰|˜EÓ"ò RˆØ�g‰g�e˜RÓ ˆÚ�s—~‘~Ð&=Õ>Ù@HœŸ™×-Ñ-¨h¸Ô<ÈcˆC�ŠJðRô ˆs‹8€Or!   c                 ó„  — | j                  dg«      ryd}| j                  D �]>  }t        |t        «      r%t	        |«      j                  «       }|sŒ0||dz   z  }Œ9|j                  dk(  r|dz  }ŒN|j                  dk(  rS|j                  dd«      }|j                  dd«      }|sŒ„|j                  d	«      r|nt        ||«      }|d
|› d|› d�z  }Œ°|j                  dk(  rW|j                  dd«      }|j                  d¬«      }	|sŒæ|	sŒé|j                  d	«      r|nt        ||«      }
|d|	› d|
› d�z  }�Œ|j                  dv s�Œ&||j                  dd¬«      dz   z  }�ŒA t        j                  dd|«      j                  «       }|j                  dd«      }t        j                  dd|«      j                  «       }|S )u    ä»Ž <p> æ ‡ç­¾ä¸­æ��å�–çº¯æ–‡æœ¬r`   rX   ú Úbrú
rZ   r[   Úaltr)   ú![ú](z) rC   r;   TrE   ú[)r?   ÚstrongÚbÚemÚuÚfontz[ \t]+õ   Â )rG   ÚchildrenÚ
isinstancer   r]   r2   Únamer   r3   r   rI   r-   ÚsubÚreplace)Úp_tagra   rQ   ÚchildÚtr[   rh   Úfull_srcÚa_hrefÚa_textÚ	full_hrefs              r   Ú_extract_p_textr~   —   sª  € à‡z�z�7�)ÔØØ
€CØ—‘ó 9ˆÜ�eœ_Ô-Ü�E“
× Ñ Ó"ˆAÚØ�q˜3‘w‘‘Ø�Z‰Z˜4ÒØ�4‰K‰CØ�Z‰Z˜5Ò Ø—)‘)˜E 2Ó&ˆCØ—)‘)˜E 2Ó&ˆCÚØ"%§.¡.°Ô"8™3¼gÀhÐPSÓ>T�Ø˜˜C˜5  8 *¨BÐ/Ñ/‘Ø�Z‰Z˜3ÒØ—Y‘Y˜v rÓ*ˆFØ—^‘^¨$�^Ó/ˆFÚš&Ø&,×&7Ñ&7¸Ô&?™FÄWÈXÐW]ÓE^�	Ø˜˜6˜( " Y K¨rÐ2Ñ2’Ø�Z‰ZÐEÓEØ�5—>‘> #¨T�>Ó2°SÑ8Ñ8ŠCð)9ô* �&‰&�˜C Ó
%×
+Ñ
+Ó
-€CØ
�+‰+�f˜cÓ
"€CÜ
�&‰&�˜C Ó
%×
+Ñ
+Ó
-€CØ€Jr!   c                 ó¼  — | d   }	 t        |«      }t	        |d«      }d}d	D ]@  }|j                  d
d|i¬«      }|sŒ|j                  d«      sŒ-|d   j                  «       } n |s%|j                  d«      }|r|j                  d¬«      }|s]|j                  d
dt        j                  dt        j                  «      i¬«      }|r$|j                  d«      r|d   j                  «       }|s| d   }| j                  dd«      }	|j                  d
ddi¬«      }
|
rK|
j                  d«      r:t        j                  d|
d   j                  «       «      }|r|j                  d«      }	|j                  dd¬«      }d}g }|�rg }t        «       }|j                  g d¢d¬«      D �]=  }|j                  dd«      }d|j                  dd«      v rŒ+|j                   dk(  r|j#                  d«      rŒL|j                   dk(  rDt%        |«      dd }||v rŒn|j'                  |«       t)        |«      }|sŒ�|j+                  |«       ŒŸ|j                   dk(  r!t-        ||«      }|sŒ½|j+                  |«       ŒÏ|j                   d k(  sŒß|j                  d!d«      }|j                  d"d«      }|s�Œ|j/                  d#«      r|nt1        ||«      }|j+                  d$|› d%|› d&�«       �Œ@ d'j3                  |«      }|j                  d(d¬)«      D ]�  }|j                  d*d«      }|j                  d¬«      }|sŒ*|sŒ-t        j4                  d+|t        j                  «      sŒS|j/                  d#«      st1        ||«      }|j+                  ||d,œ«       |d-|› d.|› d/�z  }Œ‘ ||	||fS # t        $ r4}t        d|› d|› �«       | d   | j                  dd«      dg fcY d}~S d}~ww xY w)0u   æŠ“å�–è¯¦æƒ…é¡µr   z  WARN skip: z - r+   r,   rX   Nr>   )ÚArticleTitleÚ	pageTitleÚmetart   )ÚattrsÚcontentÚh3TrE   r�   ÚPubDatez(\d{4}-\d{2}-\d{2})r#   ÚdivÚnewscontent_srA   )Úpr`   rZ   )Ú	recursiveÚstylezdisplay:nonere   r‰   r`   éd   rZ   r[   rh   r)   ri   rj   ú)z

rC   rD   r;   z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$)rt   r   u   

é™„ä»¶ï¼š<p><a href="z">z</a></p>)r    r   r   r   r   rG   r2   rI   r-   r.   ÚIÚmatchr1   ÚsetrH   rv   rt   Úfind_parentr]   Úaddrc   r6   r~   r3   r   rM   Úsearch)Úitemr   r7   r   rO   r+   rt   Úmtr…   r,   Úmdr:   Úcontent_viewr„   ÚattachmentsrS   Úseen_tablesÚelemr‹   Ú	table_strÚmd_tablerQ   r[   rh   rz   rC   r;   r   s                               r   Úfetch_detailr�   ·   sÅ  € à
ˆu‰+€Cð?Ü˜#‹ˆô
 ˜˜}Ó-€Dð €EØ-ò ˆØ�Y‰Y�v f¨d ^ˆYÓ4ˆÚ�"—&‘&˜Õ#Ø�y‘M×'Ñ'Ó)ˆEÙð	ñ
 Ø�Y‰Y�t‹_ˆÙØ—K‘K d�KÓ+ˆEÙØ�Y‰Y�v f¬b¯j©j¸ÄbÇdÁdÓ.KÐ%LˆYÓMˆÙ�"—&‘&˜Ô#Ø�y‘M×'Ñ'Ó)ˆEÙØ�W‘ˆð �x‰x˜
 BÓ'€HØ	�‰�6 &¨)Ð!4ˆÓ	5€BÙ	ˆb�f‰f�YÔÜ�H‰HÐ+¨R°	©]×-@Ñ-@Ó-BÓCˆÙØ—w‘w˜q“zˆHð —9‘9˜U¨?�9Ó;€LØ€GØ€KâØˆÜ“eˆà ×)Ñ)Ò*?È4Ð)ÓPó 	:ˆDØ—H‘H˜W bÓ)ˆEØ §¡¨s°BÓ!7Ñ7ØØ�y‰y˜CÒ D×$4Ñ$4°WÔ$=ØØ�y‰y˜GÒ#Ü ›I d s˜O�	Ø Ñ+ØØ—‘ 	Ô*Ü-¨dÓ3�ÚØ—L‘L Õ*Ø—‘˜cÒ!Ü% d¨CÓ0�ÚØ—L‘L Õ%Ø—‘˜eÓ#Ø—h‘h˜u bÓ)�Ø—h‘h˜u bÓ)�ÛØ&)§n¡n°VÔ&<™sÄ'È#ÈsÓBS�HØ—L‘L 2 c U¨"¨X¨J°aÐ!8Ö9ð/	:ð2 —+‘+˜eÓ$ˆð ×&Ñ& s°Ð&Ó6ò 	NˆAØ—5‘5˜ Ó$ˆDØ—:‘: D�:Ó)ˆDÚš¤§¡Ð+PÐRVÔXZ×X\ÑX\Õ!]Ø—‘ vÔ.Ü" 3¨Ó-�DØ×"Ñ"¨D¸Ñ#>Ô?ØÐ6°t°f¸B¸t¸fÀHÐMÑM‘ð	Nð �(˜G [Ð0Ð0øô] ò ?Ü�˜c˜U # a SÐ)Ô*Ø�G‰}˜dŸh™h z°2Ó6¸¸BÐ>Õ>ûð?ús   ‡N Î	OÎ')OÏOÏOc                  óV  — t        j                  d¬«      } | j                  dt        dd¬«       | j	                  «       }|j
                  dkD  r|j
                  nd}g }t        › dt        › d	�}|}t        d
|d
z   «      D ]•  }t        d|› d|› d�«       	 t        |«      }t        |«      }|st        d«        n]t        dt        |«      › d�«       |j                  |«       t        ||«      }
|
st        d«        n|
}t!        j"                  d«       Œ— t        dt        |«      › d�«       |st        d«       y g }t%        |«      D ]Å  \  }}t        d|d
z   › dt        |«      › d|d   d d › d�«       t'        |«      \  }}}}|s|d   }t)        j*                  dd|«      j-                  «       }|r|d d nd}|d   |d   ||||t.        |rt1        j2                  |d¬«      ndd œ}|j5                  |«       t!        j"                  d!«       ŒÇ t        d"t        |«      › d#�«       |rt7        |t.        «       t9        «       }|rw	 |j;                  d$t.        f«      }|j=                  «       d   }|j;                  d%t.        f«      }|j=                  «       d   }t        d&|› d'|› d(�«       |j?                  «        t        d*«       y # t        $ r}	t        d|	› �«       Y d }	~	 �ŒÒd }	~	ww xY w# t        $ r}	t        d)|	› �«       Y d }	~	Œ^d }	~	ww xY w# |j?                  «        w xY w)+Nr   )Údescriptionz--pagesr   u   é¡µæ•°ï¼Œ0=å…¨é‡�)ÚtypeÚdefaultÚhelpr'   r*   z	/gsgg.htmr#   zPage z...z  empty, stopz  found z itemsz  WARN: z  no next page, stopg333333Ó?z
Total list: zNo items found, abortz  [z] r+   é(   z\s+re   iô  rX   r   F)Úensure_ascii)r   Ú
source_urlr+   r„   Úsummaryr,   Ú	site_namer˜   gš™™™™™É?z
Inserting z records...z.SELECT COUNT(*) FROM gov_raw WHERE site_name=?z1SELECT COUNT(*) FROM gov_search WHERE site_name=?zDB: z rows (FTS: z rows)z  WARN DB query: ÚDONE) ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsÚpagesr4   Ú	LIST_PATHÚranger   r    r<   rL   Úextendr   rV   ÚtimeÚsleepÚ	enumerater�   r-   ru   r2   Ú	SITE_NAMEÚjsonÚdumpsr6   r   r   r   ÚfetchoneÚclose)ÚparserÚargsÚ	max_pagesÚ	all_itemsÚlist_urlrN   Úpager7   r8   r   Únext_urlÚrecordsÚir”   r+   r,   r„   r˜   r¦   Úrecordr   ÚcursorÚ	raw_countÚ	fts_counts                           r   ÚmainrÇ     s!  € Ü×$Ñ$Ð1IÔJ€FØ
×Ñ˜	¬°QÐ=PÐÔQØ×ÑÓ€Dà"Ÿj™j¨1šn�—
’
°!€IØ€Iä�˜1œY˜K yÐ1€HØ€Kä�a˜ Q™Ó'ò ˆÜ��d�V˜1˜Y˜K sÐ+Ô,ð
	Ü˜kÓ*ˆDÜ˜tÓ$ˆEÙÜ˜Ô'ÙÜ�HœS ›Z˜L¨Ð/Ô0Ø×Ñ˜UÔ#ô
 % T¨;Ó7ˆÙÜÐ(Ô*ÙØˆÜ�
‰
�3�ð'ô* 
ˆNœ3˜y›>Ð*¨&Ð
1Ô2áÜÐ%Ô&Øà€GÜ˜YÓ'ò ‰ˆˆ4Ü��A�a‘C�5˜œ#˜i›.Ð)¨¨D°©M¸#¸2Ð,>Ð+?¸sÐCÔDÜ0<¸TÓ0BÑ-ˆˆx˜ +ÙØ˜‘MˆEÜ—‘�v˜s EÓ*×0Ñ0Ó2ˆÙ#*�'˜$˜3‘-°ˆð ˜‘;Ø˜u™+ØØØØ Ü"ÙJUœ4Ÿ:™: kÀÕFÐ[]ñ	
ˆð 	�‰�vÔÜ�
‰
�3�ð'ô* 
ˆLœ˜W›˜ kÐ
2Ô3ÙÜ˜¤)Ô,äÓ€DÙð		Ø—\‘\Ð"RÔU^ÐT`ÓaˆFØŸ™Ó)¨!Ñ,ˆIØ—\‘\Ð"UÔXaÐWcÓdˆFØŸ™Ó)¨!Ñ,ˆIÜ�D˜˜ <°	¨{¸&ÐAÔBð �J‰JŒLä	ˆ&…Møôq ò 	Ü�H˜Q˜C�.Ô!Þûð	ûôf ò 	+ÜÐ% a SÐ)×*Ñ*ûð	+ûð �J‰J�LúsI   Â#KÂ;)KÉ
A&K2 Ë	K/ËK*Ë*K/Ë2	LË;LÌ	L ÌLÌL ÌL(Ú__main__)rX   )&Ú__doc__Úrequestsr-   Úsysr¶   r²   Úosr©   r\   r   r   r   Úurllib.parser   ÚpathÚinsertÚcrawler_libr   r   r^   r   r   r4   ÚHEADERSrµ   r¯   ÚSessionr   ÚheadersÚupdater    r<   rV   rc   r~   r�   rÇ   Ú__name__© r!   r   ú<module>r×      sÕ   ðñó Û 	Û 
Û Û Û 	Û ß 3Ñ 3Ý  à ‡�‡��Ð&Ô 'Ý (Û Û à
€òð (€ð DØOØ0ñ€ð %€	Ø&€	à€x×ÑÓ€Ø ‡�× Ñ �GÔ òò$òNó<òò@S1òlMð` ˆzÒÙ…Fð r!   