Ë
    £,jU#  ã                   ó  — 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 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j@                  v r1 e!ej@                  ej@                  jE                  d«      dz      «      ndZ# ee#¬«       yy)u  
å�‰å®‰å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ â€” æ‹Ÿå�—ç�†é¡¹ç›®å…¬ç¤º
==================================
CMS: è‡ªå»ºPHP + AJAXåˆ†é¡µ
åˆ—è¡¨API: POST /api-ajax_list-{page}.html (jQueryåµŒå¥—æ•°ç»„æ ¼å¼�)
è¯¦æƒ…: /news-show-{id}.html (div.text-main)
CloudWAFé˜²æŠ¤ï¼Œéœ€æµ�è§ˆå™¨UA + session cookies
é    NÚ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=124&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-nasfloxmmvgmss.htmlé   ©Útimeout)ÚrequestsÚSessionÚheadersÚupdateÚHEADERSÚgetÚBASE_URLÚ	Exception)Úss    ú/root/gov_crawler/crawl_jian.pyÚcreate_sessionr   )   s_   € ä×ÑÓ€AØ‡I�I×Ñ”WÔðØ	�‰”�
Ð8Ð9À2ˆÔFð €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   ÚreÚsubÚIP)Úurlr   ÚrÚip_urlÚes        r   Úfetch_detailr%   5   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   r)   ÚtotalÚtitleÚ r!   Ú	inputtimeÚhttp)r,   r!   Údate)ÚAJAX_DATA_TEMPLATEr   r   ÚpostÚstatus_codeÚjsonr   r   ÚstripÚ
startswithÚurllibÚparseÚurljoinÚappend)ÚsessionÚpage_nor)   Úapi_headersr"   ÚresultÚitemsÚitemr,   r!   r0   s              r   Úfetch_list_pagerA   H   sY  € ä€Dä˜lÑ+Ø:Ø,ØJÜ�ZÐ=Ð>ñ€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   r6   r7   r8   r9   )ÚtableÚbase_urlr   ÚtblrD   rE   rH   rI   s           r   Úhtml_table_to_htmlrP   i   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)NrC   r,   T)r5   r-   u   ^å�‰å®‰å¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€\s*u,   å�‘å¸ƒæ—¶é—´[ï¼š:]\s*(\d{4}-\d{1,2}-\d{1,2})é   Údivz	text-main)Úclass_)ÚprM   rH   rT   ÚspanF)Ú	recursive)rV   rT   rW   rD   rE   z/uploadfile/)Únamer!   z- [ú](ú)z BR Úbrú ú
z\n\s*\nz

é   u   é¦–é¡µé
   u   å½“å‰�ä½�ç½®rM   )rN   rH   rI   Ú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   ƒ)r%   r   ÚfindÚget_textr   r   r5   ÚsearchÚgrouprL   rY   r   r7   r8   r9   r   r:   Úreplace_withÚreplaceÚlenrP   ÚanyÚjoin)Ú
detail_urlr   ÚsoupÚ	title_tagr,   Údate_strÚdate_mÚ	text_mainÚ
body_partsÚattachmentsÚelrD   rE   ÚfnameÚDELIMr\   ÚtxtÚmdrI   ra   Úfull_srcÚbodyrf   s                         @r   Úparse_detailr€   x   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 +Ð-Ð-rQ   r_   c                 ó`  — 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|rt        j                  dd|xs d«      d d nd|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   rS   zPage z: z itemsT)Úflushz
Total list items: r,   r!   r0   ú;ú[rY   rZ   r[   r-   z\s+r]   i,  )Ú	site_namer,   r!   Ú
source_urlÚpub_dateÚcontentÚsummaryrx   r`   z
  Parsed: ú/zParsed: z items (z empty body, z with attachments)Újian_nsl)r   ÚrangerA   ÚextendÚprintrn   Ú	enumerater€   rp   r:   Ú	SITE_NAMEr   r   r   )Úpagesr;   Ú	all_itemsÚtotal_countr<   r?   r+   ÚresultsÚ
empty_bodyÚwith_attachÚir@   r,   rq   Ú	list_dateÚparsed_titler‡   r   rx   Úfinal_titleÚ
final_daterD   Ú
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ÙBFœŸ™˜v s¨DªJ°BÓ7¸¸Ñ=ÈBØ%ñ	
ô 		ð �‰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˜jÕ)ùò' Rs   Ã"F+
Ú__main__z--pagesrS   )r‘   )r-   )r_   )$Ú__doc__ÚsysÚosr   Úurllib.parser7   r4   ÚwarningsÚfilterwarningsÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r   rJ   r   r�   r   r    Ú	PAGE_SIZEr   r1   r   r%   rA   rP   r€   r�   Ú__name__ÚargvÚintÚindexr‘   rc   rQ   r   ú<module>r°      sý   ðñ÷ 1× 0× 0Ø €× Ñ ˜Ô !à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (ã Ý à<€	Ø$€Ø€Ø€	ð ð DØOØ0ñ	€ðFð ò	òò&)óBòI.óX0*ðf ˆzÒØ<EÈÏÉÑ<Q‰C�—‘˜Ÿ™Ÿ™¨	Ó2°QÑ6Ñ7Ô8ÐWX€EÙ	�Öð rQ   