Ë
    ¸¬ujS*  ã                   ón  — 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Z	e	dz   Z
dZdZdd	d
dœZd$d„Zd„ Zd„ Zd%d„Zd„ Zd„ Zedk(  rëdZ ej,                  ed¬«       ddlZdej.                  v xs dej.                  v Z ede›de›d�«        ee¬«      Zer�ej6                  j9                  ed«      Z eee«       ej6                  j9                  ed«      Z eee«        ed ee«      z  «        ed«        ej@                  d «        ej@                  d!«        ed"«       y ed#«       yy)&u¶   
ç¥¥äº‘è‚¡ä»½ (harvin.cn) - æ‹›æ ‡å…¬å‘Šçˆ¬è™«
ç«™ç‚¹ï¼šhttps://www.harvin.cn/news/10/
CMS: ä¸­ä¼�åŠ¨åŠ› (yun300.cn / 300.cn)
åˆ—è¡¨ï¼šAJAX /comp/portalResNews/list.do?currentPage=N
é    N)ÚBeautifulSoupzhttps://www.harvin.cnz	/news/10/u   ç¥¥äº‘è‚¡ä»½-æ‹›æ ‡å…¬å‘Šu   ä¼�ä¸šzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zJtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚAcceptzAccept-Languagec                 ó`   — t        j                  | t        d¬«      }||_        |j                  S )Né   )ÚheadersÚtimeout)ÚrequestsÚgetÚHEADERSÚencodingÚtext)Úurlr   Úrs      ú!/root/gov_crawler/crawl_harvin.pyÚfetchr      s$   € Ü�‰�S¤'°2Ô6€AØ€A„JØ�6‰6€Mó    c                 ó,  — g }t        | d«      }|j                  dd„ ¬«      D ]î  }|j                  d¬«      }|sŒ|j                  d«      }|r1|j	                  d«      r |d   }|j                  d	«      rt        |z   }nŒ]d
}|j                  dd¬«      }|rf|j                  d¬«      }	t        j                  d|	«      }
|
r<|
j                  «       \  }}}|›d|j                  d«      ›d|j                  d«      ›�}|j                  |||dœ«       Œð |S )u   è§£æž�AJAXåˆ—è¡¨é¡µé�¢úhtml.parserÚh2c                 ó   — | xr d| v S )NÚnewTitle© ©Úcs    r   ú<lambda>z$extract_list_items.<locals>.<lambda>%   s   € °1Ò3H¸Àq¸€ r   ©Úclass_T©ÚstripÚaÚhrefú/Ú ÚdivÚ
newToolBoxz!(\d{4})[-/](\d{1,2})[-/](\d{1,2})ú-é   )ÚtitleÚlinkÚdate)r   Úfind_allÚget_textÚfind_parentr
   Ú
startswithÚBASE_URLÚ	find_nextÚreÚsearchÚgroupsÚzfillÚappend)ÚhtmlÚitemsÚsoupr   r(   Úparent_ar)   Údate_strÚtime_divÚ	time_textÚ
date_matchÚyÚmÚds                 r   Úextract_list_itemsrA       s  € à€EÜ˜˜}Ó-€Dà�m‰m˜DÑ)HˆmÓIò GˆØ—‘ $�Ó'ˆÙØà—>‘> #Ó&ˆÙ˜Ÿ™ VÔ,Ø˜FÑ#ˆDØ�‰˜sÔ#Ü $‘‘àð ˆà—<‘< ¨l�<Ó;ˆÙØ ×)Ñ)°Ð)Ó5ˆIÜŸ™Ð#GÈÓSˆJÙØ$×+Ñ+Ó-‘��1�aÚ)*¨A¯G©G°A­J¸¿¹À¼
ÐC�à�‰˜u¨d¸HÑEÕFð1Gð4 €Lr   c                 ó¢	  — t        | d«      }d}|j                  dd„ ¬«      }|rJ|j                  dd¬«      }|r5|j                  d«      }|r|j                  «        |j                  d	¬
«      }|s@|j                  d«      }|r-|j                  d	¬
«      }d|v r|j	                  d«      d   }n|}d}	|j                  dd¬«      }
|
rL|
j                  d«      }|r9t        j                  d|j                  d	¬
«      «      }|r|j                  d«      }	|j                  dd„ ¬«      }g }|�rÐ|j                  dd¬«      }|r|j                  «        |j                  d«      D ]Æ  }g }|j                  d«      D ]‹  }g }|j                  ddg«      D ]N  }|j                  d	d¬«      }t        j                  dd|«      j                  «       }|sŒ>|j                  |«       ŒP |sŒl|j                  dj                  |«      «       Œ� |sŒ§|j                  dj                  |«      «       ŒÈ |j                  d«      D ]  }|j                  «        Œ g }|j                  ddg«      D ][  }|j                  d	¬
«      }|sŒ|j                  dd«      j                  d d«      j                  «       }|sŒK|j                  |«       Œ] |r |j                  d!j                  |«      «       |rd!j                  |«      nd}ní|j                  dd"„ ¬«      }|r×d#D ]-  }|j                  d|fd$„¬«      D ]  }|j                  «        Œ Œ/ t        t        |«      d«      }g }|j                  ddg«      D ]g  }|j                  d	¬
«      }|sŒt!        |«      d%kD  sŒ'|j                  dd«      j                  d d«      j                  «       }|j                  |«       Œi d!j                  |«      }g }|j                  d&t        j"                  d't        j$                  «      ¬(«      D ]�  }|j'                  d)d«      } | j)                  d*«      r
t*        | z   } n| j)                  d+«      rd,| z   } |j                  d	¬
«      xs | j	                  d*«      d-   }!|j                  | |!d.œ«       Œƒ t        j                  d/d!«      j                  «       }||	||d0œS )1u   è§£æž�è¯¦æƒ…é¡µr   r#   Úh1c                 ó   — | xr d| v S )NÚp_headAr   r   s    r   r   z extract_detail.<locals>.<lambda>G   s   € ¨!Ò*>°	¸Q°€ r   r   r$   ÚfontÚiTr   r(   Ú_r   ÚspanÚ	i_pubDateÚliz(\d{4}[-/]\d{1,2}[-/]\d{1,2})é   c                 ó   — | xr
 d| v xr d| v S )NÚ
