Ë
    ¸¬ujù+  ã                   óÄ   — 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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edk(  r e«        yy)u„  
ç¬¬ä¸€å¸ˆé˜¿æ‹‰å°”å¸‚ é€šçŸ¥å…¬å‘Š çˆ¬è™«
URL: http://www.nys.gov.cn:8090/xwzx/tzgg
CMS: è‡ªå®šä¹‰ASP.NET MVC CMS
åˆ—è¡¨: ul.newsList > li > a + span.date
åˆ†é¡µ: /xwzx/tzgg_2  â†’ /xwzx/tzgg_136  (å…±2703æ�¡, 20æ�¡/é¡µ)
è¯¦æƒ…: /xwzx/tzgg/content_XXXXX
æ­£æ–‡: div.printArea > div.conTxt (ç¬¬ä¸€ä¸ª)
æ—¥æœŸ: div.property ä¸­ "å�‘å¸ƒæ—¶é—´ï¼š..."
é™„ä»¶: a[href] å�« .pdf/.doc/.xls/.zip
é    N)ÚBeautifulSoup)Úurljoin)Údatetimez$http://www.nys.gov.cn:8090/xwzx/tzggu   ç¬¬ä¸€å¸ˆé˜¿æ‹‰å°”å¸‚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_nys_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éÈ   zhtml.parseru    è¯·æ±‚å¤±è´¥ (é‡�è¯• 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°Ó>Ò>ð 'ð	ð øô ò 	ÜÐ*¨5°©7¨)°5¸¸Ð<Ô=Ü�J‰J�q�M‰Mûð	ús   �AA!Á!	BÁ*)BÂBc                 óŽ  — | dk(  rt         }nt         › d| › �}t        |«      }|sg S g }|j                  dd¬«      }|s|S |j                  dd¬«      D ]ï  }|j                  d	«      }|r|j	                  d
«      sŒ(t        t         |d
   «      }|j	                  dd«      }|j                  j                  «       }	|	}
|r?d|v r;t        j                  d|«      }|r#|j                  d«      j                  «       }|r|}
|j                  dd¬«      }|r|j                  j                  «       nd}|j                  |
||dœ«       Œñ |S )Nr   Ú_ÚulÚnewsList©Úclass_ÚliF©Ú	recursiveÚaÚhrefÚtitler   u	   æ ‡é¢˜ï¼šz\u6807\u9898\uff1a(.+)ÚspanÚdate)r<   r,   r>   )ÚBASE_URLr0   ÚfindÚfind_allr$   r   r   Ústripr   r   r   Úappend)Úpage_numr,   ÚsoupÚitemsr3   r7   r:   r;   Ú
title_attrÚ
title_textr<   r   ÚtÚ	date_spanÚdate_strs                  r   Úfetch_list_pagerL   4   s<  € Ø�1‚}Ü‰ä�
˜!˜H˜:Ð&ˆÜ�C‹=€DÙØˆ	à€EØ	�‰�4 
ˆÓ	+€BÙØˆà�k‰k˜$¨%ˆkÓ0ò FˆØ�G‰G�C‹LˆÙ˜Ÿ™˜fœØÜ”x  6¡Ó+ˆØ—U‘U˜7 BÓ'ˆ
Ø—V‘V—\‘\“^ˆ
àˆÙÐ.°*Ñ<Ü—	‘	Ð3°ZÓ@ˆAÙØ—G‘G˜A“J×$Ñ$Ó&�ÙØ�Eà—G‘G˜F¨6�GÓ2ˆ	Ù-6�9—>‘>×'Ñ'Ô)¸BˆØ�‰˜u¨T¸8ÑDÕEð%Fð( €Lr   c                 óÒ   — | j                  dd¬«      }|sy|j                  dd¬«      }|r<t        j                  d|j                  «      }|rt	        |j                  d«      «      S y)NÚdivÚpager5   r   r=   Útotalz\u5171(\d+)\u9875)r@   r   r   r   r   r   )rE   Úpage_divÚ
total_spanr   s       r   Úget_total_pagesrS   X   s\   € Ø�y‰y˜ vˆyÓ.€HÙØØ—‘˜v¨g�Ó6€JÙÜ�I‰IÐ*¨J¯O©OÓ<ˆÙÜ�q—w‘w˜q“z“?Ð"Ør   c           
      óì	  — g }g }| j                  dd¬«      }|sdg dg fS |j                  dd¬«      }|sdg dg fS d}|j                  dd¬«      }|r|j                  j                  «       }|sR| j                  d«      }|r?|j                  j                  «       }t        j                  dd|«      j                  «       }d}|j                  dd	¬«      }	|	rt        |	j                  «      }|j                  D �]•  }
