Ë
    €Ûµ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mZ ddlm	Z	 dZ
dZdZdd	iZd
ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e«        yy)un  
å®�å›½å¸‚äººæ°‘æ”¿åºœ-é€šçŸ¥å…¬å‘Š çˆ¬è™«
URL: http://www.ningguo.gov.cn/News/showList/833/page_1.html
CMS: è‡ªå®šä¹‰ASP.NET MVC
åˆ—è¡¨: div.m-listrg > li > a[href] + span(æ—¥æœŸ)
åˆ†é¡µ: /News/showList/833/page_N.html (15æ�¡/é¡µ)
è¯¦æƒ…: div.m-dttexts.j-fontContent æ­£æ–‡
æ—¥æœŸ: div.m-pgpdbox1 "å�‘å¸ƒæ—¶é—´ï¼šYYYY-MM-DD"
é™„ä»¶: a[href] å�« .pdf/.doc/.xls/.zip
é    N)ÚBeautifulSoup)Úurljoinz7http://www.ningguo.gov.cn/News/showList/833/page_1.htmlu   å®�å›½å¸‚-é€šçŸ¥å…¬å‘Šu   å®‰å¾½z
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36é   g      ð?z/root/search.dbc                 ó@   — t        d| › �t        j                  ¬«       y )Nz
  [DEBUG] )Úfile)ÚprintÚsysÚstderr)Úmsgs    ú'/root/gov_crawler/crawl_ningguo_tzgg.pyÚdebugr      s   € Ü	ˆJ�s�eÐ
¤3§:¡:Ö.ó    c           	      óÊ   — t        j                  d| «      }|rK|j                  d«      › dt        |j                  d«      «      d›dt        |j                  d«      «      d›�S y)Nu'   (\d{4})[-/å¹´](\d{1,2})[-/æœˆ](\d{1,2})é   ú-é   Ú02dé   Ú )ÚreÚsearchÚgroupÚint)ÚtextÚms     r   Ú
parse_dater       sV   € Ü
�	‰	Ð<¸dÓC€AÙØ—'‘'˜!“*�˜Qœs 1§7¡7¨1£:›¨sÐ3°1´S¸¿¹À»³_ÀSÐ4IÐJÐJØr   c                 ó@  — t        d«      D ]Q  }	 t        j                  | t        t        ¬«      }d|_        |j                  dk(  rt        |j                  d«      c S ŒS y # t        $ r3}t        d|dz   › d|› �«       t        j                  d	«       Y d }~ŒŒd }~ww xY w)
Nr   )ÚheadersÚtimeoutzutf-8éÈ   Úlxmlu     è¯·æ±‚å¤±è´¥ (é‡�è¯• r   z/3): r   )ÚrangeÚrequestsÚgetÚHEADERSÚTIMEOUTÚencodingÚstatus_coder   r   Ú	Exceptionr   ÚtimeÚsleep)ÚurlÚretryÚrespÚes       r   Úget_soupr0   &   s•   € Ü�q“ò ˆð	Ü—<‘< ¬W¼gÔFˆDØ#ˆDŒMØ×Ñ 3Ò&Ü$ T§Y¡Y°Ó7Ò7ð 'ð	ð øô ò 	ÜÐ+¨E°!©G¨9°E¸!¸Ð=Ô>Ü�J‰J�q�M‰Mûð	ús   �AA!Á!	BÁ*)BÂBc                 ó   — t        | «      S )u'   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼ˆä¸�è½¬ mdï¼‰)Ústr)ÚtableÚargsÚkwargss      r   Útable_to_markdownr6   3   s   € äˆu‹:Ðr   c           
      óú  — g }g }| j                  dd¬«      }|sdg fS t        |j                  «      }|D �cg c]  }|j                  sŒ|‘Œ }}g }|j                  D ]<  }|j                  rŒt	        |«      j                  «       }	|	sŒ,|j                  |	«       Œ> |r|j                  |«       |D �]ß  }|j                  j                  «       }