p_articlesÚe_boxr   r   s    r   r   z extract_detail.<locals>.<lambda>g   s   € °QÒ5]¸<È1Ð;LÒ5]ÐQXÐ\]ÐQ]€ r   Úp_articlesTitleÚtableÚtrÚtdÚthú )r   Ú	separatorz\s+z | ú
Úpõ   Â u   ã€€z

c                 ó   — | xr d| v S )NÚp_NewsDetailr   r   s    r   r   z extract_detail.<locals>.<lambda>“   s   € ¸Ò8Q¸nÐPQÐ>Q€ r   )Úp_topBoxÚ	p_infoBoxÚp_PrevAndNextÚp_PrevAndNextMorP   c                 ó   — | xr || v S )Nr   )r   Úclss     r   r   z extract_detail.<locals>.<lambda>–   s   € ÐQRÒQ_ÐWZÐ^_ÐW_€ r   é   r    z"\.(pdf|doc|docx|xls|xlsx|zip|rar)$)r!   r!   r"   z//zhttps:éÿÿÿÿ)r   Únamez\n{3,})r(   r*   ÚcontentÚattachments)r   ÚfindÚ	decomposer,   Úsplitr-   r1   r2   Úgroupr+   Úsubr   r5   ÚjoinÚreplaceÚstrÚlenÚcompileÚIr
   r.   r/   )"r6   r   r8   r(   rC   Úfont_divÚiconÚ	title_tagÚtr:   Úpub_spanÚ	parent_lir=   Úarticles_divÚcontent_linesÚ	title_divrQ   ÚrowsrR   ÚcellsrS   Ú	cell_textÚ
