Ë
    €Ûµ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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	Zd
ZdZddddœZg d¢Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zd„ Z e!dk(  r e «        yy)uK  
Crawler for ä»�å¯¿åŽ¿äººæ°‘æ”¿åºœ - çŽ¯è¯„å®¡æ‰¹
CMS: Visual SiteBuilder 9 (VSB)
List: Table tr[id^=line253142_] > td > a (title) + td (date), 17 items, 1 page
Detail: meta ArticleTitle, meta PubDate, div#vsb_content_4 content
Attachments: a[href*=pdf|doc|rar|zip]

Usage:
    python3 crawl_rsgov_hjsp.py             # Full crawl
é    N)Údatetime)ÚBeautifulSoup)Úurljoinz/root/search.dbu"   ä»�å¯¿åŽ¿äººæ°‘æ”¿åºœ-çŽ¯è¯„å®¡æ‰¹u   çŽ¯è¯„å®¡æ‰¹u   å››å·�zhttp://www.rs.gov.cnz?http://www.rs.gov.cn/zwgk/zfxxgk/fdzdgknr/zdxxgk/sthj1/hjsp.htmzoMozilla/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.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Language)u   ã€�æ‰“å�°æœ¬é¡µã€‘u   ã€�å…³é—­çª—å�£ã€‘u   æ‰“å�°æœ¬é¡µu   å…³é—­çª—å�£u   è½¬è½½åˆ†äº«ï¼šu   æµ�è§ˆé‡�ï¼šu   ç›¸å…³é™„ä»¶ï¼šu   ç›¸å…³ç¨¿ä»¶ï¼šu   æ‰«ä¸€æ‰«åœ¨æ‰‹æœºæ‰“å¼€u	   é™„ä»¶ï¼šu   ç´¯è®¡æ¬¡æ•°ï¼šu	   å­—å�·ï¼šc                 óJ  — g }| j                   D �]s  }t        |t        «      r%|j                  «       }|sŒ'|j	                  |«       Œ9|j
                  dk(  rp|j                  dd«      j                  «       }|j                  d¬«      }|r'|r%t        ||«      }|j	                  d|› d|› d�«       Œ£|sŒ¦|j	                  |«       Œ¸|j
                  d	k(  rU|j                  d
d«      }|sŒÜ|j                  dd«      }	t        ||«      }
|j	                  |	r	d|	› d|
› d�nd|
› d�«       �Œ|j
                  dk(  r|j	                  d«       �Œ>t        |d«      s�ŒL|j                  dd¬«      }|s�Œc|j	                  |«       �Œv dj                  |«      j                  «       S )NÚaÚhrefÚ T©Ústripú[ú](ú)ÚimgÚsrcÚaltú![ú![](Úbrú
Úget_textú )ÚchildrenÚ
isinstanceÚstrr   ÚappendÚnameÚgetr   r   ÚhasattrÚjoin)Úp_tagÚ
detail_urlÚpartsÚelemÚtr	   ÚtextÚfullr   r   Úfull_srcs              ú%/root/gov_crawler/crawl_rsgov_hjsp.pyÚrender_paragraphr*   )   sl  € Ø€EØ—‘ó  ˆÜ�dœCÔ Ø—
‘
“ˆAÚØ—‘˜Q•Ø�Y‰Y˜#ÒØ—8‘8˜F BÓ'×-Ñ-Ó/ˆDØ—=‘= t�=Ó,ˆDÙ™Ü˜z¨4Ó0�Ø—‘˜q   b¨¨¨aÐ0Õ1ÚØ—‘˜TÕ"Ø�Y‰Y˜%ÒØ—(‘(˜5 "Ó%ˆCÚØ—h‘h˜u bÓ)�Ü" :¨sÓ3�Ø—‘¹˜r #  b¨¨
°!Ñ4À4ÈÀzÐQRÐASÖTØ�Y‰Y˜$ÒØ�L‰L˜ÖÜ�T˜:Ö&Ø—‘˜c¨�Ó.ˆAÛØ—‘˜Q–ð1 ð2 �8‰8�E‹?× Ñ Ó"Ð"ó    c                 óü   — g }| j                  d«      D ]e  }|j                  dd«      }|sŒt        ||«      }|j                  dd«      }|j                  |r	d|› d|› d�nd|› d�«       |j	                  «        Œg |S )	Nr   r   r
   r   r   r   r   r   )Úfind_allr   r   r   Ú	decompose)Úcontent_divr"   Úimgsr   r   r(   r   s          r)   Úextract_imagesr1   G   sˆ   € Ø€DØ×#Ñ# EÓ*ò ˆØ�g‰g�e˜RÓ ˆÚÜ˜z¨3Ó/ˆHØ—'‘'˜% Ó$ˆCØ�K‰K±3˜"˜S˜E  H :¨QÑ/¸dÀ8À*ÈAÐ<NÔOØ�M‰M�Oðð €Kr+   c                 óÊ   — g }| j                  d«      D ]L  }t        |«      }t        |j                  d¬«      «      dk\  r|j	                  |«       |j                  «        ŒN |S )NÚtableTr   é   )r-   r   Úlenr   r   r.   )r/   Útablesr3   Ú