|
j                  s?t        |
«      j                  «       }|r#t        d
„ |D «       «      s|j                  |«       ŒO|
j                  j                  «       }|dv �rWt        d„ |
j                  d¬«      D «       «      }|rö|
j                  D ]å  }|j                  s?t        |«      j                  «       }|r#t        d„ |D «       «      s|j                  |«       ŒN|j                  dk(  r|j                  t        |«      «       Œx|j                  dv r:|j                  d¬«      }|sŒ›t        d„ |D «       «      rŒ®|j                  |«       ŒÀ|j                  d¬«      }|sŒÕ|j                  |«       Œç �Œˆ|
j                  d¬«      }|s�Œžt        d„ |D «       «      r�Œ²|j                  |«       �ŒÅ|dk(  r|j                  t        |
«      «       �Œæ|dk(  rP|
j                  dd«      }|
j                  dd«      }|s�Œ|j                  d|› dt!        t"        |«      › d�«       �Œ;|dv r)|
j                  d¬«      }|s�ŒU|j                  |«       �Œh|dk(  r�Œo|
j                  d¬«      }|s�Œ…|j                  |«       �Œ˜ |j                  dd¬«      D ]n  }|d   }|j                  j                  «       }t        j$                  d |j                  «       «      sŒGt!        t"        |«      }|j                  d!|› d|› d�«       Œp |j                  dd¬«      D ]u  }|d   }|j                  j                  «       }t        j$                  d |j                  «       «      sŒGt!        t"        |«      }d!|› d|› d�}||vsŒe|j                  |«       Œw t'        «       }g }|D ].  }|d d" }||vsŒ|j)                  |«       |j                  |«       Œ0 d#j+                  |«      }||||fS )$NrN   Ú	printArear5   r   ÚconTxtÚh2r<   z_\u901a\u77e5\u516c\u544a.*$Úpropertyc              3   ó$   K  — | ]  }|d v –— Œ
 y­w©u    
	ã€€N© ©Ú.0Úcs     r   ú	<genexpr>z"extract_content.<locals>.<genexpr>�   s   è ø€ ÒC¸  _Ô 4ÑCùó   ‚)ÚprN   c              3   ó8   K  — | ]  }|j                   d v –— Œ y­w))ÚtablerN   r3   ÚolN)Únamer\   s     r   r_   z"extract_content.<locals>.<genexpr>ˆ   s   è ø€ ÒlÀq˜AŸF™FÐ&BÔBÑlùó   ‚Fr8   c              3   ó$   K  — | ]  }|d v –— Œ
 y­wrZ   r[   r\   s     r   r_   z"extract_content.<locals>.<genexpr>�   s   è ø€ Ò(IÀ!¨¨oÔ)=Ñ(Iùr`   rc   T)rB   c              3   ó$   K  — | ]  }|d v –— Œ
 y­wrZ   r[   r\   s     r   r_   z"extract_content.<locals>.<genexpr>”   s   è ø€ Ò.UÈ¨q°OÔ/CÑ.Uùr`   c              3   ó$   K  — | ]  }|d v –— Œ
 y­w)u
    
	ã€€ Â Nr[   r\   s     r   r_   z"extract_content.<locals>.<genexpr>œ   s   è ø€ Ò"JÀ 1Ð(<Ô#<Ñ"Jùr`   ÚimgÚsrcÚaltz![z](ú))r3   rd   Úbrr:   )r;   r;   z3\.(pdf|doc|docx|xls|xlsx|zip|rar|ceb|ofd|ppt|pptx)$ú[éd   ú

)r@   r   rB   r   Úsubr   Úchildrenre   ÚstrÚallrC   ÚlowerÚanyrA   Úget_textr$   r   r?   r   ÚsetÚaddÚjoin)rE   ÚpartsÚattachmentsÚpaÚcon_txtr<   rW   rI   Úpub_dateÚpropÚchildr   ÚtagÚ	has_blockrr   Úsub_txtÚtxtrk   rl   r:   r;   Úfull_urlÚentryÚseenÚunique_partsra   ÚkeyÚcontents                               r   Úextract_contentr�   c   se  € Ø€EØ€Kà	�‰�5 ˆÓ	-€BÙØ�2�r˜2ˆ~Ðà�g‰g�e HˆgÓ-€GÙØ�2�r˜2ˆ~Ðà€EØ	�‰�˜gˆÓ	&€BÙ	Ø—‘—‘“ˆÙØ�I‰I�gÓˆÙØ—F‘F—L‘L“NˆEÜ—F‘FÐ:¸BÀÓF×LÑLÓNˆEà€HØ�7‰7�5 ˆ7Ó,€DÙÜ˜dŸi™iÓ(ˆà×!Ñ!ó 1"ˆØ�zŠzÜ�u“:×#Ñ#Ó%ˆDÙœCÑC¸dÔCÔCØ—‘˜TÔ"Øà�j‰j×ÑÓ ˆà�,ÒÜÑlÈEÏNÉNÐejÈNÓLkÔlÓlˆIÙØ Ÿ>™>ò ,�CØŸ8š8Ü ›HŸN™NÓ,˜Ù¤SÑ(IÀqÔ(IÔ%IØ!ŸL™L¨œOØ Ø—x‘x 7Ò*ØŸ™¤S¨£XÕ.ØŸ™ \Ñ1Ø"%§,¡,°T ,Ó":˜Ú"¬3Ñ.UÈWÔ.UÕ+UØ!ŸL™L¨Õ1àŸL™L¨t˜LÓ4˜ÚØ!ŸL™L¨�Oò,ð" —n‘n¨4�nÓ0�ÛœsÑ"JÀcÔ"JÖJØ—L‘L Ö%à�GŠ^Ø�L‰Lœ˜U›Ö$Ø�EŠ\Ø—)‘)˜E 2Ó&ˆCØ—)‘)˜E 2Ó&ˆCÛØ—‘˜r #  b¬´¸3Ó)?Ð(@ÀÐBÖCØ�LÑ Ø—.‘. t�.Ó,ˆCÛØ—‘˜SÖ!Ø�DŠ[Ùà—.‘. t�.Ó,ˆCÛØ—‘˜SÖ!ðc1"ðh ×Ñ˜c¨ÐÓ-ò 8ˆØ�‰yˆØ�v‰v�|‰|‹~ˆÜ�9‰9ÐKÈTÏZÉZË\ÕZÜœx¨Ó.ˆHØ×Ñ  4 &¨¨8¨*°AÐ6Õ7ð8ð �[‰[˜ 4ˆ[Ó(ò *ˆØ�‰yˆØ�v‰v�|‰|‹~ˆÜ�9‰9ÐKÈTÏZÉZË\ÕZÜœx¨Ó.ˆHØ˜�v˜R ˜z¨Ð+ˆEØ˜KÒ'Ø×"Ñ" 5Õ)ð*ô ‹5€DØ€LØò #ˆØ��ˆgˆØ�dŠ?Ø�H‰H�SŒMØ×Ñ Õ"ð	#ð �k‰k˜,Ó'€GØ�'˜8 [Ð0Ð0r   c                  óÚ   — dd l } | j                  t        «      }|j                  «       }|j	                  d«       |j	                  d«       |j                  «        |j                  «        y )Nr   aK  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ÚcursorÚexecuteÚcommitÚclose)r�   Úconnr^   s      r   Úinit_dbr—   Í   sT   € ÛØ�?‰?œ7Ó#€DØ�‰‹€AØ‡I�Ið 	ô 
ð ‡I�Ið +ô ,à‡K�K„MØ‡J�J…Lr   c                 ó¼  — dd l }|j                  t        «      }|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   z´INSERT OR REPLACE INTO gov_raw 
                (page_url, title, content, publish_date, site_name, summary, attachments, date_rank)
                VALUES (?, ?, ?, ?, ?, ?, ?, ?)r,   r<   r€   r}   ú