|
dk(  �r:|j                  dd¬«      }|rè|j                  D ]×  }|j                  s?t	        |«      j                  «       }	|	r#t        d	„ |	D «       «      s|j                  |	«       ŒN|j                  j                  «       }|dk(  r|j                  t        |«      «       Œˆ|d
k(  r|j                  d«       ŒŸ|j                  d¬«      }	|	sŒ´t        d„ |	D «       «      rŒÇ|j                  |	«       ŒÙ �Œ!|j                  d¬«      }|s�Œ7t        d„ |D «       «      r�ŒK|j                  |«       �Œ^|
dk(  r|j                  t        |«      «       �Œ|
d
k(  r|j                  d«       �Œ—|
dk(  r|j                  d«       �Œ¯|
dk(  rL|j                  dd«      }|j                  dd«      }|s�ŒÜ|j                  d|› dt        d|«      › d�«       �Œ |
dv r)|j                  d¬«      }|s�Œ|j                  |«       �Œ-|
dk(  r=|j                  d¬«      }|s�ŒHt        d„ |D «       «      r�Œ\|j                  |«       �Œo|
dv r=|j                  d¬«      }|s�Œ‰t        d„ |D «       «      r�Œ�|j                  |«       �Œ°|
d
k(  r|j                  d«       �ŒÈ|
dk(  s�ŒÏ|j                  d«       �Œâ |j                  dd¬«      D ]j  }|d   }|j                  j                  «       }t!        j"                  d|j                  «       «      sŒGt        d|«      }|j                  d |› d|› d�«       Œl g }|D ]#  }|dk(  r|r	|d!   dk(  rŒ|j                  |«       Œ% d"j%                  |«      }t!        j&                  d#d"|«      }|j                  «       |fS c c}w )$zˆParse content from m-dttexts div, handling tables and br separators.
    Uses .contents (direct children in order) to maintain sequence.Údivz	m-dttexts©Úclass_r   Úpr3   F©Ú	recursivec              3   ó$   K  — | ]  }|d v –— Œ
 y­w)u    
	ã€€N© ©Ú.0Úcs     r   ú	<genexpr>z parse_content.<locals>.<genexpr>[   s   è ø€ Ò(IÀ!¨¨oÔ)=Ñ(Iùó   ‚ÚbrT)Ústripc              3   ó$   K  — | ]  }|d v –— Œ
 y­w©u
    
	ã€€ Â Nr?   r@   s     r   rC   z parse_content.<locals>.<genexpr>e   s   è ø€ Ò(NÀq¨Ð.BÔ)BÑ(NùrD   c              3   ó$   K  — | ]  }|d v –— Œ
 y­wrH   r?   r@   s     r   rC   z parse_content.<locals>.<genexpr>i   s   è ø€ Ò"JÀ 1Ð(<Ô#<Ñ"JùrD   Úhrz---ÚimgÚsrcÚaltz![z](zhttp://www.ningguo.gov.cnú))ÚulÚolc              3   ó$   K  — | ]  }|d v –— Œ
 y­wrH   r?   r@   s     r   rC   z parse_content.<locals>.<genexpr>}   ó   è ø€ ÒF¸Q˜qÐ$8Ô8ÑFùrD   )ÚspanÚstrongÚemÚbÚiÚuÚac              3   ó$   K  — | ]  }|d v –— Œ
 y­wrH   r?   r@   s     r   rC   z parse_content.<locals>.<genexpr>�   rR   rD   rY   )Úhrefr[   z3\.(pdf|doc|docx|xls|xlsx|zip|rar|ceb|ofd|ppt|pptx)$ú[éÿÿÿÿú

z\n{3,})ÚfindÚlistÚchildrenÚnamer2   rF   ÚappendÚextendÚlowerÚfind_allÚallr6   Úget_textr$   r   r   r   r   ÚjoinÚsub)ÚsoupÚpartsÚattachmentsÚcontent_divÚall_elementsÚchÚnamed_elementsÚ
text_partsÚchildÚtÚtagÚinner_tablesrj   ÚsnÚtxtrL   rM   rY   r[   r   Úfull_urlÚcleanedr;   Úcontents                           r   Úparse_contentr|   7   sõ  € ð €EØ€Kà—)‘)˜E¨+�)Ó6€KÙØ�2ˆvˆô ˜×,Ñ,Ó-€Là#/Ö;˜R°2·7³7’bÐ;€NÐ;à€JØ×%Ñ%ò %ˆØ�z‹zÜ�E“
× Ñ Ó"ˆAÚØ×!Ñ! !Õ$ð	%ñ Ø�‰�ZÔ àó 6 ˆØ�j‰j×ÑÓ ˆà�#‹:à Ÿ>™>¨'¸U˜>ÓCˆLáØ Ÿ>™>ò ,�CØŸ8š8Ü ›HŸN™NÓ,˜Ù¤SÑ(IÀqÔ(IÔ%IØ!ŸL™L¨œOØ ØŸ™Ÿ™Ó)�BØ˜W’}ØŸ™Ô%6°sÓ%;Õ<Ø˜tšØŸ™ RÕ(àŸL™L¨t˜LÓ4˜Ú¤SÑ(NÈAÔ(NÕ%NØ!ŸL™L¨�Oò,ð  —n‘n¨4�nÓ0�ÛœsÑ"JÀcÔ"JÖJØ—L‘L Ö%à�GŠ^Ø�L‰LÔ*¨5Ó1Ö2Ø�DŠ[Ø�L‰L˜ÖØ�DŠ[Ø�L‰L˜ÖØ�EŠ\Ø—)‘)˜E 2Ó&ˆCØ—)‘)˜E 2Ó&ˆCÛØ—‘˜r #  b¬Ð1LÈcÓ)RÐ(SÐSTÐUÖVØ�LÑ Ø—.‘. t�.Ó,ˆCÛØ—‘˜SÖ!Ø�EŠ\Ø—.‘. t�.Ó,ˆCÛœ3ÑFÀ#ÔFÖFØ—‘˜SÖ!ØÐ@Ñ@Ø—.‘. t�.Ó,ˆCÛœ3ÑFÀ#ÔFÖFØ—‘˜SÖ!Ø�DŠ[Ø�L‰L˜ÖØ�DŒ[Ø�L‰L˜Öðm6 ðr ×!Ñ! #¨DÐ!Ó1ò 8ˆØ�‰yˆØ�v‰v�|‰|‹~ˆÜ�9‰9ÐKÈTÏZÉZË\ÕZÜÐ:¸DÓAˆHØ×Ñ  4 &¨¨8¨*°AÐ6Õ7ð8ð €GØò ˆØ�Š7‘w 7¨2¡;°"Ò#4ØØ�‰�qÕðð
 �k‰k˜'Ó"€GÜ�f‰f�Y ¨Ó0€GØ�=‰=‹?˜KÐ'Ð'ùòk <s   ·Q8Á	Q8c                 ó^  — | dk(  rt         }nd| › d�}t        |«      }|sg S g }|j                  dd¬«      }|sg S |j                  dd¬«      }|r|j                  d«      }|r|}n|}n|}|j                  d	d