table_htmls       r)   Úextract_tablesr8   S   s_   € Ø€FØ×%Ñ% gÓ.ò ˆÜ˜“Zˆ
Üˆu�~‰~ Dˆ~Ó)Ó*¨bÒ0Ø�M‰M˜*Ô%Ø�‰Õð	ð
 €Mr+   c                 ó   — t        | «      S )u'   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼ˆä¸�è½¬ mdï¼‰)r   )r3   ÚargsÚkwargss      r)   Útable_to_mdr<   ]   s   € äˆu‹:Ðr+   c                 óV  ‡
— g }| j                  ddg«      D ]  }|j                  «        Œ t        | «      }t        | |«      }t	        | j                  g d¢d¬«      «      D ]U  }|j
                  dk(  sŒt        ||«      Š
‰
sŒ"t        ˆ
fd„t        D «       «      rŒ;|r‰
|d   vsŒE|j                  ‰
«       ŒW d	j                  |«      }|r6|D ]1  }t        |d
«      j                  d«      }	|	sŒ!|d	t        |	«      z   z  }Œ3 |r|d	d	j                  |«      z   z  }|j                  «       S )NÚscriptÚstyle)Úpr3   ÚdivÚsectionÚcenterÚfontT)Ú	recursiver@   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© )Ú.0ÚskÚtxts     €r)   ú	<genexpr>z"extract_content.<locals>.<genexpr>m   s   øè ø€ Ò>¨R˜r SœyÑ>ùs   ƒéÿÿÿÿz

úhtml.parserr3   )r-   r.   r8   r1   Úlistr   r*   ÚanyÚ
SKIP_TEXTSr   r    r   Úfindr<   r   )r/   r"   r#   ÚsÚtable_htmlsÚ	img_linesÚchildÚresultÚt_htmlÚ	table_tagrK   s             @r)   Úextract_contentrZ   a   s)  ø€ Ø€Eà×!Ñ! 8¨WÐ"5Ó6ò ˆØ	�‰�ðô ! Ó-€KÜ˜{¨JÓ7€Iä�k×*Ñ*Ò+]ÐimÐ*ÓnÓoò &ˆØ�:‰:˜ÓÜ" 5¨*Ó5ˆCÚœ3Ó>´:Ô>Õ>Ù ¨5°©9Ò 4Ø—L‘L Õ%ð&ð �[‰[˜Ó€FÙØ!ò 	:ˆFÜ% f¨mÓ<×AÑAÀ'ÓJˆIÚØ˜&¤;¨yÓ#9Ñ9Ñ9‘ð	:ñ Ø�&˜6Ÿ;™; yÓ1Ñ1Ñ1ˆà�<‰<‹>Ðr+   c                 ó„  — g }t        «       }| j                  dd¬«      D ]�  }|d   }t        j                  d|t        j                  «      sŒ.t        ||«      }|j                  d¬«      xs& |j                  d«      d   j                  d	«      d
   }||vsŒy|j                  |«       |j                  ||dœ«       ŒŸ |S )Nr   T)r	   r	   z&\.(pdf|doc|docx|xls|xlsx|rar|zip|txt)$r   ú/rM   ú?r   )r   Úurl)
