Ë
    6¥Tj   ã                   ó®   — 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
g 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edk(  r e«        yy)uU  çœ‰å±±å¸‚çŽ¯è¯„å…¬ç¤ºçˆ¬è™« - Visual Site Builder 9
URL: http://www.ms.gov.cn/zfxxgk/fdzdgknr/zdmsxx/sthj/hpgs.htm
åˆ—è¡¨: div.govnewslista245277 > table > tr[id^=line245277] > a[title] + td date
åˆ†é¡µ: hpgs.htm â†’ hpgs/3.htm â†’ hpgs/2.htm â†’ hpgs/1.htm (å…±4é¡µ, ~50æ�¡/é¡µ)
è¯¦æƒ…: meta ArticleTitle, meta PubDate, div#vsb_content_100
é    N)ÚBeautifulSoup)Úurljoinz1http://www.ms.gov.cn/zfxxgk/fdzdgknr/zdmsxx/sthj/)úhpgs.htmz
hpgs/3.htmz
hpgs/2.htmz
hpgs/1.htmu%   çœ‰å±±å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-çŽ¯è¯„å…¬ç¤ºu   å››å·�z
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36é   g      ø?z/root/search.dbc                 óþ  — | j                  d«      }|syg }d}|D ]’  }|j                  ddg«      }|sŒg }|D ]M  }|j                  dd¬«      j                  dd	«      }t        j                  d
d|«      }|j                  |«       ŒO t        |t        |«      «      }|j                  |«       Œ” |sy|D ]1  }t        |«      |k  sŒ|j                  d«       t        |«      |k  rŒ Œ3 g }	|	j                  ddj                  |d   «      z   dz   «       |	j                  ddj                  dg|z  «      z   dz   «       |dd D ](  }|	j                  ddj                  |«      z   dz   «       Œ* dj                  |	«      S )z)Convert HTML table to Markdown pipe tableÚtrÚ r   ÚtdÚthú
T©Ústripz<br>z\s+ú z| z | z |z---é   N)	Úfind_allÚget_textÚreplaceÚreÚsubÚappendÚmaxÚlenÚjoin)
ÚtableÚrowsÚmd_rowsÚ	col_countr   ÚcellsÚrowÚcellÚtextÚliness
             ú/root/crawl_ms_hpgs.pyÚtable_to_markdownr$      s„  € à�>‰>˜$Ó€DÙØØ€GØ€IØò 
ˆØ—‘˜T 4˜LÓ)ˆÙØØˆØò 	ˆDØ—=‘= ¨T�=Ó2×:Ñ:¸4ÀÓHˆDÜ—6‘6˜& # tÓ,ˆDØ�J‰J�tÕð	ô ˜	¤3 s£8Ó,ˆ	Ø�‰�sÕð
ñ ØØò ˆÜ�#‹h˜Ó"Ø�J‰J�rŒNô �#‹h˜Ô"ðð €EØ	‡L�L�˜Ÿ
™
 7¨1¡:Ó.Ñ.°Ñ5Ô6Ø	‡L�L�˜Ÿ
™
 E 7¨YÑ#6Ó7Ñ7¸$Ñ>Ô?Ø�q�rˆ{ò 4ˆØ�‰�T˜EŸJ™J s›OÑ+¨dÑ2Õ3ð4à�9‰9�UÓÐó    c                 ó  ‡— | j                   D �]w  }t        |t        «      r$|j                  «       }|r|j	                  |«       Œ8|j
                  r|j
                  j                  «       nd}|dk(  rª|j                  dd¬«      }|r|j	                  |«       |j                  d«      D ]n  }|j                  dd«      Št        ˆfd„d	D «       «      sŒ*|j	                  |j                  d¬«      xs t        j                  j                  ‰«      ‰d
œ«       Œp �Œ|dk(  r"t        |«      }|s�Œ#|j	                  |«       �Œ6|dv r*|j                  dd¬«      }|s�ŒQ|j	                  |«       �Œd|dk(  s�Œkt        |||«       �Œz y)znRecurse into node children, extracting paragraphs/tables/attachments.
    Avoids double-extracting table text.r	   Úpr   Tr   ÚaÚhrefc              3   óB   •K  — | ]  }|‰j                  «       v –— Œ y ­w)N)Úlower)Ú.0Úextr)   s     €r#   ú	<genexpr>z_walk_node.<locals>.<genexpr>L   s   øè ø€ Òq¨s�s˜dŸj™j›lÔ*Ñqùs   ƒ)z.pdfz.docz.docxz.xlsz.xlsxz.zipz.rar)ÚnameÚurlr   )ÚulÚolÚdivN)ÚchildrenÚ