¬«      D ]¬  }|j                  d«      }	|	r|	j	                  d«      sŒ(t        t         |	d   «      }
|	j	                  dd«      xs |	j                  j                  «       }|j                  d«      }|r|j                  j                  «       nd}|j                  ||
|dœ«       Œ® |S )Nr   z1http://www.ningguo.gov.cn/News/showList/833/page_z.htmlr8   zm-listrgr9   Úm_cglistrO   ÚliFr<   rY   r[   Útitler   rS   )r€   r,   Údate)	ÚBASE_URLr0   r_   rf   r$   r   r   rF   rc   )Úpage_numr,   rk   ÚitemsÚ	containerÚlist_divrO   Úlist_containerr   rY   r[   r€   Ú	date_spanÚdate_strs                 r   Úfetch_list_pagerŠ   ›   s-  € Ø�1‚}Ü‰àAÀ(ÀÈ5ÐQˆÜ�C‹=€DÙØˆ	à€EØ—	‘	˜%¨
�	Ó3€IÙØˆ	ð �~‰~˜e¨Jˆ~Ó7€HÙØ�]‰]˜4Ó ˆÙØ‰Nà%‰Nà"ˆà×%Ñ% d°eÐ%Ó<ò FˆØ�G‰G�C‹LˆÙ˜Ÿ™˜fœØÜ”x  6¡Ó+ˆØ—‘�g˜rÓ"Ò4 a§f¡f§l¡l£nˆØ—G‘G˜F“Oˆ	Ù-6�9—>‘>×'Ñ'Ô)¸BˆØ�‰˜u¨T¸8ÑDÕEðFð €Lr   c                 óˆ  — d}d}| j                  d«      }|r|j                  j                  «       }|sR| j                  d«      }|r?|j                  j                  «       }t        j                  dd|«      j                  «       }| j                  dd¬«      }|rt        |j                  «      }t        | «      \  }}||||fS )Nr   Úh1r€   u   \s*[-â€“â€”|].*$r8   z
m-pgpdbox1r9   )r_   r   rF   r   rj   r   r|   )rk   r€   Úpub_daterŒ   rt   Úheaderr{   rm   s           r   Úextract_contentr�   À   s³   € Ø€EØ€Hð 
�‰�4‹€BÙ	Ø—‘—‘“ˆñ Ø�I‰I�gÓˆÙØ—F‘F—L‘L“NˆEÜ—F‘FÐ.°°EÓ:×@Ñ@ÓBˆEð �Y‰Y�u \ˆYÓ2€FÙÜ˜fŸk™kÓ*ˆô )¨Ó.Ñ€Gˆ[Ø�'˜8 [Ð0Ð0r   c                  ó   — dd l } | j                  t        d¬«      }|j                  d«       |j	                  «       }|j                  d«       |j                  d«       |j                  «        |j                  «        y )Nr   é<   ©r   zPRAGMA busy_timeout=60000aK  CREATE TABLE IF NOT EXISTS gov_raw (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        page_url TEXT,
        title TEXT,
        content TEXT,
        publish_date TEXT,
        site_name TEXT,
        summary TEXT,
        attachments TEXT,
        date_rank TEXT,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )zSCREATE INDEX IF NOT EXISTS idx_gov_raw_url 
        ON gov_raw(page_url, site_name))Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcursorÚcommitÚclose)r“   ÚconnrB   s      r   Úinit_dbr›   Ù   se   € ÛØ�?‰?œ7¨Bˆ?Ó/€DØ‡L�LÐ,Ô-Ø�‰‹€AØ‡I�Ið 	ô 