Úsetr-   ÚreÚsearchÚIr   r   ÚsplitÚaddr   )Úsoupr"   ÚattsÚseenr   r	   Úfull_urlr   s           r)   Úextract_attachmentsri      s²   € Ø€DÜ‹5€DØ�]‰]˜3 Tˆ]Ó*ò =ˆØ�‰yˆÜ�9‰9Ð>ÀÄbÇdÁdÕKÜ˜z¨4Ó0ˆHØ—:‘: D�:Ó)ÒN¨T¯Z©Z¸«_¸RÑ-@×-FÑ-FÀsÓ-KÈAÑ-NˆDØ˜tÒ#Ø—‘˜Ô"Ø—‘ T°(Ñ;Õ<ð=ð €Kr+   c                 óz  — 	 t        j                  | t        d¬«      }d|_        t        |j                  d«      }d}|j                  d	d
di¬«      }|r$|j                  d«      r|d   j                  «       }|sC|j                  d«      }|r0|j                  d¬«      j                  dd«      j                  «       }d}|j                  d	d
di¬«      }|r'|j                  d«      r|d   j                  «       d d }|j                  dd¬«      }|s|j                  dd¬«      }|sM|j                  d«      }	|	r:|	j                  d«      D ]&  }
|
j                  d¬«      }t        |«      dkD  sŒ$|
} n d}g }|rt!        || «      }t#        || «      }nd| › d|xs | › d�}|rt        |j                  «       «      dk  rd| › d|xs | › d�}|r-|D ](  }d|d
   › d|d    › d!�}||vsŒ|d"|d
   › d|d    › d!�z  }Œ* ||||fS # t        $ r1}t        d| › d|› �t        j                  ¬«       d d d g fcY d }~S d }~ww xY w)#Né   ©ÚheadersÚtimeoutúutf-8z  fetch_detail error z: ©ÚfilerN   r
   Úmetar   ÚArticleTitle)ÚattrsÚcontentÚtitleTr   u   -ä»�å¯¿åŽ¿äººæ°‘æ”¿åºœÚPubDateé
   rA   Úvsb_content_4©ÚidÚnewscontent_s)Úclass_ÚbodyéÈ   z<p><a href="z">z</a></p>r   r   r^   r   u   

é™„ä»¶ï¼š[)Úrequestsr   ÚHEADERSÚencodingÚ	ExceptionÚprintÚsysÚstderrr   r&   rR   r   r   Úreplacer-   r5   rZ   ri   )r^   ÚrÚere   rv   Úmtr%   Údate_strr/   r~   rA   rK   ru   Úattachmentsr   Úinline_markers                   r)   Úfetch_detailrŽ   �   s~  € ð$Ü�L‰L˜¤g°rÔ:ˆØˆŒ
ô
 ˜Ÿ™ Ó/€Dð €EØ	�‰�6 &¨.Ð!9ˆÓ	:€BÙ	ˆb�f‰f�YÔØ�9‘×#Ñ#Ó%ˆÙØ�I‰I�gÓˆÙØ—J‘J T�JÓ*×2Ñ2Ð3KÈRÓP×VÑVÓXˆEð €HØ	�‰�6 &¨)Ð!4ˆÓ	5€BÙ	ˆb�f‰f�YÔØ�i‘=×&Ñ&Ó(¨¨"Ð-ˆð —)‘)˜E o�)Ó6€KÙØ—i‘i ¨o�iÓ>ˆÙà�y‰y˜Ó ˆÙØ—}‘} UÓ+ò �Ø—l‘l¨�lÓ.�Ü�s“8˜c“>Ø"%�KÙð	ð €GØ€KáÜ! +¨sÓ3ˆÜ)¨$°Ó4‰à    R¨ª° ~°XÐ>ˆá”c˜'Ÿ-™-›/Ó*¨RÒ/Ø    R¨ª° ~°XÐ>ˆñ Øò 	EˆAØ  &¡	˜{¨"¨Q¨u©X¨J°aÐ8ˆMØ GÒ+Ø˜^¨A¨f©I¨;°b¸¸5¹¸
