Ë
    S¬�jz'  ã                   ó   — 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	m
Z
 ddlZdZdZdZ e	j                  «        e
d¬«      z
  j!                  d	«      Zd
ZdZdZdedz   d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)ul  æ°¸ä¸°åŽ¿äººæ°‘æ”¿åºœ - å…¬å‘Šå…¬ç¤ºæ �ç›®çˆ¬è™«
ç«™ç‚¹: http://www.jxyongfeng.gov.cn (æ±Ÿè¥¿å�‰å®‰æ°¸ä¸°åŽ¿, ç»´ç½‘ç§‘æŠ€ CMS)
æ �ç›®: news-list-gggsaa.html (å…¬å‘Šå…¬ç¤º, catid=4734)
WAF: æ—  (requests ç›´è¿ž HTTP 200)
åˆ—è¡¨: POST /api-ajax_list-{page}.html  jQuery æ•°ç»„åº�åˆ—åŒ– body:
      ajax_type[]=5_news&ajax_type[]=4734&ajax_type[]=5&ajax_type[]=news&ajax_type[]=Y-m-d&ajax_type[]=40&ajax_type[]=20&ajax_type[]=["is_top DESC","displayorder DESC","inputtime DESC"]&ajax_type[]=&is_ds=1
      è¿”å›ž JSON {total, data:[{id,title,url,inputtime,...}]}, 20æ�¡/é¡µ
è¯¦æƒ…: /news-show-{id}.html  UTF-8 (å¿…é¡» r.content.decode('utf-8'), ä¸�èƒ½ç”¨ r.text å�¦åˆ™ latin-1 ä¹±ç �)
      æ­£æ–‡ div.xxq_essay (id=content); æ ‡é¢˜ meta ArticleTitle; æ—¥æœŸ meta PubDate
      çº¯PDFåž‹: iframe src=/uploadfile/5/Attachment/xxx.pdf â†’ æ­£æ–‡=æ ‡é¢˜+URLå†…åµŒæ®µ
      é™„ä»¶: <a href="/uploadfile/...">æ–‡ä»¶å��.xlsx</a> ç›¸å¯¹è·¯å¾„ â†’ BASE ç»�å¯¹åŒ–
