Ë
    £,jH$  ã                   ó  — 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„ Z ej                  d«       ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ ddlZddlmZ dZdZd	Zd
ZdddddœZdZd„ Zd„ Zd„ Zdd„Zd„ Zdd„Ze dk(  rKdejB                  v r1 e"ejB                  ejB                  jG                  d«      dz      «      ndZ$ ee$¬«       yy)u+  
Gæ‰¹ crawl_jian_hpsp.py - å�‰å®‰å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-çŽ¯è¯„å®¡æ‰¹å…¬ç¤º
==================================
CMS: è‡ªå»ºPHP + AJAXåˆ†é¡µ
åˆ—è¡¨API: POST /api-ajax_list-{page}.html (jQueryåµŒå¥—æ•°ç»„æ ¼å¼�)
è¯¦æƒ…: /news-show-{id}.html (div.text-main)
CloudWAFé˜²æŠ¤ï¼Œéœ€æµ�è§ˆå™¨UA + session cookies
é    Nc                 óà   — | sy| j                  d«      D �cg c]$  }|j                  «       j                  d«      rŒ#|‘Œ& }}t        j                  dddj                  |«      «      dd S c c}w )uQ   å‰”é™¤ markdown è¡¨æ ¼è¡Œå�Žå�–å‰� 300 å­—ç¬¦ï¼Œé˜²æ­¢æ�œç´¢é¡µæ‘˜è¦�è¡¨æ ¼æ–­è£‚Ú ú
ú|z\s+ú Ni,  )ÚsplitÚstripÚ
startswithÚreÚsubÚjoin)ÚbodyÚlÚliness      ú$/root/gov_crawler/crawl_jian_hpsp.pyÚ_make_summaryr      s_   € áØØŸ
™
 4Ó(ÖJ�1°·±³	×0DÑ0DÀSÕ0IŠQÐJ€EÐJÜ�6‰6�&˜#˜sŸx™x¨›Ó/°°Ð5Ð5ùò Ks
   —$A+¼A+Úignore)Úpush_to_searchdb©ÚBeautifulSoupu+   å�‰å®‰å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-çŽ¯è¯„å®¡æ‰¹å…¬ç¤ºzhttp://sthj.jian.gov.cnz218.64.81.44é   zsthj.jian.gov.cnzoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.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)ÚHostú
User-AgentÚAcceptzAccept-Languagea  ajax_type%5B%5D=53_news&ajax_type%5B%5D=18&ajax_type%5B%5D=53&ajax_type%5B%5D=news&ajax_type%5B%5D=Y-m-d&ajax_type%5B%5D=40&ajax_type%5B%5D=20&ajax_type%5B7%5D%5B%5D=is_top+DESC&ajax_type%5B7%5D%5B%5D=displayorder+DESC&ajax_type%5B7%5D%5B%5D=inputtime+DESC&ajax_type%5B%5D=&is_ds=1c                  óÂ   — t        j                  «       } | j                  j                  t        «       	 | j                  t        › d�d¬«       | S # t        $ r Y | S w xY w)z-Create requests session with CloudWAF cookiesú/news-list-hpsp.htmlé   ©Útimeout)ÚrequestsÚSessionÚheadersÚupdateÚHEADERSÚgetÚBASE_URLÚ	Exception)Úss    r   Úcreate_sessionr)   1   s_   € ä×ÑÓ€AØ‡I�I×Ñ”WÔðØ	�‰”�
Ð.Ð/¸ˆÔ<ð €Høô ò ØØ€Hðús   µA Á	AÁAc                 óž  — t        j                  «       }|j                  j                  t        «       	 |j                  | d¬«      }d|_        |j                  S # t        $ rh t        j                  ddt        › �| «      }	 t        j
                  |t        d¬«      }d|_        |j                  cY S # t        $ r}Y d}~Y yd}~ww xY ww xY w)z8Fetch detail page, try domain first, fallback to IP+Hostr   r   zutf-8zhttps?://sthj\.jian\.gov\.cnzhttp://)r"   r   N)r    r!   r"   r#   r$   r%   ÚencodingÚtextr'   r   r   ÚIP)Úurlr(   ÚrÚip_urlÚes        r   Úfetch_detailr2   =   s«   € ä×ÑÓ€AØ‡I�I×Ñ”WÔðØ�E‰E�#˜rˆEÓ"ˆØˆŒ