isinstanceÚstrr   r   r/   r+   r   r   ÚgetÚanyÚosÚpathÚbasenamer$   Ú
_walk_node)	ÚnodeÚpartsÚattachmentsÚelr!   Útagr(   Úmdr)   s	           @r#   r<   r<   <   sK  ø€ ð �m‰mó /ˆÜ�bœ#ÔØ—8‘8“:ˆDÙØ—‘˜TÔ"ØØ!#§¢ˆb�g‰g�m‰mŒo¨bˆØ�#Š:Ø—;‘;˜t¨4�;Ó0ˆDÙØ—‘˜TÔ"Ø—[‘[ Ó%ò �Ø—u‘u˜V RÓ(�ÜÓqÐ6pÔqÕqØ×&Ñ&Ø !§
¡
° 
Ó 6Ò P¼"¿'¹'×:JÑ:JÈ4Ó:PØ#ñ(õ òð �GŠ^Ü" 2Ó&ˆBÛØ—‘˜RÖ Ø�LÑ Ø—;‘;˜t¨4�;Ó0ˆDÛØ—‘˜TÖ"Ø�EŒ\ä�r˜5 +Ö.ñ9/r%   c                 óH  — t        | d«      }|j                  d¬«      }|s|j                  d¬«      }|sdg fS g }g }t        |||«       |D �cg c]  }|j                  «       sŒ|‘Œ }}dj	                  |«      }|D ]  }t        t        dz   |d   «      |d<   Œ ||fS c c}w )	zEExtract paragraphs and tables from vsb_content_100 or vsb_content divÚlxmlÚvsb_content_100©ÚidÚvsb_contentr	   z

r   r0   )r   Úfindr<   r   r   r   ÚBASE)ÚhtmlÚsoupÚcontent_divr>   r?   r'   Útext_contentÚatts           r#   Úextract_contentrP   ^   sµ   € ä˜˜vÓ&€DØ—)‘)Ð0�)Ó1€KÙØ—i‘i =�iÓ1ˆÙØ�2ˆvˆØ€EØ€KÜˆ{˜E ;Ô/ØÖ+�1 §¡¥ŠQÐ+€EÐ+Ø—;‘;˜uÓ%€LØò <ˆÜœT JÑ.°°E±
Ó;ˆˆEŠ
ð<à˜Ð$Ð$ùò	 ,s   ÁBÁ$Bc                 ó  — t        | d«      }|j                  dd¬«      }|st        dt        j                  ¬«       g S g }|j                  dd„ ¬	«      D ]§  }|j                  d
«      }|sŒ|j                  dd«      xs |j                  d¬«      }|j                  dd«      }|sŒRt        ||«      }	|j                  d«      }
t        |
«      dkD  r|
d   j                  d¬«      nd}|j                  |||	f«       Œ© |S )z9Parse list page, return list of (title, date, detail_url)rD   r3   Úgovnewslista245277)Úclass_z$  WARN: govnewslista245277 not found)Úfiler   c                 ó$   — | xr dt        | «      v S )NÚ
line245277)r6   )Úxs    r#   ú<lambda>zparse_list.<locals>.<lambda>x   s   € ¨aÒ.J°LÄCÈÃFÐ4J€ r%   rF   r(   Útitler	   Tr   r)   r
   r   )r   rI   ÚprintÚsysÚstderrr   r7   r   r   r   r   )rK   Úbase_urlrL   r3   Úitemsr   r(   rY   r)   Úfull_urlÚtdsÚdate_strs               r#   Ú