å…¥åº“: è‡ªåŠ¨æ£€æµ‹ /root/search.db å­˜åœ¨åˆ™ INSERT OR IGNORE ç›´æ�’ gov_raw (FTS è§¦å�‘å™¨è‡ªåŠ¨å�Œæ­¥ gov_search)
è¿�è¡Œ: python3 crawl_yongfeng_gggs.py [--pages=N] [--no-db]
é    N)ÚdatetimeÚ	timedeltau   æ°¸ä¸°åŽ¿-å…¬å‘Šå…¬ç¤ºzhttp://www.jxyongfeng.gov.cnÚ4734iG  )Údaysz%Y-%m-%dz/tmp/yongfeng_gggs.jsonlz/root/search.dbu   å…¬å‘Šå…¬ç¤ºzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36z/news-list-gggsaa.htmlÚXMLHttpRequest)z
User-AgentÚRefererzX-Requested-Withc                 óœ   — t        j                  dd| xs d«      j                  «       } | j                  dd«      j                  dd«      } | S )Nu   ^[â€¢Â·Â·.\s]+Ú u   â€‹u   ï»¿)ÚreÚsubÚstripÚreplace©Úts    ú(/root/gov_crawler/crawl_yongfeng_gggs.pyÚclean_titler   "   sD   € Ü
�‰Ð  " a¢g¨2Ó.×4Ñ4Ó6€AØ	�	‰	�(˜BÓ×'Ñ'¨°"Ó5€AØ€Hó    c                 ó¾  — ddl m}  || d«      }|j                  d„ «      D ]  }|j                  «        Œ |j                  ddg«      D ]  }|j	                  «        Œ 	 |j                  d«      D �cg c]  }|j                  d«      sŒ|‘Œ }}|sn|d   j	                  «        ŒG|j                  dd	¬
«      D ]  }|j	                  «        Œ t        |«      S c c}w )Nr   )ÚBeautifulSoupzhtml.parserc                 ó:   — | j                   xr d| j                   v S )Nú:)Únamer   s    r   ú<lambda>zclean_content.<locals>.<lambda>*   s   €  q§v¡vÒ'?°#¸¿¹°-€ r   ÚspanÚfontÚpÚdivÚ	vw_editor)Úclass_)Úbs4r   Úfind_allÚ	decomposeÚunwrapÚfindÚstr)Úhtmlr   ÚsoupÚtagr   Únestedr   s          r   Úclean_contentr*   '   sÖ   € Ý!Ù˜˜}Ó-€DØ�}‰}Ñ?Ó@ò ˆØ�‰�ðà�}‰}˜f fÐ-Ó.ò ˆØ�
‰
�ðð Ø!Ÿ]™]¨3Ó/Ö?˜°1·6±6¸#µ;’!Ð?ˆÐ?ÙØØˆq‰	×ÑÔð	 ð �}‰}˜U¨;ˆ}Ó7ò ˆØ�
‰
�ðäˆt‹9Ðùò @s   Á3CÂ
Cc                 óÞ   — | r| j                  d«      r| S | j                  «       } | j                  d«      r| j                  dd«      S | j                  d«      r	t        | z   S t        dz   | z   S )NÚ
javascriptÚhttpzhttp://ú/)Ú
startswithr   r   ÚBASE)Úhrefs    r   Ú
absolutizer2   :   sb   € Ù�4—?‘? <Ô0ØˆØ�:‰:‹<€DØ‡��vÔØ�|‰|˜I yÓ1Ð1Ø‡��sÔÜ�d‰{ÐÜ�#‰:˜ÑÐr   c                 ó°  — g }t        j                  d| t         j                  t         j                  z  «      D ]Ú  }|j	                  d«      j                  «       |j	                  d«      }}|r|j                  d«      rŒGt        j                  d|t         j                  «      sŒmt        j                  t        j                  dd|«      «      j                  «       d d }|j                  |xs |j                  d	«      d
   t        |«      dœ«       ŒÜ t        «       }g }|D ]/  }|d   |vsŒ|j                  |d   «       |j                  |«       Œ1 |S )Nz$<a[^>]+href="([^"]+)"[^>]*>(.*?)</a>é   é   r,   z\.(pdf|docx?|xlsx?|zip|rar|7z)$ú<[^>]+>r
   éd   r.   éÿÿÿÿ)r   Úurlr9   )r   ÚfinditerÚIÚSÚgroupr   r/   ÚsearchÚHÚunescaper   ÚappendÚsplitr2   ÚsetÚadd)	Ú	html_fragÚattsÚmr1   Ú	name_htmlr   ÚseenÚuniqÚas	            r   Úextract_attachmentsrL   D   s  € Ø€DÜ�[‰[Ð@À)ÌRÏTÉTÔTV×TXÑTXÉ[ÓYò XˆØŸ'™' !›*×*Ñ*Ó,¨a¯g©g°a«jˆiˆÙ�t—‘ |Ô4ØÜ�9‰9Ð7¸¼r¿t¹tÕDÜ—:‘:œbŸf™f Z°°YÓ?Ó@×FÑFÓHÈÈ#ÐNˆDØ�K‰K Ò!<¨¯©°C«¸Ñ)<ÄZÐPTÓEUÑVÕWðXô ‹5€DØ€DØò ˆØˆU‰8˜4ÒØ�H‰H�Q�u‘XÔØ�K‰K˜�Nðð €Kr   c           
      óf  — dt         dddddg d¢dg	d	d
œ}t        d«      D ]K  }	 t        j                  t        › d| › d�|t
        d¬«      }|j                  dk(  r|j                  «       c S ŒM y # t        $ r8}t        d| › d|d	z   › d|› �d¬«       t        j                  d«       Y d }~Œ‹d }~ww xY w)NÚ5_newsé   ÚnewszY-m-dé(   é   )zis_top DESCzdisplayorder DESCzinputtime DESCr
   r4   )zajax_type[]Úis_dsé   z/api-ajax_list-ú.htmlé   )ÚdataÚheadersÚtimeoutéÈ   u     APIç¬¬u
   é¡µå¤±è´¥(ú): T©Úflushr5   )ÚCATIDÚrangeÚrequestsÚpostr0   ÚHEADERSÚstatus_codeÚjsonÚ	ExceptionÚprintÚtimeÚsleep)ÚpagerW   ÚattemptÚrÚes        r   Ú