À!ÐDÑD‘ð	Eð
 �(˜G [Ð0Ð0øôo ò $ÜÐ% c U¨"¨Q¨CÐ0´s·z±zÕBØ�T˜4 Ð#Õ#ûð$ús   ‚#H  È 	H:È	&H5È/H:È5H:c                  ó8  — 	 t        j                  t        t        d¬«      } d| _        | j                  dk7  r*t        d| j                  › �t        j                  ¬«       g S t        | j                  d«      }g }|j                  d	t        j                  d
«      ¬«      D ]Á  }|j                  d«      }t        |«      dk  rŒ#|d   j!                  d«      }|r|j                  d«      sŒK|d   j#                  «       }|j                  d«      xs |j%                  d¬«      }t'        t        |«      }	|d   j%                  d¬«      }
|sŒ«|	sŒ®|j)                  ||	|
f«       ŒÃ |S # t
        $ r*}t        d|› �t        j                  ¬«       g cY d }~S d }~ww xY w)Né   rl   ro   z  Error fetching list: rp   r   z  List: HTTP rN   Útrz^line253142_rz   Útdé   r   r   r	   rv   Tr   é   )r€   r   ÚLIST_URLr�   r‚   rƒ   r„   r…   r†   Ústatus_coder   r&   r-   r`   Úcompiler5   rR   r   r   r   r   )rˆ   r‰   re   Úitemsr‘   Útdsr   r	   rv   Úpage_urlr‹   s              r)   Úextract_list_pager›   Ï   s]  € ðÜ�L‰Lœ¬7¸BÔ?ˆØˆŒ
ð
 	‡}�}˜ÒÜ�˜aŸm™m˜_Ð-´C·J±JÕ?Øˆ	ä˜Ÿ™ Ó/€Dà€EØ�m‰m˜D¤R§Z¡Z°Ó%@ˆmÓAò 6ˆØ�k‰k˜$ÓˆÜˆs‹8�aŠ<ØØ�‰F�K‰K˜ÓˆÙ˜Ÿ™˜fœØà�‰y�‰Ó ˆØ—‘�g“Ò8 !§*¡*°4 *Ó"8ˆÜœ8 TÓ*ˆØ�q‘6—?‘?¨�?Ó.ˆâ’XØ�L‰L˜% ¨8Ð4Õ5ð6ð  €Løô7 ò ÜÐ'¨ sÐ+´#·*±*Õ=Ø�	ûðús   ‚'E& Å&	FÅ/FÆFÆFc                 ól  — t        d|dz   «      D ]  }	  | «       c S  y
# t        j                  $ r�}dt        |«      v rC||k  r>t	        d|› d|› d|› d|› d�	t
        j                  ¬«       t        j                  |«       n't	        d|› d	|› �t
        j                  ¬«       Y d }~ y
Y d }~Œžd }~ww xY w)Nr”   Úlockedz  z: locked (attempt r\   z), retry in zs...rp   z	 failed: F)	ÚrangeÚsqlite3ÚOperationalErrorr   r„   r…   r†   ÚtimeÚsleep)ÚfnÚdescÚmax_attemptsÚdelayÚattemptr‰   s         r)   Ú
with_retryr¨   ó   s¸   € Ü˜˜L¨1Ñ,Ó-ò 	ˆð	Ù“4ŠKð	ð øô ×'Ñ'ò 	Øœ3˜q›6Ñ! g°Ò&<Ü˜˜4˜&Ð 2°7°)¸1¸\¸NÈ,ÐW\ÐV]Ð]aÐbÔil×isÑisÕtÜ—
‘
˜5Õ!ä˜˜4˜& 	¨!¨Ð-´C·J±JÕ?Ýô "ûð	ús   ”ŸB3²A1B.Â.B3c                  ó€   — t        j                  t        d¬«      } | j                  d«       | j                  d«       | S )Nr�   )rn   zPRAGMA journal_mode=WALzPRAGMA busy_timeout=30000)rŸ   ÚconnectÚDB_PATHÚexecute©Úconns    r)   Úinit_dbr¯     s1   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø€Kr+   c                 ó†  — |r|n|}t        j                  dd|«      j                  «       }|rt        j                  |d¬«      nd}|}	 | j                  dt        |||j                  «       |||t        |t        f
«      }	|	j                  dkD  S # t        $ r(}
t        d|
› �t        j                  ¬	«       Y d }
~
yd }
~
ww xY w)
Nz\s+r   F)Úensure_asciiz[]zÍINSERT OR IGNORE INTO gov_raw
               (site_name, source_url, page_url, title, publish_date, summary, content, category, attachments, group_name)
               VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)r   z  DB error: rp   )r`   Úsubr   ÚjsonÚdumpsr¬   Ú	SITE_NAMEÚCATEGORYÚGROUPÚrowcountrƒ   r„   r…   r†   )r®   rv   rš   Úpublish_dateru   rŒ   ÚsummaryÚatt_jsonÚ
source_urlÚcurr‰   s              r)   Úsave_articler¾     s³   € Ù ‰g e€GÜ�f‰f�V˜S 'Ó*×0Ñ0Ó2€GÙ>IŒt�z‰z˜+°EÕ:Èt€HØ€JðØ�l‰lð8ô ˜
 H¨e¯k©k«m¸\Ø�gœx¨´5ð:ó	