Ø�v‰vˆøÜò ä—‘Ð7¸7Ä2À$¸ÈÓMˆð	Ü—‘˜V¬W¸bÔAˆAØ ˆAŒJØ—6‘6ŠMøÜò 	Ýûð	úðús/   µ%A Á'CÂ.B4Â1CÂ4	CÂ=CÃCÃCc                 ó�  — t         }t        d   dddt        › d�dœ}	 | j                  t        › d|› d�||d	¬
«      }|j                  dk7  rg dfS |j                  «       }|j                  d«      sg |j                  dd«      fS g }|d   D ]’  }|j                  dd«      j                  «       }|j                  dd«      }	|j                  dd«      }
|	r5|	j                  d«      s$t        j                  j                  t        |	«      }	|j                  ||	|
dœ«       Œ” ||j                  dd«      fS # t        $ r g dfcY S w xY w)zFetch list page via AJAX APIr   z&application/json, text/javascript, */*ÚXMLHttpRequestz0application/x-www-form-urlencoded; charset=UTF-8r   )r   r   zX-Requested-WithzContent-TypeÚRefererz/api-ajax_list-z.htmlr   )r"   Údatar   éÈ   r   r6   ÚtotalÚtitler   r.   Ú	inputtimeÚhttp)r9   r.   Údate)ÚAJAX_DATA_TEMPLATEr$   r&   ÚpostÚstatus_codeÚjsonr'   r%   r	   r
   ÚurllibÚparseÚurljoinÚappend)ÚsessionÚpage_nor6   Úapi_headersr/   ÚresultÚitemsÚitemr9   r.   r<   s              r   Úfetch_list_pagerK   P   sY  € ä€Dä˜lÑ+Ø:Ø,ØJÜ�ZÐ3Ð4ñ€KðØ�L‰LœH˜: _°W°I¸UÐCØ!,°4Àð ó Eˆà�=‰=˜CÒØ�q�5ˆLØ—‘“ˆð �:‰:�fÔØ�6—:‘:˜g qÓ)Ð)Ð)à€EØ�v‘ò AˆØ—‘˜ "Ó%×+Ñ+Ó-ˆØ�h‰h�u˜bÓ!ˆØ�x‰x˜ RÓ(ˆÙ�s—~‘~ fÔ-Ü—,‘,×&Ñ&¤x°Ó5ˆCØ�‰˜u¨S¸$Ñ?Õ@ðAð �&—*‘*˜W aÓ(Ð(Ð(øô ò Ø�1ˆuŠðús   ž1D5 ÁD5 Ä5EÅEc                 óØ  — ddl m}  |t        | «      d«      }|j                  d«      D ]P  }|j	                  dd«      }|sŒ|j                  d«      rŒ*|r t        j                  j                  ||«      n||d<   ŒR |j                  d«      D ]P  }|j	                  d	d«      }|sŒ|j                  d
«      rŒ*|r t        j                  j                  ||«      n||d	<   ŒR t        |«      S )uA   ä¿�ç•™ HTML è¡¨æ ¼ç»“æž„ï¼Œä»…å°†ç›¸å¯¹é“¾æŽ¥/å›¾ç‰‡è½¬ç»�å¯¹ URLr   r   úhtml.parserÚaÚhrefr   )r;   Ú
javascriptú#ÚimgÚsrc)r;   z//zdata:)	Úbs4r   ÚstrÚfind_allr%   r
   rA   rB   rC   )ÚtableÚbase_urlr   ÚtblrN   rO   rR   rS   s           r   Úhtml_table_to_htmlrZ   q   sÐ   € å!Ù
œ˜E›
 MÓ
2€CØ�\‰\˜#Óò SˆØ�u‰u�V˜RÓ ˆÚ˜Ÿ™Ð(CÕDÙ@HœŸ™×,Ñ,¨X°tÔ<ÈdˆAˆfŠIðSð �|‰|˜EÓ"ò RˆØ�g‰g�e˜RÓ ˆÚ�s—~‘~Ð&=Õ>Ù@HœŸ™×-Ñ-¨h¸Ô<ÈcˆC�ŠJðRô ˆs‹8€Oó    c           	      óâ  ‡— t        | «      }|sdddg fS t        |d«      }|j                  d«      }|r|j                  d¬«      nd}t	        j
                  dd|«      j                  «       }d}t	        j                  d|«      }|r|j                  d	«      }|j                  d