fetch_pagerm   U   sÅ   € à ¤%¨¨F°G¸RÀÚNÐPRðTàñ€Dô
 ˜“8ò ˆð	Ü—‘¤  o°d°V¸5ÐAÈÔV]ÐgiÔjˆAØ�}‰} Ò#Ø—v‘v“x’ð $ðð øô ò 	Ü�H˜T˜F *¨W°Q©Y¨K°s¸1¸#Ð>ÀdÕKÜ�J‰J�q�M‰Mûð	ús   ¤AA/Á/	B0Á8.B+Â+B0c                 ó<  — t        d«      D ]M  }	 t        j                  | t        d¬«      }|j                  dk(  r|j
                  j                  dd¬«      c S ŒO y # t        $ r5}t        d|d	z   › d
|› �d¬«       t        j                  d«       Y d }~ŒŠd }~ww xY w)NrT   rV   )rX   rY   rZ   úutf-8r   )Úerrorsu     è¯¦æƒ…å¤±è´¥(r4   r[   Tr\   r5   )r_   r`   Úgetrb   rc   ÚcontentÚdecodere   rf   rg   rh   )r9   rj   rk   rl   s       r   Úfetch_detailrt   e   s–   € Ü˜“8ò ˆð	Ü—‘˜S¬'¸2Ô>ˆAØ�}‰} Ò#Ø—y‘y×'Ñ'¨¸	Ð'ÓBÒBð $ðð øô ò 	Ü�O G¨A¡I ;¨c°!°Ð5¸TÕBÜ�J‰J�q�M‰Mûð	ús   �AAÁ	BÁ&+BÂBc                 ó´  — | syt         j                  j                  t        «      st	        dt        › d�d¬«       yt        j                  t        d¬«      }|j                  d«       d	x}}|j                  «       }| D ]�  }	 |j                  d
t        |d   |d   |d   |d   |d   |d   xs dd d t        d|d   |j                  dd«      |j                  dd«      f«       |j                  d	kD  r|dz  }n|dz  }|j                  «        Œ‘ |j                  «        ||fS # t
        j                  $ r}t	        d|› �d¬«       |dz  }Y d }~ŒSd }~ww xY w)N)r   r   u     æœªå�‘çŽ° u   , è·³è¿‡å…¥åº“ (ä»…å†™ JSONL)Tr\   i"  )rY   zPRAGMA busy_timeout=290000r   zçINSERT OR IGNORE INTO gov_raw
                   (site_name, source_url, page_url, title, publish_date, content, summary, category, script_name, attachments, group_name, industry)
                   VALUES (?,?,?,?,?,?,?,?,?,?,?,?)r9   ÚtitleÚpub_daterr   r
   iô  zcrawl_yongfeng_gggs.pyÚattachmentsÚ
group_nameõ   æ±Ÿè¥¿ÚindustryÚotherr4   z
  DB err: )ÚosÚpathÚexistsÚDB_PATHrf   Úsqlite3ÚconnectÚexecuteÚcursorÚ	SITE_NAMEÚCATEGORYrq   ÚrowcountÚErrorÚcommitÚclose)ÚresultsÚconnÚaddedÚskippedÚcurrk   rl   s          r   Ú
push_to_dbr�   p   s[  € ÙØÜ�7‰7�>‰>œ'Ô"Ü�œW˜IÐ%BÐCÈ4ÕPØÜ�?‰?œ7¨CÔ0€DØ‡L�LÐ-Ô.ØÐ€EˆGØ
�+‰+‹-€CØò ˆð	Ø�K‰Kð7ô ˜A˜e™H a¨¡h°°'±
¸A¸j¹MÈ1ÈYÉ<Ø�I‘,Ò$ " d sÐ+¬XÐ7OÐQRÐS`ÑQaØ—‘�| XÓ.°·±°jÀ'Ó0JðLô	ð �|‰|˜aÒØ˜‘
‘à˜1‘�ð 	�‰�ð#ð$ 	‡J�J„LØ�'ˆ>Ðøô �}‰}ò 	Ü�J˜q˜cÐ"¨$Õ/Ø�q‰L�Gûð	ús   ÂA<D%Ä%EÄ8EÅEc                  ó 	  — dt         j                  v } d }t         j                  D ]2  }|j                  d«      sŒt        |j	                  dd«      d   «      }Œ4 t        dt        › dt        › �d¬«       g }d	d	d	d	d	d	d
œ}d}d}	 |r||kD  r�n?t        |«      }|r|j                  d«      st        d|› d�d¬«       �n|d   d	k(  r0|d   |d<   |d   dz   dz  |d<   t        d|d   › d|d   › d�d¬«       |j                  dg «      }|st        d|› d�d¬«       �n¯t        d|› dt        |«      › d�d¬«       |D �]y  }	|dxx   dz  cc<   t        |	j                  dd«      «      }
|	j                  d«      xs dd d }|r|t        k  r|dxx   dz  cc<   d}Œ_|	j                  d«      xs t        › d |	j                  d!«      › d"�}t        |«      }|st        d#|
d d$ › �d¬«       Œ®|d%xx   dz  cc<   t        j                  d&|«      }|r-t        t!        j"                  |j%                  d«      «      «      n|
}t        j                  d'|«      }|r|j%                  d«      n|d d }|r|t        k  r|dxx   dz  cc<   d}�ŒLt        j                  d(|t        j&                  «      }|r|j%                  d«      nd}t        j(                  d)|«      }t        j*                  d*d|«      j-                  «       }|rt        |«      dk  r$|s"t        d+|d d$ › �d¬«       |d,xx   dz  cc<   �Œõ|rt/        |d	   «      }d-|› d.|› d/|› d0�}n#t1        |«      }t        j*                  d1d2„ |«      }t3        |«      }t        |||||d3d4|rt5        j6                  |d¬5«      ndd6œ	}|j9                  |«       �Œ| |rn||d   k\  rn|dz  }�ŒHt;        t<        d7d8¬9«      5 }|D ]+  }|j?                  t5        j6                  |d¬5«      d:z   «       Œ- 	 d d d «       t        d;t        |«      › d<t<        › �d¬«       | s"tA        |«      \  }}t        d=|› d>|› d?�d¬«       t        d@|d   › dA|d%   › dB|d,   › dC|d   › d?�	d¬«       y # 1 sw Y   ŒtxY w)DNz--no-dbz--pages=ú=r4   u   ç«™ç‚¹: z	 CUTOFF: Tr\   r   )ÚlistÚ	detail_okÚemptyÚcutoffÚtotalÚpagesFr—   u     ç¬¬u   é¡µæ— æ•°æ�®, å�œæ­¢é   rR   r˜   u   å…± u    æ�¡ / u    é¡µrW   u   é¡µæ— æ�¡ç›®, å�œæ­¢u   é¡µ: u    æ�¡r“   rv   r
   Ú	inputtimeé
   r–   r9   z/news-show-ÚidrU   u       è¯¦æƒ…å¤±è´¥: rV   r”   z3<meta[^>]+name="ArticleTitle"[^>]+content="([^"]+)"z.<meta[^>]+name="PubDate"[^>]+content="([^"]+)"z6<div class="xxq_essay"[^>]*>(.*?)<div class="xxq_prev"z#<iframe[^>]+src="([^"]+\.pdf[^"]*)"r6   u       ç©ºæ­£æ–‡è·³è¿‡: r•   z<p><a href="u+   ">ç‚¹å‡»æŸ¥çœ‹PDFå…¬å‘Š</a></p><p><a href="z">z</a></p>z(<img[^>]+src=")([^"]+)(")c                 ó~   — | j                  d«      t        | j                  d«      «      z   | j                  d«      z   S )Nr4   r5   rT   )r=   r2   )Úmms    r   r   zmain.<locals>.<lambda>Ò   s.   € ˜rŸx™x¨›{¬Z¸¿¹À»Ó-DÑDÀrÇxÁxÐPQÃ{ÑR€ r   rz   r|   )Úensure_ascii)	Ú	site_namerv   rw   rr   Ú
source_urlr9   ry   r{   rx   Úwro   )Úencodingú
u   å·²å†™ u    æ�¡åˆ° u   === å…¥åº“: æ–°å¢žu    è·³è¿‡z ===u   === å®Œæˆ�: åˆ—è¡¨u	    è¯¦æƒ…OKu    ç©ºu
    CUTOFFæˆª)!ÚsysÚargvr/   ÚintrB   rf   r…   ÚCUTOFFrm   rq   Úlenr   r0   rt   r   r>   r?   r@   r=   r<   Úfindallr   r   r2   r*   rL   rd   ÚdumpsrA   ÚopenÚOUTÚwriter�   )Úno_dbÚ	max_pagesrK   r‹   ÚstatsÚ