z
0000-00-00r   u     å…¥åº“å¤±è´¥: z - )r�   r�   r‘   r’   r“   Ú	SITE_NAMEr{   r)   r   r”   r•   )rF   r�   r–   r^   ÚimportedÚitemÚsummaryr/   s           r   Ú
save_to_dbrž   â   s  € ÛØ�?‰?œ7Ó#€DØ�‰‹€AØ€HØò :ˆØ+/°	ª?�$�y‘/ $ 3Ñ'Àˆð	:Ø�I‰Ið 3ð �U‘Ø�W‘Ø�Y‘Ø�ZÑ ÜØØ26°}Ò2E�—	‘	˜$˜}Ñ-Ô.È2Ø�ZÑ Ò0 Lð	5ôð ˜‰M‰Hð:ð$ 	‡K�K„MØ‡J�J„LØ€Oøô	 ò 	:ÜÐ$ T¨%¡[ M°°Q°CÐ8×9Ñ9ûð	:ús   ÁAB4Â4	CÂ=CÃCc            
      óØ  — dd l } | j                  d¬«      }|j                  dt        dd¬«       |j                  dd	d
¬«       |j	                  «       }t        «        t        dt        › d�«       t        t        «      }|st        d«       y t        |«      }t        d|› �«       |j                  dk(  r|nt        |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 «       «      t1        |d«      z  }t        d.t        › d/�«       t        d0|› d�«       t        |rd1|› d2||z  d3z  d4›d5�nd6«       t        d7|d4›�«       t        d8|› �«       |r$t        d9t/        |«      t!        |«      z  d4›�«       |j2                  st5        |«      }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   æ€»é¡µæ•°: u   å°†çˆ¬å�–: u    é¡µr   u	   
--- ç¬¬ ú/u    é¡µ ---u     ç¬¬ u    é¡µæ— æ•°æ�®u     åˆ—è¡¨é¡¹: u    æ�¡z  [z] r<   é(   z...r,   u        âš ï¸� è¯¦æƒ…é¡µè¯·æ±‚å¤±è´¥r   r>   )r<   r,   rŒ   r€   r}   rq   z    seg=z
 | attach=ÚYESÚnoz | date=u       âš ï¸� ç©ºæ­£æ–‡ | attach=c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)rŒ   r   Nr[   ©r]   Úis     r   r_   zmain.<locals>.<genexpr>C  s   è ø€ Ò9˜!¨A¨i«L”AÑ9ùs   ‚