ð ‡I�Ið +ô ,à‡K�K„MØ‡J�J…Lr   c                 óÀ  — dd l }|j                  t        d¬«      }|j                  «       }d}| D ]a  }|d   r|d   d d nd}	 |j	                  d|d   |d	   |d   |d
   t
        ||d   rdj                  |d   «      nd|d
   xs df«       |dz  }Œc |j                  «        |j                  «        |S # t        $ r}t        d|d   › d|› �«       Y d }~Œ¨d }~ww xY w)Nr   r‘   r’   r{   r    r   z¹INSERT OR REPLACE INTO gov_raw (page_url, title, content, publish_date, site_name, summary, attachments, date_rank, script_name) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'crawl_ningguo_tzgg.py')r,   r€   r�   rm   ú
z
0000-00-00r   u     å…¥åº“å¤±è´¥: z - )r“   r”   r•   r—   r–   Ú	SITE_NAMEri   r)   r   r˜   r™   )r„   r“   rš   rB   ÚimportedÚitemÚsummaryr/   s           r   Ú
save_to_dbr¢   ï   s  € ÛØ�?‰?œ7¨Bˆ?Ó/€DØ�‰‹€AØ€HØò :ˆØ+/°	ª?�$�y‘/ $ 3Ñ'Àˆð	:Ø�I‰Ið  XØ�U‘Ø�W‘Ø�Y‘Ø�ZÑ ÜØØ26°}Ò2E�—	‘	˜$˜}Ñ-Ô.È2Ø�ZÑ Ò0 Lð	Zô 	ð ˜‰M‰Hð:ð  	‡K�K„MØ‡J�J„LØ€Oøô	 ò 	:ÜÐ$ T¨%¡[ M°°Q°CÐ8×9Ñ9ûð	:ús   ÁAB6Â6	CÂ?CÃCc            
      óÌ  — dd l } | j                  d¬«      }|j                  dt        dd¬«       |j                  dd	d