parse_listrb   p   s÷   € ä˜˜vÓ&€DØ
�)‰)�EÐ"6ˆ)Ó
7€CÙÜÐ4¼C¿J¹JÕGØˆ	Ø€EØ�l‰l˜4Ñ$JˆlÓKò 2ˆØ�G‰G�C‹LˆÙØØ—‘�g˜rÓ"Ò< a§j¡j°t jÓ&<ˆØ�u‰u�V˜RÓ ˆÙØÜ˜8 TÓ*ˆØ�k‰k˜$ÓˆÜ25°c³(¸Q²,�3�q‘6—?‘?¨�?Ô.ÀBˆØ�‰�e˜X xÐ0Õ1ð2ð €Lr%   c                 ó  — t        j                  | t        t        ¬«      }d|_        t        |j                  d«      }d}|j                  d«      D ]B  }|j                  dd«      xs d}d|v sŒ|j                  dd«      xs dj                  «       } n d}|j                  d«      D ]E  }|j                  dd«      xs d}d	|v sŒ|j                  dd«      xs dj                  «       d
d } n t        |j                  «      \  }}||||fS )z>Scrape detail page, return (title, date, content, attachments)©ÚheadersÚtimeoutúutf-8rD   r	   Úmetar/   ÚArticleTitleÚcontentÚPubDateNé
   )
Úrequestsr7   ÚHEADERSÚTIMEOUTÚencodingr   r!   r   r   rP   )	r0   ÚresprL   rY   rh   Únra   rj   r?   s	            r#   Úscrape_detailrs   ‡   s  € ä�<‰<˜¤W´gÔ>€DØ€D„MÜ˜Ÿ™ FÓ+€DØ€EØ—‘˜fÓ%ò ˆØ�H‰H�V˜RÓ Ò& BˆØ˜QÒØ—X‘X˜i¨Ó,Ò2°×9Ñ9Ó;ˆEÙð	ð
 €HØ—‘˜fÓ%ò ˆØ�H‰H�V˜RÓ Ò& BˆØ˜Š>ØŸ™ ¨BÓ/Ò5°2×<Ñ<Ó>¸sÀÐCˆHÙð	ô
 +¨4¯9©9Ó5Ñ€Gˆ[Ø�(˜G [Ð0Ð0r%   c                  ó²  — dd l } | j                  d¬«      }|j                  dt        dd¬«       |j                  dd	d
d¬«       |j	                  «       }t        |j                  t        t        «      «      }g }t        |«      D ]¸  }t        t        t        |   «      }t        d|dz   › d|› d|› �«       t        j                  |t        t         ¬«      }d|_        t%        |j&                  |«      }t        dt        |«      › d�«       |j)                  |«       ||dz
  k  sŒ t+        j,                  t.        «       Œº t        dt        |«      › d�«       t        |«      }	d}
d}t1        |«      D �]  \  }\  }}}t        |«      dkD  r|d d n|}t        d|dz   › d|	› d|› d�d¬«       t2        j4                  j7                  «        	 t9        |«      \  }}}}|s|}|rt        |j;                  «       «      dk  rt        d«       |dz  }Œœt        dt        |«      › d �d!¬«       |rt        d"t        |«      › d#�d!¬«       t        «        |j<                  �rdd l}|jA                  tB        «      }|jE                  «       }|jG                  d$|tH        f«       |jK                  «       rt        d%«       |jM                  «        �ŒW|r|d d& jO                  d'd«      nd!}|r*d'jQ                  |D �cg c]  }|d(   › d|d)   › �‘Œ c}«      nd!}|jG                  d*||||tH        |||xs d+tR        f	«       |jU                  «        |jM                  «        |
dz  }
t+        j,                  t.        «       �Œ t        d.«       t        d/|
› d0|› �«       y c c}w # tV        $ r3}t        d,|› �«       |dz  }t+        j,                  d-«       Y d }~�Œ_d }~ww xY w)1Nr   u   çœ‰å±±å¸‚çŽ¯è¯„å…¬ç¤ºçˆ¬è™«)Údescriptionz--pagesé   u   çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultÚhelpz--import-dbÚ
store_trueTu   å…¥åº“)Úactionrx   ry   u
   åˆ—è¡¨é¡µ r   ú/z: rd   rg   u	     æ‰¾åˆ° u    æ�¡u   
å…±é‡‡é›† u    æ�¡åˆ—è¡¨æ•°æ�®é(   z  [z] z...r   )Úendrl   u   è·³è¿‡ï¼ˆæ­£æ–‡è¿‡çŸ­ï¼‰u   âœ… u   å­—r	   z +u   é™„ä»¶z7SELECT id FROM gov_raw WHERE page_url=? AND site_name=?u       å·²å­˜åœ¨ï¼Œè·³è¿‡éÈ   r   r/   r0   zÜINSERT OR REPLACE INTO gov_raw
                             (page_url, title, content, publish_date, site_name, summary, attachments, date_rank, group_name)
                             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)z
