Ë
    ¸¬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ZddlmZ ddlm	Z	 dZ
dZddd	œZd
Zd„ Zd„ Zd„ Zdd„Zd„ Z	 	 dd„Zd„ Zedk(  r e«        yy)u;  
crawl_linyou_jcygk.py - éºŸæ¸¸åŽ¿äººæ°‘æ”¿åºœ-å†³ç­–é¢„å…¬å¼€
====================================================
ç«™ç‚¹: http://www.linyou.gov.cn/col14518/col14521/col14548/
CMS:  éºŸæ¸¸WCM (ä¸­å›½æ”¿åŠ¡CMS)
åˆ—è¡¨: ul > li > a[title]+b(æ—¥æœŸ)
åˆ†é¡µ: index.html, index_1.html, index_2.html (3é¡µ, å…±58æ�¡)
è¯¦æƒ…: <div id="Zoom"> æ­£æ–‡, <meta ArticleTitle>æ ‡é¢˜, <meta PubDate>æ—¥æœŸ

ç”¨æ³•:
  python3 crawl_linyou_jcygk.py              # é»˜è®¤5é¡µ
  python3 crawl_linyou_jcygk.py --pages 3    # çˆ¬3é¡µ
  python3 crawl_linyou_jcygk.py --dry-run    # ä»…é¢„è§ˆ
é    N)Údatetime)ÚBeautifulSoupzhttp://www.linyou.gov.cnz/col14518/col14521/col14548zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8)z
User-AgentÚAccepté   c                 óp   — t        j                  «       j                  d«      }t        d|› d| › �d¬«       y )Nz%H:%M:%Sú[ú] T)Úflush)r   ÚnowÚstrftimeÚprint)ÚmsgÚtss     ú'/root/gov_crawler/crawl_linyou_jcygk.pyÚlogr   !   s.   € Ü	�‰‹×	 Ñ	  Ó	,€BÜ	ˆAˆbˆT��C�5ˆ/ Ö&ó    c                 óŽ   — | sy| j                  dd«      j                  dd«      j                  dd«      } | j                  d«      S )	u8   æ¸…æ´—æ ‡é¢˜ï¼šstrip &middot; &nbsp; ç­‰HTMLå®žä½“å‰�ç¼€Ú z&middot;õ   Â·z&nbsp;ú z&amp;ú&u
   Â·. \t\n\r)ÚreplaceÚstrip)Útitles    r   Úclean_titler   &   sB   € áØØ�M‰M˜* dÓ+×3Ñ3°H¸cÓB×JÑJÈ7ÐTWÓX€EØ�;‰;�Ó'Ð'r   c                 ó¤  ‡	— | syt        | d«      }|j                  ddg«      D ]  }|j                  «        Œ |j                  d«      D ]  }|j                  d«       Œ |j                  dg«      D ]  }|j                  «        Œ t	        |j                  dd	g«      «      D ]g  }|j
                  D �cg c]*  }|j                  €t        |«      j                  «       sŒ)|‘Œ, }}|sŒEt        d
„ |D «       «      sŒX|j                  «        Œi dˆ	fd„	Š	 ‰	|«      }g d¢}|D ]  }t        j                  |d|«      }Œ |j                  «       S c c}w )u5   æ¸…æ´—æ­£æ–‡HTMLï¼šåŽ»å†—ä½™æ ‡ç­¾ï¼Œä¿�ç•™è¡¨æ ¼HTMLr   úhtml.parserÚstyleÚscriptÚbrú
zo:pÚpÚdivc              3   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)r"   N)Úname)Ú.0Úcs     r   ú	<genexpr>zclean_html.<locals>.<genexpr>?   s   è ø€ Ò4¨!˜Ÿ™ #�Ñ4ùs   ‚c                 ó   •— g }| j                   D �]  }|j                  €.t        |«      j                  «       }|sŒ,|j	                  |«       Œ>|j                  dk(  r|j	                  t        |«      «       Œh|j                  dv r- ‰|d¬«      }|j                  «       sŒ‘|j	                  |«       Œ£|j                  dv r- ‰|d¬«      }|j                  «       sŒÌ|j	                  |«       ŒÞ|j                  d¬«      }|sŒó|j	                  |«       �Œ |r?dj                  d„ |D «       «      }t        j                  d	d|«      }|j                  «       S d
j                  d„ |D «       «      }|j                  «       S )NÚtable)r"   r#   ÚtdÚthÚliÚsectionÚtrÚtbodyÚtheadÚh1Úh2Úh3Úh4Úh5Úh6T)Ú	is_inline)ÚspanÚfontÚbÚiÚstrongÚemÚaÚuÚsubÚsupÚsmallÚlabel©r   r   c              3   óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­w©NrE   ©r&   r"   s     r   r(   z6clean_html.<locals>.extract_content.<locals>.<genexpr>Z   s   è ø€ Ò< A°!·'±'µ)œaÑ<ùó   ‚˜z {2,}ú