d¬«      }|s||dg fS g }g }	|j                  g d¢d¬«      D �]÷  }
|
j                  dv �r3|
j                  d«      D ]�  }|j                  dd«      }|j                  d¬«      }|sŒ*d|v sŒ/t        j                  j                  t        |«      Š|	j!                  |‰dœ«       |sŒj|j!                  d|› d‰› d�«       Œƒ d}|
j                  d«      D ]  }|j#                  |«       Œ |
j                  dd¬«      }|j%                  |d«      }t	        j
                  dd|«      }|s�Œt'        |«      dkD  s�Œ!d|dd  vs�Œ*d!|dd  vs�Œ3|j!                  |«       �ŒF|
j                  d"k(  r(t)        |
t        ¬#«      }|s�Œj|j!                  |«       �Œ}|
j                  d$k(  s�ŒŽ|
j                  d%d«      }|
j                  d&d«      }|s�Œ¶d|v s�Œ¼t        j                  j                  t        |«      }|j!                  d'|› d|› d�«       �Œú |j                  d«      D ]{  }|j                  dd«      }|j                  d¬«      }|sŒ*d|v sŒ/t        j                  j                  t        |«      Št+        ˆfd(„|	D «       «      rŒh|	j!                  |‰dœ«       Œ} |rdj-                  |«      nd}||||	fS ))z0Extract content from detail page (div.text-main)NrM   r9   T)r	   r   u   ^å�‰å®‰å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€\s*u,   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{1,2}-\d{1,2})é   Údivz	text-main)Úclass_)ÚprW   rR   r^   ÚspanF)Ú	recursive)r`   r^   ra   rN   rO   z/uploadfile/)Únamer.   z- [ú](ú)z BR Úbrr   r   z\n\s*\nz

é   u   é¦–é¡µé
   u   å½“å‰�ä½�ç½®rW   )rX   rR   rS   Úaltz![c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w)r.   N© )Ú.0Úa2Úfull_urls     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>Å   s   øè ø€ ÒC°�r˜%‘y HÕ,ÑCùs   ƒ)r2   r   ÚfindÚget_textr   r   r	   ÚsearchÚgrouprV   rc   r%   rA   rB   rC   r&   rD   Úreplace_withÚreplaceÚlenrZ   Úanyr   )Ú
detail_urlr,   ÚsoupÚ	title_tagr9   Údate_strÚdate_mÚ	text_mainÚ
body_partsÚattachmentsÚelrN   rO   ÚfnameÚDELIMrf   ÚtxtÚmdrS   ri   Úfull_srcr   rn   s                         @r   Úparse_detailr†   €   sN  ø€ ä˜
Ó#€DÙØ�T˜4 Ð#Ð#Ü˜˜}Ó-€Dð —	‘	˜'Ó"€IÙ.7ˆI×Ñ TÐÔ*¸R€EÜ�F‰FÐ2°B¸Ó>×DÑDÓF€Eð €HÜ�Y‰YÐFÈÓM€FÙØ—<‘< “?ˆð —	‘	˜%¨�	Ó4€IÙØ�h  bÐ(Ð(à€JØ€Kð × Ñ Ò!EÐQVÐ ÓWó !;ˆØ�7‰7Ð*Ò*à—[‘[ Ó%ò F�Ø—u‘u˜V RÓ(�ØŸ
™
¨˜
Ó.�Ú˜N¨dÒ2Ü%Ÿ|™|×3Ñ3´H¸dÓC�HØ×&Ñ&°¸hÑ'GÔHâØ"×)Ñ)¨C°¨w°b¸¸
À!Ð*DÕEðFð !ˆEØ—k‘k $Ó'ò '�Ø—‘ Õ&ð'à—+‘+˜c¨�+Ó.ˆCØ—+‘+˜e TÓ*ˆCÜ—&‘&˜ V¨SÓ1ˆCÛ”s˜3“x !”|à 3 s¨ 8Ó+°ÀcÈ#È2ÀhÓ0NØ×%Ñ% cÖ*Ø�W‰W˜ÒÜ# B´Ô:ˆBÛØ×!Ñ! "Ö%Ø�W‰W˜ÔØ—&‘&˜ Ó#ˆCØ—&‘&˜ Ó#ˆCÛ�~¨Ó,Ü!Ÿ<™<×/Ñ/´¸#Ó>�Ø×!Ñ! B s e¨2¨h¨Z°qÐ"9Ö:ðC!;ðH ×Ñ Ó$ò EˆØ�u‰u�V˜RÓ ˆØ—
‘
 �
Ó&ˆÚ�N dÒ*Ü—|‘|×+Ñ+¬H°dÓ;ˆHäÓC°{ÔCÕCØ×"Ñ"¨E¸(Ñ#CÕDðEñ '1ˆ6�;‰;�zÔ"°d€DØ�(˜D +Ð-Ð-r[   rg   c                 ó2  — t        «       }g }d}t        d| dz   «      D ]U  }t        ||«      \  }}|s nB|}|j                  |«       t	        d|› dt        |«      › d�d¬«       t        |«      |k\  sŒU n t	        dt        |«      › �d¬«       g }d}d}	t        |«      D ]Ä  \  }
}|d	   }|d
   }|d   }t        |«      \  }}}}|xs |}|xs |}|r,dj                  |D �cg c]  }d|d   › d|d
   › d�‘Œ c}«      nd}|r|	dz  }	|s|dz  }|j                  t        |||||xs dt        |«      |dœ«       |
dz   dz  dk(  sŒ¦t	        d|
dz   › dt        |«      › �d¬«       ŒÆ t	        dt        |«      › d|› d|	› d�d¬«       t        |d«       y c c}w )Nr   r]   zPage z: z itemsT)Úflushz
Total list items: r9   r.   r<   ú;ú[rc   rd   re   r   )Ú	site_namer9   r.   Ú
source_urlÚpub_dateÚcontentÚsummaryr   rh   z
  Parsed: ú/zParsed: z items (z empty body, z with attachments)Ú	jian_hpsp)r)   ÚrangerK   ÚextendÚprintrv   Ú	enumerater†   r   rD   Ú	SITE_NAMEr   r   )ÚpagesrE   Ú	all_itemsÚtotal_countrF   rI   r8   ÚresultsÚ
empty_bodyÚwith_attachÚirJ   r9   rx   Ú	list_dateÚparsed_titler�   r   r   Úfinal_titleÚ
final_daterN   Ú
attach_strs                          r   Úcrawlr£   Ì   sð  € ÜÓ€Gà€IØ€Kä˜˜E A™IÓ&ò ˆÜ& w°Ó8‰ˆˆuÙÙØˆØ×Ñ˜ÔÜ��g�Y˜b¤ U£ ¨FÐ3¸4Õ@Üˆy‹>˜[Ó(Ùðô 
Ð ¤ Y£Ð 0Ð
1¸Õ>à€GØ€JØ€Kä˜YÓ'ò C‰ˆˆ4Ø�W‘ˆØ˜%‘[ˆ
Ø˜‘Lˆ	Ü4@ÀÓ4LÑ1ˆ�h  kØ"Ò+ eˆØÒ* ˆ
ÙVa�S—X‘XÀ[ÖQÀ  1 V¡9 +¨R°°%±¨z¸Ò;ÒQÔRÐgiˆ
ÙØ˜1ÑˆKÙØ˜!‰OˆJØ�‰Ü"Ø ØØ$Ø"Ø’z˜rÜ$ TÓ*Ø%ñ	
ô 		ð �‰E�R‰<˜1ÓÜ�J˜q ™s˜e 1¤S¨£^Ð$4Ð5¸TÖBð/Cô2 
ˆH”S˜“\�N (¨:¨,°mÀKÀ=ÐPbÐ
cÐkoÕpÜ�W˜kÕ*ùò' Rs   Ã"F
Ú__main__z--pagesr]   )r—   )r   )rg   )%Ú__doc__ÚsysÚosr   Úurllib.parserA   r@   Úwarningsr   ÚfilterwarningsÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r    rT   r   r–   r&   r-   Ú	PAGE_SIZEr$   r=   r)   r2   rK   rZ   r†   r£   Ú__name__ÚargvÚintÚindexr—   rk   r[   r   ú<module>r¶      s  ðñ÷ 1× 0× 0ò6ð €× Ñ ˜Ô !à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (ã Ý à9€	Ø$€Ø€Ø€	ð ð DØOØ0ñ	€ðFð ò	òò&)óBòI.óX0+ðf ˆzÒØ<EÈÏÉÑ<Q‰C�—‘˜Ÿ™Ÿ™¨	Ó2°QÑ6Ñ7Ô8ÐWX€EÙ	�Öð r[   