0000-00-00u   â�Œ é   u   
=== å®Œæˆ� ===u   å…¥åº“: u
   , è·³è¿‡: ),ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsÚminÚpagesr   Ú	PAGE_URLSÚranger   rJ   rZ   rm   r7   rn   ro   rp   rb   r!   ÚextendÚtimeÚsleepÚDELAYÚ	enumerater[   ÚstdoutÚflushrs   r   Ú	import_dbÚsqlite3ÚconnectÚDB_PATHÚcursorÚexecuteÚ	SITE_NAMEÚfetchoneÚcloser   r   ÚGROUPÚcommitÚ	Exception)r�   ÚparserÚargsÚpages_to_crawlÚ	all_itemsÚiÚpage_urlrq   r^   ÚtotalÚinsertedÚskippedÚidxrY   ra   r0   ÚdspÚd_titleÚd_daterj   r?   r’   ÚconnÚcÚsummaryr(   Ú
attach_strÚes                               r#   Úmainr¯   œ   s�  € ÛØ×$Ñ$Ð1NÐ$ÓO€FØ
×Ñ˜	¬°Q¸^ÐÔLØ
×Ñ˜¨lÀDÈxÐÔXØ×ÑÓ€DÜ˜Ÿ™¤S¬£^Ó4€NØ€IÜ�>Ó"ò 	ˆÜœ4¤¨1¡Ó.ˆÜ�
˜1˜Q™3˜%˜q Ð 0°°8°*Ð=Ô>Ü�|‰|˜H¬g¼wÔGˆØˆŒÜ˜4Ÿ9™9 hÓ/ˆÜ�	œ#˜e›*˜ TÐ*Ô+Ø×Ñ˜ÔØˆ~ Ñ!Ó!Ü�J‰J”uÕð	ô 
ˆLœ˜Y›Ð(Ð(8Ð
9Ô:Ü�	‹N€EØ€HØ€GÜ'0°Ó';ó &Ñ#ˆÑ#ˆe�X˜sÜ ›J¨šOˆe�C�R‰j°ˆÜ��C˜‘E�7˜!˜E˜7 " S E¨Ð-°3Õ7Ü�
‰
×ÑÔð"	Ü4AÀ#Ó4FÑ1ˆG�V˜W kÙØ�Ùœc '§-¡-£/Ó2°RÒ7ÜÐ0Ô2Ø˜1‘�ØÜ�Dœ˜W›˜ cÐ*°Õ3ÙÜ˜œ3˜{Ó+Ð,¨FÐ3¸Õ<ÜŒGØ�~‹~ÛØ—‘¤wÓ/�Ø—K‘K“M�Ø—	‘	ÐSÐVYÔ[dÐUeÔfØ—:‘:”<ÜÐ2Ô4Ø—J‘J”LÙÙ>E˜' $ 3˜-×/Ñ/°°cÔ:È2�Ù]h˜TŸY™YÈKÖ'XÀq¨1¨V©9¨+°R¸¸%¹°zÒ(BÒ'XÔYÐnp�
Ø—	‘	ð Cð  ¨°&¼)ÀWÈjÐZ`ÒZpÐdpÔrwÐxôzð —‘”Ø—
‘
”Ø˜A‘�Ü�J‰J”uÖðE&ôN 
ÐÔÜ	ˆH�X�J˜j¨¨	Ð
2Õ3ùò (Yøô ò 	Ü�D˜˜�*ÔØ�q‰LˆGÜ�J‰J�q�MŠMûð	ús9   ÇANÈB9NË	*NË3N
ÌA.NÎNÎ	OÎ#(OÏOÚ__main__)Ú__doc__r   r[   r‹   r9   rm   Úbs4r   Úurllib.parser   rJ   rˆ   r—   rš   rn   ro   r�   r”   r$   r<   rP   rb   rs   r¯   Ú__name__© r%   r#   ú<module>r¶      s�   ðñ÷ × Û Ý Ý  à:€ò€	ð 4€	Ø€ØÐWÐ
X€Ø
€Ø€à
€òò>/òD%ò$ò.1ò*>4ðB ˆzÒÙ…Fð r%   