c              3   óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­wrG   rE   rH   s     r   r(   z6clean_html.<locals>.extract_content.<locals>.<genexpr>]   s   è ø€ Ò ? q°Q·W±WµY¤Ñ ?ùrI   )	Úchildrenr%   Ústrr   ÚappendÚget_textÚjoinÚrerA   )Úelementr8   ÚpartsÚchildÚtextÚinnerÚresultÚextract_contents          €r   rX   z#clean_html.<locals>.extract_contentB   sF  ø€ ØˆØ×%Ñ%ó 	'ˆEØ�z‰zÐ!Ü˜5“z×'Ñ'Ó)�ÚØ—L‘L Õ&Ø—‘˜wÒ&Ø—‘œS ›ZÕ(Ø—‘ð  Mñ Má'¨¸Ô>�Ø—;‘;•=Ø—L‘L Õ'Ø—‘ð  Eñ Eá'¨¸Ô>�Ø—;‘;•=Ø—L‘L Õ'à—~‘~¨D�~Ó1�ÚØ—L‘L Ö&ð)	'ñ* Ø—X‘XÑ<¨Ô<Ó<ˆFÜ—V‘V˜H c¨6Ó2ˆFð �|‰|‹~Ðð —[‘[Ñ ?¨EÔ ?Ó?ˆFØ�|‰|‹~Ðr   )u7   (?<!\n)\s+(?=[ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹�å��]+[ã€�ï¼Ž])u8   (?<!\n)\s+(?=[ï¼ˆ][ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹�å��][ï¼‰])u2   (?<=[ã€‚ï¼�ï¼Ÿ])\s+(?=\d+[.ã€�]\s*[\u4e00-\u9fff])u:   (?<!\n)\s{2,}(?=[ä¸€äºŒä¸‰å››äº”å…­ä¸ƒå…«ä¹�å��]+[ã€�ï¼Ž])rJ   )F)r   Úfind_allÚ	decomposeÚreplace_withÚlistrL   r%   rM   r   ÚallÚunwraprQ   rA   )
Úcontent_htmlÚsoupÚtagr    r'   ÚkidsrW   Úsection_patsÚpatrX   s
            @r   Ú
clean_htmlre   .   s9  ø€ áØÜ˜ }Ó5€Dà�}‰}˜g xÐ0Ó1ò ˆØ�‰�ðà�m‰m˜DÓ!ò ˆØ
�‰˜Õðà�}‰}˜e˜WÓ%ò ˆØ�‰�ðô
 �D—M‘M 3¨ ,Ó/Ó0ò ˆØŸ<™<ÖW�a°·±°ÄsÈ1ÃvÇ|Á|Å~’ÐWˆÐWÚ”CÑ4¨tÔ4Õ4Ø�J‰J�Lðõ
ñ< ˜TÓ"€Fò€Lð ò -ˆÜ—‘˜˜V VÓ,‰ð-ð �<‰<‹>Ðùò] Xs   Â4*EÃEc                 ó|  — | dk(  rt         › t        › d�}nt         › t        › d| dz
  › d�}	 t        j                  |t        d¬«      }d|_        |j                  }t        |d«      }g }|j                  d«      D �]  }|j                  dd¬«      D ]ü  }|j                  d«      }	|j                  d«      }
|	sŒ(|
sŒ+|	j                  dd«      j                  «       }|sŒN|j                  d«      s8|j                  d«      r|dd
 }t         t        z   dz   |j                  d«      z   }|	j                  dd«      xs |	j                  d¬«      }t!        |«      }|