paragraphsrX   r   re   Únews_detailra   ÚtagÚ	text_souprf   Úa_tagr!   rd   s"                                     r   Úextract_detailrƒ   A   s©  € ä˜˜}Ó-€Dð €EØ	�‰�4Ñ >ˆÓ	?€BÙ	Ø—7‘7˜5¨�7Ó0ˆÙØ—=‘= Ó%ˆDÙØ—‘Ô Ø×%Ñ%¨DÐ%Ó1ˆEñ Ø—I‘I˜gÓ&ˆ	ÙØ×"Ñ"¨Ð"Ó.ˆAØ�a‰xØŸ™ › Q™‘à�ð €HØ�y‰y˜¨ˆyÓ4€HÙà×(Ñ(¨Ó.ˆ	ÙÜŸ™Ð#CÀY×EWÑEWÐ^bÐEWÓEcÓdˆJÙØ%×+Ñ+¨AÓ.�ð —9‘9˜UÑ+]�9Ó^€Là€Mâà ×%Ñ% eÐ4EÐ%ÓFˆ	ÙØ×ÑÔ!ð "×*Ñ*¨7Ó3ò 	6ˆEØˆDØ—n‘n TÓ*ò 3�Ø�ØŸ+™+ t¨T lÓ3ò 0�BØ "§¡°$À# Ó F�IÜ "§¡ v¨s°IÓ >× DÑ DÓ F�IÚ ØŸ™ YÕ/ð	0ò
 Ø—K‘K §
¡
¨5Ó 1Õ2ð3ò Ø×$Ñ$ T§Y¡Y¨t£_Õ5ð	6ð "×*Ñ*¨7Ó3ò 	ˆEØ�O‰OÕð	ð ˆ
Ø×&Ñ&¨¨U |Ó4ò 	,ˆAØ—:‘: D�:Ó)ˆDÚØ—|‘| F¨CÓ0×8Ñ8¸À3ÓG×MÑMÓO�ÚØ×%Ñ% dÕ+ð	,ñ Ø× Ñ  §¡¨ZÓ!8Ô9á0=�&—+‘+˜mÔ,À2‰ð —i‘i Ñ.Q�iÓRˆÙØgò $�Ø&×/Ñ/°ÈCÒ>_Ð/Ó`ò $�CØ—M‘M•Oñ$ð$ô &¤c¨+Ó&6¸ÓFˆIØˆJØ ×)Ñ)¨3°¨,Ó7ò ,�Ø—|‘|¨$�|Ó/�ÚœC ›I¨›MØŸ<™<¨°Ó4×<Ñ<¸XÀsÓK×QÑQÓS�DØ×%Ñ% dÕ+ð	,ð
 —k‘k *Ó-ˆGð €KØ—‘˜s¬¯©Ð4YÔ[]×[_Ñ[_Ó)`�Óaò 8ˆØ�y‰y˜ Ó$ˆØ�?‰?˜3ÔÜ˜d‘?‰DØ�_‰_˜TÔ"Ø˜d‘?ˆDØ�~‰~ Dˆ~Ó)Ò@¨T¯Z©Z¸«_¸RÑ-@ˆØ×Ñ 4°Ñ6Õ7ð8ô �f‰f�Y ¨Ó0×6Ñ6Ó8€Gð ØØØ"ñ	ð r   c                 óV  — t         dz   }d}d}g }| rd}nd}t        d|dz   «      D �]
  }||t        |«      dœ}t        d||fz  «       	 t	        j
                  ||t        d¬	«      j                  }t        |«      }	|	st        d
«        |S t        dt        |	«      z  «       |	D ]‰  }
t        d|
d   dd z  «       	 t        |
d   «      }t        ||
d   «      }|d   xs |
d   |
d   |d   xs |
d   |d   |d   t        t        dœ}|j                  |«       t        j                   d«       Œ‹ �Œ |S # t"        $ rB}t        d|z  «       |j                  |
d   |
d   |
d   dg t        t        dœ«       Y d}~Œ×d}~ww xY w# t"        $ r}t        d||fz  «       Y d}~�Œ}d}~ww xY w)u   çˆ¬å�–å…¨éƒ¨æ–‡ç« z/comp/portalResNews/list.doz$portalResNews_list-15724885164848993Ú10rL   rb   )ÚcompIdÚcidÚcurrentPagez  Fetching list page %d/%d...r   )Úparamsr   r   z    No more items, stoppingz    Found %d itemsz  Fetching: %sr(   Né2   r)   r*   re   rf   )r(   r)   r*   re   rf   Ú	site_namerj   g      à?z    ERROR fetching detail: %sr#   z#    ERROR fetching list page %d: %s)r/   Úrangern   Úprintr	   r
   r   r   rA   ro   r   rƒ   Ú	SITE_NAMEÚGROUPr5   ÚtimeÚsleepÚ	Exception)ÚincrementalÚajax_urlÚcomp_idr‡   ÚresultsÚtotal_pagesÚpage_numr‰   r6   r7   ÚitemÚdetail_htmlÚdetailÚresultÚes                  r   Ú	crawl_allrž   ·   sö  € äÐ7Ñ7€HØ4€GØ
€Cà€GáØ‰àˆä˜!˜[¨1™_Ó-ó 1IˆàØÜ˜x›=ñ
ˆô
 	Ð-°¸;Ð0GÑGÔHð)	IÜ—<‘< °ÄÐRTÔU×ZÑZˆDÜ& tÓ,ˆEáÜÐ3Ô4ØðJ €NôG Ð&¬¨U«Ñ3Ô4àò �ÜÐ&¨¨g©°s¸Ð);Ñ;Ô<ðÜ"'¨¨V©Ó"5�KÜ+¨K¸¸f¹ÓF�Fð "(¨¡Ò!A°D¸±MØ $ V¡Ø & v¡Ò >°$°v±,Ø#)¨)Ñ#4Ø'-¨mÑ'<Ü%.Ü!&ñ�Fð —N‘N 6Ô*Ü—J‘J˜s•Oò#ð%1Iðf €Nøô !ò ÜÐ9¸AÑ=Ô>à—N‘NØ!% g¡Ø $ V¡Ø $ V¡Ø#%Ø')Ü%.Ü!&ñ$÷ ñ ûðûô ò 	IÜÐ7¸8ÀQ¸-ÑG×HÒHûð	IúsI   Á