�c              3   ó8   K  — | ]  }t        |d    «      –— Œ y­w)r}   N)Úlenr¬   s     r   r_   zmain.<locals>.<genexpr>D  s   è ø€ Ò@°”s˜1˜]Ñ+×,Ñ@ùrf   c              3   ób   K  — | ]'  }|d    sŒ	t        |d    j                  d«      «      –— Œ) y­w)rŒ   rq   N)r¯   Úsplitr¬   s     r   r_   zmain.<locals>.<genexpr>E  s*   è ø€ ÒU°aÈÈ)Ë”#�a˜	‘l×(Ñ(¨Ó0×1ÑUùs   ‚
/�"/z
===== u    çˆ¬å�–å®Œæˆ� =====u   å…±çˆ¬å�–: u   æœ‰æ­£æ–‡: u    æ�¡ (rp   z.1fz%)u   æœ‰æ­£æ–‡: 0 æ�¡u   å¹³å�‡æ®µè�½æ•°: u   é™„ä»¶æ•°: u   é¡µå�‡æ�¡æ•°: u   å…¥åº“: u   å…¥åº“: å·²è·³è¿‡)ÚargparseÚArgumentParserÚadd_argumentr   Ú
parse_argsr—   r	   rš   r0   r?   rS   ÚpagesÚminr"   rL   rC   r¯   Ú	enumerater�   r±   r*   r+   ÚDELAYÚsumÚmaxÚskip_dbrž   )r²   ÚparserÚargsrE   Útotal_pagesÚpages_to_fetchÚ	all_itemsÚpage_items_countrO   rF   Úidxrœ   Údetail_soupr<   rŒ   r€   r}   Úfinal_titleÚ
final_dateÚ	seg_countrP   Ú	with_bodyÚtotal_attachÚavg_segr›   s                            r   ÚmainrË   ý   sž  € ÛØ×$Ñ$Ð1\Ð$Ó]€FØ
×Ñ˜	¬°QÐ=UÐÔVØ
×Ñ˜¨L¸~ÐÔNØ×ÑÓ€Dä„Iä	ˆF”9�+˜]Ð
+Ô,Ü”HÓ€DÙÜÐ&Ô'Øä! $Ó'€KÜ	ˆK˜�}Ð
%Ô&à$(§J¡J°!¢O‘[¼¸T¿Z¹ZÈÓ9U€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à�<Š<Ü˜iÓ(ˆÜ�˜˜
 $Ð'Õ(äÐ!Õ"r   Ú__main__)Ú__doc__r   r
   r*   Úosr#   Úbs4r   Úurllib.parser   r   r?   rš   ÚGROUPr%   r&   r¹   r‘   r   r   r0   rL   rS   r�   r—   rž   rË   Ú__name__r[   r   r   ú<module>rÓ      s”   ðñ
÷ × Û Ý Ý  Ý à1€Ø#€	Ø€àð  Dð€ð €Ø€à
€ò/òò
ò"òH	òh1òTò*ò6V#ðp ˆzÒÙ…Fð r   