j                  d¬«      j                  «       }|j#                  |||dœ«       Œþ �Œ |S # t        $ r}t        d| › d	|› �«       g cY d
}~S d
}~ww xY w)u   èŽ·å�–å�•é¡µåˆ—è¡¨é   z/index.htmlz/index_z.htmlé   ©ÚheadersÚtimeoutúutf-8u   åˆ—è¡¨é¡µè¯·æ±‚å¤±è´¥ (page=z): Nr   Úulr-   F)Ú	recursiver?   r;   Úhrefr   Úhttpz./ú/r   TrE   )r   ÚdateÚurl)ÚBASE_URLÚ	LIST_PATHÚrequestsÚgetÚHEADERSÚencodingrU   Ú	Exceptionr   r   rY   Úfindr   Ú
startswithÚlstriprO   r   rN   )Úpagers   ÚrespÚhtmlÚer`   Úitemsrm   r-   r?   r;   ro   r   rr   s                 r   Úfetch_list_pagerƒ   o   s­  € àˆq‚yÜ�
œ9˜+ [Ð1‰ä�
œ9˜+ W¨T°!©V¨H°EÐ:ˆðÜ�|‰|˜C¬¸"Ô=ˆØˆŒØ�y‰yˆô
 ˜˜}Ó-€DØ€Eà�m‰m˜DÓ!ó JˆØ—+‘+˜d¨e�+Ó4ò 	JˆBØ—‘˜“ˆAØ—‘˜“ˆAÚ’QØ—u‘u˜V RÓ(×.Ñ.Ó0�ÙØà—‘ vÔ.Ø—‘ tÔ,Ø# A B˜x˜Ü#¤iÑ/°#Ñ5¸¿¹ÀCÓ8HÑH�DØŸ™˜g rÓ*ÒD¨a¯j©j¸t¨jÓ.D�Ü# EÓ*�Ø—z‘z¨�zÓ-×3Ñ3Ó5�Ø—‘ u°dÀ4ÑHÕIò	JðJð$ €Løô3 ò ÜÐ*¨4¨&°°A°3Ð7Ô8Ø�	ûðús   ¬/F Æ	F;ÆF6Æ0F;Æ6F;c                 ó®  — 	 t        j                  | t        d¬«      }d|_        |j                  }t        |d«      }d}|j                  d	d
di¬«      }|r$|j                  d«      r|d   j                  «       }|s%|j                  d«      }|r|j                  d¬«      }|sE|j                  d«      }|r2|j                  d¬«      j                  d«      d   j                  «       }|rt        |«      nd}d}	|j                  d	d
di¬«      }
|
r'|
j                  d«      r|
d   j                  «       dd }	d}|j                  dd¬«      }|r |j                  «       j                  d«      }n=dD ]8  }|j                  d|¬«      }|sŒ|j                  «       j                  d«      } n ||	|fS # t
        $ r}t        d| › d|› �«       Y d}~yd}~ww xY w)u7   èŽ·å�–è¯¦æƒ…é¡µï¼Œè¿”å›ž(title, pub_date, content_html)rh   ri   rl   u   è¯¦æƒ…é¡µè¯·æ±‚å¤±è´¥ z: N)NNNr   Úmetar%   ÚArticleTitle)ÚattrsÚcontentr2   TrE   r   r   r   r   ÚPubDateé
   r#   ÚZoom)Úid)Ú
TRS_EditorÚCustom_UnionStyleÚcon_textzinfo-content)Úclass_)rv   rw   rx   ry   rU   rz   r   r   r{   r   rO   Úsplitr   Úencode_contentsÚdecode)rs   r   r€   r�   r`   r   Ú
meta_titler2   Ú	title_tagÚpub_dateÚ	meta_dater_   Úzoom_divÚclsÚfbs                  r   Úfetch_detailr›   –   sà  € ð Ü�|‰|˜C¬¸"Ô=ˆØˆŒØ�y‰yˆô
 ˜˜}Ó-€Dð €EØ—‘˜6¨&°.Ð)A�ÓB€JÙ�j—n‘n YÔ/Ø˜9Ñ%×+Ñ+Ó-ˆÙØ�Y‰Y�t‹_ˆÙØ—K‘K d�KÓ+ˆEÙØ—I‘I˜gÓ&ˆ	ÙØ×&Ñ&¨TÐ&Ó2×8Ñ8¸Ó=¸aÑ@×FÑFÓHˆEÙ"'ŒK˜Ô¨R€Eð €HØ—	‘	˜&¨°Ð(;�	Ó<€IÙ�Y—]‘] 9Ô-Ø˜YÑ'×-Ñ-Ó/°°Ð4ˆð €LØ�y‰y˜ 6ˆyÓ*€HÙØ×/Ñ/Ó1×8Ñ8¸ÓA‰ð Sò 	ˆCØ—‘˜5¨�Ó-ˆBÚØ!×1Ñ1Ó3×:Ñ:¸7ÓC�Ùð		ð �(˜LÐ(Ð(øôQ ò  ÜÐ$ S E¨¨A¨3Ð/Ô0Üûð ús   ‚/F0 Æ0	GÆ9GÇGc                 ó–  — | st        d«       yd}ddl}d}| D �]"  }|j                  dd«      }|j                  dd«      }	|j                  dd«      }
