Ë
    ¸¬uj9!  ã                   ó¨   — d 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ZdZd	Zd
diZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zedk(  r e«        yy)uù  
çŠ�ä¸ºåŽ¿äººæ°‘æ”¿åºœ - é‡�å¤§æ°‘ç”Ÿä¿¡æ�¯â†’çŽ¯å¢ƒä¿�æŠ¤ çˆ¬è™«
URL: http://www.qianwei.gov.cn/qwx/hjbht/jcxzdly.shtml
CMS: å¼€æ™®äº‘/UCAP (UCAPTITLE, UCAPCONTENT, PUBLISHTIME)
åˆ—è¡¨: <ul class="list_ul_a"> â†’ <li><a href="..." title="TITLE">TITLE</a><span>DATE</span></li>
åˆ†é¡µ: jcxzdly.shtml(ç¬¬1é¡µ) / jcxzdly_{N}.shtml(ç¬¬2é¡µèµ·) 21æ�¡/é¡µ 34é¡µå…±714æ�¡
è¯¦æƒ…: /qwx/hjbht/{YYYYMM}/{uuid}.shtml
è¯¦æƒ…ç»“æž„: h3>UCAPTITLE(æ ‡é¢˜), PUBLISHTIME(æ—¥æœŸ), div.main#new_content>UCAPCONTENT(æ­£æ–‡)
é    N)Úurljoin)ÚBeautifulSoupzhttp://www.qianwei.gov.cnu"   çŠ�ä¸ºåŽ¿äººæ°‘æ”¿åºœ-çŽ¯å¢ƒä¿�æŠ¤u   å››å·�çœ�ä¹�å±±å¸‚u   ç”Ÿæ€�çŽ¯å¢ƒz/mnt/data/search.dbz
User-AgentzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36c                 óV   — | syt        j                  dd| «      } | j                  «       S )NÚ z(&middot;|&nbsp;|\s)+ú )ÚreÚsubÚstrip)Útexts    ú'/root/gov_crawler/crawl_qianwei_hjbh.pyÚ
clean_textr       s'   € ÙØÜ�6‰6Ð*¨C°Ó6€DØ�:‰:‹<Ðó    c                 óž  ‡— | syt        | d«      }|j                  d«      }|r|n|j                  d«      }|s|j                  d«      }|sy|j                  d«      D ]  }|j	                  «        Œ g }g }t        |j                  «      D ]û  }|j                  €;t        |«      j                  «       }	|	rt        |	«      dkD  r|j                  |	«       ŒJ|j                  dv rŒY|j                  d	k(  r|j                  t        |«      «       Œƒ|j                  d	«      r3|j                  d	d
¬«      D ]  }	|j                  t        |	«      «       Œ ŒÇ|j                  dv sŒÖ|j                  d
¬«      }	|	sŒë|j                  |	«       Œý dj                  |«      }
g }t        |
«      dk  rà|j                  d«      D ]Q  }t        ||d   «      }|j!                  dd«      j                  «       }|rd|› d�nd}|j                  |› d|› �«       ŒS |j                  d«      D ]g  }|d   Št        |‰«      }|j                  d
¬«      xs ‰j#                  d«      d   }t%        ˆfd„dD «       «      sŒQ|j                  d|› d|› �«       Œi |
}|r|ddj                  |«      z   z  }|r|ddj                  |«      z   z  }|j                  «       S ) u2   æ��å�–UCAPæ­£æ–‡ï¼Œè¡¨æ ¼ä¿�ç•™HTMLï¼Œé™„ä»¶åµŒå…¥r   úhtml.parserÚucapcontentzdiv.main#new_contentz
div.detailz"script, style, link, #asbox, .zjscé   )ÚbrÚtableT)Ú	recursive)ÚpÚdivÚsectionÚh1Úh2Úh3Úh4©r
   z

iô  zimg[src]ÚsrcÚaltu	   [å›¾ç‰‡: ú]u   [å›¾ç‰‡]r   úa[href]Úhrefú/éÿÿÿÿc              3   ó\   •K  — | ]#  }‰j                  «       j                  |«      –— Œ% y ­w)N)ÚlowerÚendswith)Ú.0Úextr"   s     €r   ú	<genexpr>z%clean_content_html.<locals>.<genexpr>b   s"   øè ø€ Òd°#�4—:‘:“<×(Ñ(¨×-Ñdùs   ƒ),)z.pdfz.docz.docxz.xlsz.xlsxu	   [é™„ä»¶: ú] ú
)r   ÚfindÚ
select_oneÚselectÚ	decomposeÚlistÚchildrenÚnameÚstrr
   ÚlenÚappendÚfind_allÚget_textÚjoinr   ÚgetÚsplitÚany)Úhtml_contentÚ