?FÂ0FÂ=A2D6Ä/FÄ6	FÄ?8E<Å7FÅ<FÆFÆ	F(ÆF#Æ#F(c                 óÞ   — t        |dd¬«      5 }| D ]+  }|j                  t        j                  |d¬«      dz   «       Œ- 	 ddd«       t	        dt        | «      |fz  «       y# 1 sw Y   Œ#xY w)	u   å¯¼å‡ºä¸ºJSONLæ ¼å¼�Úwúutf-8©r   F©Úensure_asciirW   NúExported %d records to %s)ÚopenÚwriteÚjsonÚdumpsr�   ro   )r–   Úoutput_pathÚfr   s       r   Úexport_jsonlr¬   ù   si   € ä	ˆk˜3¨Ô	1ð >°QØò 	>ˆAØ�G‰G”D—J‘J˜q¨uÔ5¸Ñ<Õ=ñ	>÷>ô 
Ð
%¬¨W«°{Ð(CÑ
CÕD÷>ð >ús   �1A#Á#A,c                 óÞ  — t        |dd¬«      5 }|j                  dt        z  «       |j                  dt        z  «       | D ]{  }|d   j	                  dd«      }|d	   j	                  dd«      }t        j                  |d
   d¬«      }d|›d|d   ›d|d   ›d|›d|›d|d   ›d|d   ›d�}|j                  |«       Œ} 	 ddd«       t        dt        | «      |fz  «       y# 1 sw Y   Œ#xY w)u   å¯¼å‡ºä¸ºSQLæ�’å…¥è¯­å�¥r    r¡   r¢   z-- Records for %s
z2DELETE FROM gov_raw WHERE link LIKE '%s/news/%%';
re   ú'z''r(   rf   Fr£   z[INSERT INTO gov_raw (title, link, date, content, attachments, site_name, "group") VALUES ('z', 'r)   r*   r‹   rj   z');
Nr¥   )	r¦   r§   rŽ   r/   rm   r¨   r©   r�   ro   )r–   rª   r«   r   Úcontent_escapedÚtitle_escapedÚattachments_jsonÚsqls           r   Ú
export_sqlr³      sï   € ä	ˆk˜3¨Ô	1ð °QØ	�‰Ð%¬	Ñ1Ô2Ø	�‰ÐGÌ(ÑRÔSØò 	ˆAØ 	™l×2Ñ2°3¸Ó=ˆOØ˜g™J×.Ñ.¨s°DÓ9ˆMÜ#Ÿz™z¨!¨MÑ*:ÈÔOÑò ˜q ›y¨!¨F«)²_ÒFVÐXYÐZeÓXfÐhiÐjqÓhrðˆCð �G‰G�C�Lñ	÷ô 
Ð
%¬¨W«°{Ð(CÑ
CÕD÷ð ús   �B1C#Ã#C,Ú__main__z/root/gov_crawler/outputT)Úexist_okz--incrementalÚ1z	Crawling z (incremental=ú))r“   zharvin.jsonlz
harvin.sqlz
Done! %d articles totalzImporting to DB...z1cd /root/gov_crawler && python3 import_harvin2.pyzsystemctl restart search_appzsearch_app restartedzNo results found!)r¡   )F)!Ú__doc__r	   r1   r¨   r�   ÚosÚsysÚbs4r   r/   ÚLIST_URLrŽ   r�   r   r   rA   rƒ   rž   r¬   r³   Ú__name__Ú
output_dirÚmakedirsÚargvr“   r�   r–   Úpathrl   Ú
jsonl_pathÚsql_pathro   Úsystemr   r   r   ú<module>rÅ      sY  ðñó Û 	Û Û Û 	Û 
Ý à"€Ø�kÑ!€Ø'€	Ø€ð DØZØ0ñ€óò
òBtól@òDEòEð  ˆzÒØ+€JØ€B‡K�K�
 TÕ*ãØ! S§X¡XÐ-Ò@°¸¿¹°€Kâ	ªI²{Ð
CÔDÙ KÔ0€GáØ—W‘W—\‘\ *¨nÓ=ˆ
Ù�W˜jÔ)à—7‘7—<‘< 
¨LÓ9ˆÙ�7˜HÔ%áÐ)©C°«LÑ8Ô9ñ 	Ð"Ô#Øˆ�	‰	ÐEÔFð 	ˆ�	‰	Ð0Ô1ÙÐ$Õ%áÐ!Õ"ð7 r   