|j                  d	d«      }|r|
sŒQ|j                  d
d«      }|
j                  d
d«      }|j                  d
d«      }|j                  d
d«      }|j                  d
d«      }|	j                  d
d«      }|r|j                  d
d«      nd}d|› d|› d|› d|› d|› d|› d|› d|› d|› d�}d|d|› �g}	 |j	                  |ddd¬«      }|j
                  dk(  r|dz  }�Œ% t        d|› dt        | «      › d�«       t        d«       |j                  d
d«      }d|› d�}	 |j	                  d||gddd¬«       y# t        $ r Y �ŒŠw xY w# t        $ r}t        d|› �«       Y d}~yd}~ww xY w)u   å…¥åº“åˆ° search.dbu   æ— æ•°æ�®å�¯å…¥åº“Nz/mnt/data/search.dbr   r   r   rr   rs   rˆ   ú'z''z†INSERT OR IGNORE INTO gov_raw (site_name, source_url, page_url, title, publish_date, summary, content, group_name, industry) VALUES ('z', 'z');Úsqlite3zPRAGMA busy_timeout=15000; Trh   )Úcapture_outputrU   rk   rg   u   å…¥åº“å®Œæˆ�: rq   õ    æ�¡u   å�Œæ­¥FTS...z“INSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) SELECT r.id, r.title, r.site_name, r.summary FROM gov_raw r WHERE r.site_name='zA' AND NOT EXISTS (SELECT 1 FROM gov_search s WHERE s.rowid=r.id);u   FTSå�Œæ­¥å¤±è´¥: )r   Ú
subprocessrw   r   ÚrunÚ
returncoderz   Úlen)r‚   Úsource_nameÚ
group_nameÚindustryÚdb_pathr¡   ÚinsertedÚitemr   rr   rs   rˆ   Ú	esc_titleÚesc_urlÚ
esc_sourceÚ	esc_groupÚesc_industryÚesc_dateÚesc_contentÚuse_sqlÚcmdrW   Úesc_source_safeÚfts_sqlr�   s                            r   Úpush_to_searchdbr¶   Ç   se  € ñ ÜÐ Ô!Øà#€GÛà€HØó )ˆØ—‘˜ "Ó%ˆØ�x‰x˜ Ó#ˆØ�h‰h�u˜bÓ!ˆØ—(‘(˜9 bÓ)ˆá™CØà—M‘M # tÓ,ˆ	Ø—+‘+˜c 4Ó(ˆØ ×(Ñ(¨¨dÓ3ˆ
Ø×&Ñ& s¨DÓ1ˆ	Ø×'Ñ'¨¨TÓ2ˆØ—<‘<  TÓ*ˆÙ4;�g—o‘o c¨4Ô0Àˆðð ˆ|ð Øˆyð Øˆyð Øˆ{ð Øˆzð Øˆ{ð Øˆ}ð Øˆ{ð Øˆ~ð ðð 	ð  ˜'Ð%@ÀÀ	Ð#JÐKˆð	Ø—^‘^Ø D¨t¸Rð $ó ˆFð × Ñ  AÒ%Ø˜A‘�ùðO)ôV ˆ.˜˜
 !¤C¨£J <¨tÐ4Ô5ô ˆÔØ!×)Ñ)¨#¨tÓ4€Oð	ð .Ð.ð /Jð	Jð ð%Ø�‰Ø˜ Ð)Ø d°Bð 	õ 	
øô! ò 	Úð	ûô( ò %ÜÐ ˜sÐ#×$Ñ$ûð%ús*   Ä)FÅ>F' Æ	F$Æ#F$Æ'	GÆ0GÇGc                  ó  — dd l } | j                  d¬«      }|j                  dt        t        dt        › d�¬«       |j                  dd	d
¬«       |j                  «       }t        |j                  d«      }t        d|› d|j                  › �«       g }t        d|dz   «      D ]X  }t        d|› d�«       t        |«      }|st        d|› d�«        n+t        dt        |«      › d�«       |j                  |«       ŒZ t        dt        |«      › d�«       |j                  rA|d d D ]-  }t        d|d   › d|d   d d › �«       t        d|d   › �«       Œ/ t        d«       y t        |«      D ]ƒ  \  }}t        d|dz   › d t        |«      › d|d   d d! › d"�«       t!        |d   «      \  }	}
}|	xs |d   }|
xs |d   }|rt#        |«      nd#}||d<   ||d<   ||d$<   t%        j&                  d%«       Œ… t        d&t        |«      › d'�«       |d d D ]_  }t        d|d   › d|d   d d › �«       t        d|d   › �«       t        d(t        |j)                  d$d#«      «      › d)�«       t        «        Œa |rt+        |«       t        d*«       y )+Nr   u+   éºŸæ¸¸åŽ¿äººæ°‘æ”¿åºœ-å†³ç­–é¢„å…¬å¼€çˆ¬è™«)Údescriptionz--pagesu   çˆ¬å�–é¡µæ•° (é»˜è®¤: u
   , å…±3é¡µ))ÚtypeÚdefaultÚhelpz	--dry-runÚ