ˆð �|‰|˜aÑÐøÜò Ü�˜Q˜CÐ ¤s§z¡zÕ2Üûðús   Á
AB Â	C ÂB;Â;C c                  óŽ  ‡— t        dt        › �t        j                  ¬«       t	        «       Šd} ˆfd„}t        |dt        › �¬«       t        dt        › �t        j                  ¬«       t        «       }t        dt        |«      › d	�t        j                  ¬«       t        |«      D ]–  \  }\  }}}t        d
|dz   › dt        |«      › d|d d › d�t        j                  ¬«       t        |«      \  }}}	}
|xs |}|xs |}|	xs	 d|› d|› d�}|
xs g }t        ‰|||||«      r| dz  } t        j                  d«       Œ˜ ‰j                  «        ˆfd„}t        |dt        › �¬«       t        dt        › �t        j                  ¬«       ‰j                  «        t        dt        |«      › d| › �t        j                  ¬«       y )Nz	Scraping rp   r   c                  ó&   •— ‰ j                  «        y rG   )Úcommitr­   s   €r)   Údo_cleanzmain.<locals>.do_clean#  s   ø€ ð 	�‰�r+   zClean )r¤   z  Cleaned old data for z  Found z articles on list pagez  [r”   r\   z] Fetching: é2   z...r   r   r   g      à?c                  óT   •— ‰ j                  dt        f«       ‰ j                  «        y )Nz~INSERT INTO gov_search(rowid, title, site_name, summary) SELECT id, title, site_name, summary FROM gov_raw WHERE site_name = ?)r¬   rµ   rÁ   r­   s   €r)   Údo_ftszmain.<locals>.do_fts>  s-   ø€ à�‰ð  Vô  Ybð  Xdô  	eØ�‰�r+   zFTS rebuild z  FTS index rebuilt for z
Done! Total: z, New: )r„   rµ   r…   r†   r¯   r¨   r›   r5   Ú	enumeraterŽ   r¾   r¡   r¢   rÁ   Úclose)Ú	total_newrÂ   ÚarticlesÚidxrv   rš   ÚdateÚ	det_titleÚdet_dateÚdet_contentÚdet_attsÚfinal_titleÚ
final_dateÚfinal_contentÚ
final_attsrÅ   r®   s                   @r)   ÚmainrÔ     s˜  ø€ Ü	ˆI”i�[Ð
!¬¯
©
Õ3Ü‹9€DØ€Iôô ˆx ¤y kÐ2Õ3Ü	Ð#¤I ;Ð
/´c·j±jÕAä Ó"€HÜ	ˆH”S˜“]�OÐ#9Ð
:ÄÇÁÕLä(1°(Ó(;ò Ñ$ˆÑ$ˆe�X˜tÜ��C˜‘E�7˜!œC ›M˜?¨,°u¸S¸b°z°lÀ#ÐFÌSÏZÉZÕXä5AÀ(Ó5KÑ2ˆ	�8˜[¨(ØÒ( 5ˆØÒ% ˆ
Ø#ÒE¨¨;¨-°r¸(¸À1Ð'EˆØ’^ ˆ
ä˜˜k¨8°ZÀÐPZÔ[Ø˜‰NˆIä�
‰
�3�ðð 	‡K�K„Môô ˆv˜l¬9¨+Ð6Õ7Ü	Ð$¤Y KÐ
0´s·z±zÕBà‡J�J„LÜ	ˆOœC ›M˜?¨'°)°Ð
=ÄCÇJÁJÖOr+   Ú__main__)zDB oprx   é   )"Ú__doc__r€   r`   r³   rŸ   r¡   Úosr…   r   Úbs4r   Úurllib.parser   r«   rµ   r¶   r·   ÚBASE_URLr•   r�   rQ   r*   r1   r8   r<   rZ   ri   rŽ   r›   r¨   r¯   r¾   rÔ   Ú__name__rH   r+   r)   ú<module>rÝ      s­   ðñ	÷ 2× 1× 1Ó 1Ý Ý Ý  à
€Ø0€	Ø€Ø€Ø!€ØL€ð DØOØ0ñ€ò€
ò#ò<	òòòò<ò ;1ò@óHòòò*)PðX ˆzÒÙ…Fð r+   