¬«       |j	                  «       }t        «        t        dt        › d�«       |j                  }t        d|› d�«       g }g }t        d|dz   «      D �]u  }t        d|› d|› d�«       t        |«      }|st        d|› d�«       Œ3|j                  t        |«      «       t        dt        |«      › d�«       t        |«      D �]  \  }}	t        dt        |«      dz   › d|	d   d d › d�«       t        |	d   «      }
|
s,t        d«       |j                  |	d   |	d   d|	d    g d!œ«       Œgt        |
«      \  }}}}|xs |	d   }|xs |	d    }|j                  ||	d   |||d!œ«       |r3t        |j!                  d"«      «      }t        d#|› d$|rd%nd&› d'|› �«       nt        d(|rd%nd&› �«       t#        j$                  t&        «       �Œ �Œx t        |«      }t)        d)„ |D «       «      }t)        d*„ |D «       «      }t)        d+„ |D «       «      t+        |d«      z  }t        d,t        › d-�«       t        d.|› d�«       t        |rd/|› d0||z  d1z  d2›d3�nd4«       t        d5|d2›�«       t        d6|› �«       |r$t        d7t)        |«      t        |«      z  d2›�«       |j,                  sfdd l}|j1                  t2        d8¬9«      }|j5                  «       }|j7                  «        |j9                  «        t;        |«      }t        d:|› d�«       y t        d;«       y )<Nr   u   å®�å›½å¸‚-é€šçŸ¥å…¬å‘Š çˆ¬è™«)Údescriptionz--pagesé   u   çˆ¬å�–é¡µæ•°, 0=å…¨éƒ¨)ÚtypeÚdefaultÚhelpz	--skip-dbÚ
store_trueu   è·³è¿‡å…¥åº“)Úactionr¨   z===== u    çˆ¬å�– =====u   å°†çˆ¬å�–: u    é¡µr   u	   
--- ç¬¬ ú/u    é¡µ ---u     ç¬¬ u    é¡µæ— æ•°æ�®u     åˆ—è¡¨é¡¹: u    æ�¡z  [z] r€   é(   z...r,   u        âš ï¸� è¯¦æƒ…é¡µè¯·æ±‚å¤±è´¥r   r�   )r€   r,   r{   r�   rm   r^   z    seg=z
 | attach=ÚYESÚnoz | date=u       âš ï¸� ç©ºæ­£æ–‡ | attach=c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)r{   r   Nr?   ©rA   rW   s     r   rC   zmain.<locals>.<genexpr>F  s   è ø€ Ò9˜!¨A¨i«L”AÑ9ùs   ‚
�c              3   ó8   K  — | ]  }t        |d    «      –— Œ y­w)rm   N)Úlenr°   s     r   rC   zmain.<locals>.<genexpr>G  s   è ø€ Ò@°”s˜1˜]Ñ+×,Ñ@ùs   ‚c              3   ób   K  — | ]'  }|d    sŒ	t        |d    j                  d«      «      –— Œ) y­w)r{   r^   N)r²   Úsplitr°   s     r   rC   zmain.<locals>.<genexpr>H  s*   è ø€ ÒU°aÈÈ)Ë”#�a˜	‘l×(Ñ(¨Ó0×1ÑUùs   ‚
/�"/z
===== u    çˆ¬å�–å®Œæˆ� =====u   å…±çˆ¬å�–: u   æœ‰æ­£æ–‡: u    æ�¡ (éd   z.1fz%)u   æœ‰æ­£æ–‡: 0 æ�¡u   å¹³å�‡æ®µè�½æ•°: u   é™„ä»¶æ•°: u   é¡µå�‡æ�¡æ•°: r‘   r’   u   å…¥åº“: u   å…¥åº“: å·²è·³è¿‡)ÚargparseÚArgumentParserÚadd_argumentr   Ú
parse_argsr›   r   rž   Úpagesr"   rŠ   rc   r²   Ú	enumerater0   r�   r´   r*   r+   ÚDELAYÚsumÚmaxÚskip_dbr“   r”   r•   r—   r˜   r™   r¢   )r¶   Úparserr4   Úpages_to_fetchÚ	all_itemsÚpage_items_countÚpager„   Úidxr    Údetail_soupr€   r{   r�   rm   Úfinal_titleÚ
final_dateÚ	seg_countÚtotalÚ	with_bodyÚtotal_attachÚavg_segr“   rš   rB   rŸ   s                             r   ÚmainrÎ     s�  € ÛØ×$Ñ$Ð1PÐ$ÓQ€FØ
×Ñ˜	¬°QÐ=UÐÔVØ
×Ñ˜¨L¸~ÐÔNØ×ÑÓ€Dä„Iä	ˆF”9�+˜]Ð
+Ô,Ø—Z‘Z€NÜ	ˆK˜Ð' tÐ
,Ô-à€IØÐä�a˜¨!Ñ+Ó,ó +ˆÜ�
˜4˜&  .Ð!1°Ð:Ô;Ü Ó%ˆÙÜ�F˜4˜& Ð.Ô/Øà×Ñ¤ E£
Ô+Ü�œc %›j˜\¨Ð.Ô/ä" 5Ó)ó !	‰IˆC�Ü�Cœ˜I› qÑ(Ð)¨¨D°©M¸#¸2Ð,>Ð+?¸sÐCÔDä" 4¨¡;Ó/ˆKÙÜÐ8Ô:Ø× Ñ Ø! '™]Ø ™;Ø!Ø $ V¡Ø#%ñ"ô ð ä4CÀKÓ4PÑ1ˆE�7˜H kØÒ0 4¨¡=ˆKØ!Ò1 T¨&¡\ˆJà×ÑØ$Ø˜E‘{Ø"Ø&Ø*ñô ñ Ü §¡¨fÓ 5Ó6�	Ü˜  ¨:¹{±eÐPTÐ5UÐU]Ð^hÐ]iÐjÕkäÐ6Á±uÐQUÐ6VÐWÔXä�J‰J”uÖòC!	ð+ôZ �	‹N€EÜÑ9˜yÔ9Ó9€IÜÑ@°iÔ@Ó@€LÜÑU¸9ÔUÓUÔX[Ð\eÐghÓXiÑi€Gä	ˆH”Y�KÐ2Ð
3Ô4Ü	ˆK˜�w˜dÐ
#Ô$Ü	ÉˆK˜	�{ &¨°5©¸Ñ)<¸SÐ(AÀÑ
DÐSeÔfÜ	Ð˜g c˜]Ð
+Ô,Ü	ˆK˜�~Ð
&Ô'ÙÜ�œsÐ#3Ó4´SÐ9IÓ5JÑJÈ3ÐOÐPÔQà�<Š<ãØ�‰œw°ˆÓ3ˆØ�K‰K‹Mˆð 	�‰ŒØ�
‰
Œä˜iÓ(ˆÜ�˜˜
 $Ð'Õ(äÐ!Õ"r   Ú__main__)Ú__doc__r   r	   r*   Úosr#   Úbs4r   Úurllib.parser   r‚   rž   ÚGROUPr%   r&   r¼   r•   r   r   r0   r6   r|   rŠ   r�   r›   r¢   rÎ   Ú__name__r?   r   r   ú<module>rÖ      s–   ðñ	÷ × Û Ý Ý  àD€Ø$€	Ø€àð  Dð€ð €Ø€à
€ò/òò
òòb(òH#òJ1ò2ò,ò2W#ðr ˆzÒÙ…Fð r   