detail_urlÚsoupÚucapÚcontentÚtagÚtables_htmlÚ
paragraphsÚchildÚtr   ÚlinksÚimgr   r   ÚlabelÚaÚfull_urlÚfnameÚresultr"   s                       @r   Úclean_content_htmlrN   '   s¼  ø€ áØÜ˜ }Ó5€Dð �9‰9�]Ó#€DÙ‰d §¡Ð0FÓ G€GÙØ—/‘/ ,Ó/ˆáØð �~‰~ÐBÓCò ˆØ�‰�ðð €KØ€Jä�g×&Ñ&Ó'ò %ˆØ�:‰:Ðä�E“
× Ñ Ó"ˆAÙ”S˜“V˜a’Zà×!Ñ! !Ô$ØØ�:‰:˜ÑØØ�:‰:˜Ò Ø×Ñœs 5›zÔ*ØØ�:‰:�gÔØ—^‘^ G°t�^Ó<ò +�Ø×"Ñ"¤3 q£6Õ*ð+àà�:‰:ÐHÒHØ—‘ T�Ó*ˆAÚØ×!Ñ! !Õ$ð+%ð. �;‰;�zÓ"€Dð €EÜ
ˆ4ƒy�3‚Ø—>‘> *Ó-ò 	+ˆCÜ˜* c¨%¡jÓ1ˆCØ—'‘'˜% Ó$×*Ñ*Ó,ˆCÙ*-�i ˜u AÑ&°:ˆEØ�L‰L˜E˜7 ! C 5Ð)Õ*ð		+ð
 —‘ 	Ó*ò 	>ˆAØ�V‘9ˆDÜ˜z¨4Ó0ˆHØ—J‘J T�JÓ*ÒA¨d¯j©j¸«o¸bÑ.AˆEÜÓdÐ9cÔdÕdØ—‘˜y¨¨¨r°(°Ð<Õ=ð	>ð €FÙØ�&˜6Ÿ;™; {Ó3Ñ3Ñ3ˆÙØ�&˜4Ÿ9™9 UÓ+Ñ+Ñ+ˆà�<‰<‹>Ðr   c           	      ó2  — 	 t        j                  dddddd| gdd¬	«      }|j                  d
k(  r)|j                  r|j                  j	                  dd¬«      S t        d|j                  › d| › �«       y# t        $ r}t        d|› �«       Y d}~yd}~ww xY w)zFetch page with curl.Úcurlz-sSz-Lz
--max-timeÚ15z-kTé   )Úcapture_outputÚtimeoutr   úutf-8Úreplace)Úerrorsz  [WARN] curl exit=z for Nz
  [ERROR] )Ú
subprocessÚrunÚ
returncodeÚstdoutÚdecodeÚprintÚ	Exception)ÚurlrM   Úes      r   Ú
fetch_pagera   n   s£   € ðÜ—‘Ø�E˜4 ¨t°TØð!
ð ¨ô,ˆð ×Ñ Ò! f§m¢mØ—=‘=×'Ñ'¨¸	Ð'ÓBÐBÜÐ# F×$5Ñ$5Ð#6°e¸C¸5ÐAÔBØøÜò Ü�
˜1˜#ÐÔÜûðús   ‚AA5 ÁA5 Á5	BÁ>BÂBc                 ó´  — g }t        | d«      }|j                  d«      D ]µ  }|j                  d«      }|j                  d«      }|sŒ(|j                  dd«      }|j                  dd«      xs |j	                  d¬	«      }|rt        |«      d
k  rŒq|r|j	                  d¬	«      nd}	t        |«      }t        t        |«      }
|j                  ||
|	f«       Œ· |S )z3Parse list page, return list of (title, url, date).r   zul.list_ul_a lir!   Úspanr"   r   ÚtitleTr   é   )
r   r/   r.   r:   r8   r5   r   r   ÚBASE_URLr6   )ÚhtmlÚpage_urlÚitemsr?   ÚlirJ   rc   r"   rd   ÚdaterK   s              r   Ú
parse_listrl   ~   sÒ   € à€EÜ˜˜}Ó-€Dà�k‰kÐ+Ó,ò .ˆØ�M‰M˜)Ó$ˆØ�}‰}˜VÓ$ˆÙØà�u‰u�V˜RÓ ˆØ—‘�g˜rÓ"Ò< a§j¡j°t jÓ&<ˆÙœ˜E›
 QšØá,0ˆt�}‰} 4ˆ}Ô(°bˆä˜5Ó!ˆÜœ8 TÓ*ˆà�‰�e˜X tÐ,Õ-ð!.ð$ €Lr   c                 ó6   — | dk(  r	t         › d�S t         › d| › d�S )z(Get list page URL for given page number.é   z/qwx/hjbht/jcxzdly.shtmlz/qwx/hjbht/jcxzdly_z.shtml)rf   )Úpage_nums    r   Úget_list_urlrp   ˜   s+   € à�1‚}Ü�Ð3Ð4Ð4ÜˆZÐ*¨8¨*°FÐ;Ð;r   c           	      ó@  — 	 |j                  dd«      }|j                  dd«      }|dd j                  dd«      }d| › d|› d|› d|› d�	}t        j                  d	t        g|j	                  d