store_trueu   ä»…é¢„è§ˆä¸�å®žé™…çˆ¬å�–è¯¦æƒ…)Úactionr»   é   u'   ðŸš€ çˆ¬è™«å�¯åŠ¨: linyou_jcygk, pages=z
, dry_run=rg   u
   çˆ¬å�–ç¬¬ u    é¡µ...u   ç¬¬ u    é¡µæ— æ•°æ�®ï¼Œå�œæ­¢u     èŽ·å�–åˆ° r    u   åˆ—è¡¨æ€»è®¡: r   z  [rr   r	   r   é2   z  URL: rs   u   âœ… é¢„è§ˆå®Œæˆ�rq   é(   z...r   rˆ   g      à?u   
=== çˆ¬å�–å®Œæˆ�: u    æ�¡ ===u
     æ­£æ–‡: z charsu   âœ… å…¨éƒ¨å®Œæˆ�)ÚargparseÚArgumentParserÚadd_argumentÚintÚDEFAULT_PAGESÚ
parse_argsÚminÚpagesr   Údry_runÚrangerƒ   r¤   Úextendr   Ú	enumerater›   re   ÚtimeÚsleeprw   r¶   )rÁ   ÚparserÚargsrÈ   Ú	all_itemsr~   r‚   rª   r<   Údetail_titleÚdetail_dater_   Úfinal_titleÚ
final_dateÚcleaned_contents                  r   Úmainr×     sÒ  € ÛØ×$Ñ$Ð1^Ð$Ó_€FØ
×Ñ˜	¬´]Ø5´m°_ÀJÐOð ô Qà
×Ñ˜¨LØ=ð ô ?à×ÑÓ€Dä�—
‘
˜AÓ€EÜÐ
1°%°¸
À4Ç<Á<À.ÐQÔRà€IÜ�a˜ ™Ó#ò  ˆÜˆj˜˜˜gÐ&Ô'Ü Ó%ˆÙÜ�$�t�fÐ2Ð3Ô4ÙÜˆlœ3˜u›:˜, dÐ+Ô,Ø×Ñ˜Õð ô ˆ.œ˜Y›Ð(¨Ð-Ô.à‡|‚|Ø˜b˜q�Mò 	+ˆDÜ�C˜˜V™�~ R¨¨W©°c°rÐ(:Ð';Ð<Ô=Ü�G˜D ™K˜=Ð)Õ*ð	+ô 	ÐÔØä˜YÓ'ò 
‰ˆˆ4Üˆc�!�A‘#��aœ˜I›Ð' r¨$¨w©-¸¸Ð*<Ð)=¸SÐAÔBÜ2>¸tÀE¹{Ó2KÑ/ˆ�k <Ø"Ò3 d¨7¡mˆØ Ò0 D¨¡Lˆ
Ù6Bœ* \Ô2Èˆà#ˆˆW‰Ø!ˆˆV‰Ø)ˆˆY‰Ü�
‰
�3�ð
ô Ð
œs 9›~Ð.¨hÐ7Ô8Ø˜"˜1�ò ˆÜ��D˜‘L�>  D¨¡M°#°2Ð$6Ð#7Ð8Ô9Ü�˜˜U™�}Ð%Ô&Ü�
œ3˜tŸx™x¨	°2Ó6Ó7Ð8¸Ð?Ô@Ü�ð	ñ Ü˜Ô#äÐÕr   Ú__main__)rg   )Úlinyou_jcygku	   é™•è¥¿çœ�u   æ”¿åºœå…¬å‘Š)Ú__doc__ÚsysÚosrQ   Újsonrv   rÍ   r   Úbs4r   rt   ru   rx   rÅ   r   r   re   rƒ   r›   r¶   r×   Ú__name__© r   r   ú<module>rá      sƒ   ðñ÷ )× (× (Ý Ý à%€Ø)€	ðGàOñ€ð €ò'ò
(ò>óB$òN.)ðb DOØ,óH%òV5ðp ˆzÒÙ…Fð r   