cutoff_hitÚnÚjÚitemsÚitÚ
list_titlerw   Ú
detail_urlÚdetail_htmlrG   rv   Úcontent_htmlÚiframesÚtextÚpdf_urlrr   rF   ÚrecÚfrk   r�   rŽ   s                              r   ÚmainrÀ   �   sÜ  € ØœŸ™Ð!€EØ€IÜ�X‰Xò 0ˆØ�<‰<˜
Õ#Ü˜AŸG™G C¨›O¨AÑ.Ó/‰Ið0ô 
ˆH”Y�K˜y¬¨Ð
1¸Õ>à€GØ Q°¸aÈ!ÐVWÑX€EØ€JØ	€AØ
Ù˜˜YšÙÜ�q‹MˆÙ˜Ÿ™˜gœÜ�E˜!˜Ð0Ð1¸Õ>ÙØ�‰>˜QÒØ˜w™ZˆE�'‰NØ ™j¨2™o°"Ñ4ˆE�'‰NÜ�D˜˜w™Ð(¨°°g±Ð/?¸tÐDÈDÕQØ—‘�f˜bÓ!ˆÙÜ�E˜!˜Ð0Ð1¸Õ>ÙÜ��a�S˜œc %›j˜\¨Ð.°dÕ;Øó 4	 ˆBØ�&‹M˜QÑ‹MÜ$ R§V¡V¨G°RÓ%8Ó9ˆJØŸ™˜{Ó+Ò1¨r°3°BÐ7ˆHÙ˜H¤vÒ-Ø�h“ 1Ñ$“Ø!�
ØØŸ™ ›ÒQ¬T¨F°+¸b¿f¹fÀT»l¸^È5Ð*QˆJÜ& zÓ2ˆKÙÜÐ*¨:°c°r¨?Ð*;Ð<ÀDÕIØØ�+Ó !Ñ#ÓÜ—	‘	ÐPÐR]Ó^ˆAÙ;<”K¤§
¡
¨1¯7©7°1«:Ó 6Ô7À*ˆEÜ—	‘	ÐKÈ[ÓYˆAÙ&'˜Ÿ™ œ
¨X°s¸Ð;ˆHÙ˜H¤vÒ-Ø�h“ 1Ñ$“Ø!�
ÙÜ—	‘	ÐSÐU`Ôbd×bfÑbfÓgˆAÙ)*˜1Ÿ7™7 1œ:°ˆLä—j‘jÐ!GÈÓVˆGÜ—6‘6˜* b¨,Ó7×=Ñ=Ó?ˆDÙ¤C¨£I°¢N¹7ÜÐ-¨e°C°R¨j¨\Ð:À$ÕGØ�g“ !Ñ#“ÙÙä$ W¨Q¡ZÓ0�Ø(¨¨	Ð1\Ð]dÐ\eÐegÐhoÐgpÐpxÐy‘ä'¨Ó5�ÜŸ&™&Ø1ÙRÐT[ó]�ô ' |Ó4ˆDä&ØØ$Ø"Ø(Ø!Ø&Ø#ÙGKœtŸz™z¨$¸UÕCÐQSñ
ˆCð �N‰N˜3Öði4	 ñj ØØ��g‘ÒØØ	ˆQ‰ˆñS ôV 
Œc�3 Ô	)ð >¨QØò 	>ˆAØ�G‰G”D—J‘J˜q¨uÔ5¸Ñ<Õ=ñ	>÷>ô 
ˆG”C˜“L�> ¬#¨Ð
/°tÕ<ÙÜ# GÓ,‰ˆˆwÜÐ" 5 '¨°°	¸Ð>ÀdÕKÜ	Ð˜u V™}˜o¨Y°u¸[Ñ7IÐ6JÈ$ÈuÐU\É~ÐN^Ð^hÐinÐowÑixÐhyÐy}Ð
~ð  GKö  L÷>ð >ús   Ï1RÒRÚ__main__)Ú__doc__rd   r}   r   r¥   rg   r�   r&   r?   r   r   r`   r…   r0   r^   ÚnowÚstrftimer¨   r­   r€   r†   rb   r   r*   r2   rL   rm   rt   r�   rÀ   Ú__name__© r   r   ú<module>rÇ      s¶   ðñ÷ 3× 2× 2Ó 2ß (Û à$€	Ø%€Ø€Ø
ˆ(�,‰,‹.™9¨%Ô0Ñ
0×	:Ñ	:¸:Ó	F€Ø €Ø
€Ø€ð DØÐ.Ñ.Ø(ñ€òò
ò&òò"ò 	òò>^Lð@ ˆzÒÙ…Fð r   