«      dd¬«       y# t
        $ r}t        d| › d|› �«       Y d}~yd}~ww xY w)zSync FTS via subprocess stdin.ú'z''NéÈ   zKINSERT OR REPLACE INTO gov_search(rowid, title, site_name, summary) VALUES(z, 'z', 'z');
Úsqlite3rU   Té
   )ÚinputrS   rT   z  [FTS ERROR] row_id=ú: )rV   rX   rY   ÚDB_PATHÚencoder^   r]   )	Úrow_idrd   Ú	site_nameÚsummaryÚ	title_escÚsite_escÚsumm_escÚsqlr`   s	            r   Úsync_ftsr�   Ÿ   sË   € ð5Ø—M‘M # tÓ,ˆ	Ø×$Ñ$ S¨$Ó/ˆØ˜4˜C�=×(Ñ(¨¨dÓ3ˆØ[Ð\bÐ[cÐcfÐgpÐfqÐquÐv~Ðuð  @Dð  EMð  DNð  NSð  TˆÜ�‰˜	¤7Ð+°3·:±:¸gÓ3FÐW[ÐegÖhøÜò 5ÜÐ% f X¨R°¨sÐ3×4Ñ4ûð5ús   ‚A6A9 Á9	BÂBÂBc                 óÖ  — g }t        «       }t        dt        › d| › �«       t        d| dz   «      D ]®  }t	        |«      }t        d|› d|› �«       t        |«      }|st        d|› �«        nut        ||«      }|D �cg c]  }|d   |vsŒ|‘Œ }}|D ]  }|j                  |d   «       Œ t        dt        |«      › dt        |«      › d	�«       |j                  |«       Œ° t        d
t        |«      › d| › d�«       t        d«      j                  t        «      }	d}
d}d}t        |d«      D �]Ï  \  }\  }}}t        d|› dt        |«      › d|d d › d�d¬«       |	j                  d|f«      j                  «       }|rt        d«       Œ]t        |«      }|st        d«       Œvt!        |d«      }|}|j#                  d«      }|r$|j%                  d¬«      }|rt        |«      dkD  r|}t'        |«      }|}|j#                  d«      }|r7t)        j*                  d|j%                  «       «      }|r|j-                  d«      }t/        ||«      }|rt        |«      d k  r|dz  }|rt        |«      nd}||z  }	 |	j                  d!||xs d"||t        |d d# t0        t2        f«       |	j5                  «        |	j                  d$«      j                  «       d   }t7        ||t        |d d# «       |
dz  }
t        d%|› d&�«       �ŒÒ |	j=                  «        t        d(t        |«      › d)|
› d*|› d+|› �«       y c c}w # t8        $ r)}|	j;                  «        t        d'|› �«       Y d }~�Œ6d }~ww xY w),Nz[START] z	 | pages=rn   z
[LIST] Page rw   z  [FAIL] Cannot fetch page z  Found z items, z newz	
[TOTAL] z items from z pagesrt   r   z  [r#   r+   é(   z...r   )Úendz+SELECT id FROM gov_raw WHERE source_url = ?zSKIP (exists)zFAIL (fetch)r   Ú	ucaptitleTr   re   Úpublishtimez(\d{4}-\d{1,2}-\d{1,2})ru   z�INSERT INTO gov_raw (title, content, publish_date, source_url, site_name, summary, group_name, industry) VALUES (?,?,?,?,?,?,?,?)r   rs   zSELECT last_insert_rowid()zOK (z chars)z
DB ERROR: u   
[DONE] æ€»è®¡ u    æ�¡, æ–°å¢ž u    æ�¡, ç©ºæ­£æ–‡ u    æ�¡, æ€»å­—æ•° )Úsetr]   Ú	SITE_NAMEÚrangerp   ra   rl   Úaddr5   ÚextendÚ
__import__Úconnectrx   Ú	enumerateÚexecuteÚfetchoner   r-   r8   r   r   ÚsearchÚgrouprN   ÚGROUPÚINDUSTRYÚcommitr�   r^   ÚrollbackÚclose)ÚpagesÚ	all_itemsÚ	seen_urlsÚpgr_   rg   ri   ÚitÚ	new_itemsÚconnÚinsertedÚempty_contentÚtotal_charsÚird   rk   Úexistingr?   Úcontent_titleÚ
ucap_titlerF   Úcontent_dateÚpub_timeÚmÚbodyÚcontent_lenÚridr`   s                               r   Úcrawlr¬   «   s›  € Ø€IÜ“€Iä	ˆH”Y�K˜y¨¨Ð
0Ô1ä�A�u˜q‘yÓ!ò $ˆÜ˜2ÓˆÜ�˜r˜d " S EÐ*Ô+Ü˜#‹ˆÙÜÐ/°¨tÐ4Ô5Ùä˜4 Ó%ˆØ"'ÖB˜B¨2¨a©5¸	Ò+A’RÐBˆ	ÐBØò 	!ˆBØ�M‰M˜"˜Q™%Õ ð	!ô 	�œ˜U›˜ H¬S°«^Ð,<¸DÐAÔBØ×Ñ˜Õ#ð$ô  
ˆJ”s˜9“~Ð& l°5°'¸Ð
@ÔAä�iÓ ×(Ñ(¬Ó1€DØ€HØ€MØ€Kä!*¨9°aÓ!8ó 6$ÑˆÑˆE�3˜Ü��A�3�aœ˜I›Ð' r¨%°°¨*¨°SÐ9¸sÕCà—<‘<Ð MÐPSÈvÓV×_Ñ_ÓaˆÙÜ�MÔ#Øä˜#‹ˆÙÜ�LÔ"Øä˜T =Ó1ˆð ˆØ—Y‘Y˜{Ó+ˆ
ÙØ×#Ñ#¨$Ð#Ó/ˆAÙ”S˜“V˜a’ZØ !�ä" =Ó1ˆð ˆØ—9‘9˜]Ó+ˆÙÜ—	‘	Ð4°h×6GÑ6GÓ6IÓJˆAÙØ Ÿw™w q›z�ô " $¨Ó,ˆá”s˜4“y 2’~Ø˜QÑˆMá#'”c˜$”i¨QˆØ�{Ñ"ˆð	$Ø�L‰Lð TØ ¢
¨¨L¸#¼yÈ-ÐX\ÐY\ÐJ]Ô_dÔfnÐoôð �K‰KŒMØ—,‘,Ð;Ó<×EÑEÓGÈÑJˆCÜ�S˜-¬°MÀ$À3Ð4GÔHØ˜‰MˆHÜ�D˜˜ WÐ-Ö.ðg6$ðp 	‡J�J„LÜ	ÐœS ›^Ð,¨M¸(¸ÐCSÐTaÐSbÐbrÐs~Ðrð  Aõ  BùòO CøôD ò 	$Ø�M‰MŒOÜ�J˜q˜cÐ"×#Ò#ûð	$ús%   Á=L1Â
L1É5BL6Ì6	M(Ì?M#Í#M(c                  ó¦   — dd l } | j                  «       }|j                  dt        d¬«       |j	                  «       }t        |j                  «       y )Nr   z--pagesé   )ÚtypeÚdefault)ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsr¬   r˜   )r±   ÚparserÚargss      r   Úmainr¸     sB   € ÛØ×$Ñ$Ó&€FØ
×Ñ˜	¬°QÐÔ7Ø×ÑÓ€DÜ	ˆ$�*‰*Õr   Ú__main__)r®   )Ú__doc__r   ÚsysÚjsonrX   Úurllib.parser   Úbs4r   rf   rˆ   r“   r”   rx   ÚHEADERSr   rN   ra   rl   rp   r�   r¬   r¸   Ú__name__© r   r   ú<module>rÂ      sŒ   ðñó 
Û 
Û Û Ý  å ð '€Ø0€	Ø€Ø€Ø
€ð ð  Dð€ò
òDòNò ò4<ò	5óVBòrð ˆzÒÙ…Fð r   