Ë
    kÑyj¾*  ã                   óª  — 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
 ddlmZ ej                  j                  dej                  j                  ej                  j!                  e«      «      «       ddlmZ dZdZdZd	Zd
ZdZeddddœZeddœZg d¢Z ej:                  dej<                  «      Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$e%dk(  r e$«        yy)uÀ  
å�—é€šå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ - å…¬å‘Šå…¬ç¤º(gggs)æ �ç›®çˆ¬è™«
ç³»ç»Ÿ: TRS TrueCMS, å‰�ç«¯ jquery.jpage.js
åˆ—è¡¨API: GET https://sthjj.nantong.gov.cn/truecms/messageController/getMessage.do
  å�‚æ•°(é€†å�‘è‡ª jquery.jpage.js getRemoteData): startrecord / endrecord / perpage / columnId
  (èŒƒå›´å¼�åˆ†é¡µ, é�žé¡µç �å¼�! page/pageNo/offset å�‡æ— æ•ˆ)
  è¿”å›ž JSON: {"result": "<datastore><totalrecord>1820</totalrecord><recordset><record><![CDATA[<li>...<a href=...>æ ‡é¢˜</a><span>YYYY-MM-DD</span></li>]]></record>...</recordset></datastore>"}
  æ³¨æ„�: JSON å†…å¼•å�·è¢«è½¬ä¹‰ä¸º \", éœ€ json.loads å�Žè§£æž�å†…å±‚ HTML
æ �ç›®ID: f53004c4-95fe-476f-8a97-88df5f6e76b3 (gggs.html å†… jpage ajaxParam, totalrecord=1820)
  æ³¨: æœ¬æ �ç›®ä¸ºã€Œå…¬å‘Šå…¬ç¤ºã€�è�šå�ˆ, åˆ—è¡¨ href æ··å�ˆæŒ‡å�‘ tzgg(é€šçŸ¥å…¬å‘Š)/jsxmgs(å»ºè®¾é¡¹ç›®å…¬ç¤º)/cgzbgg(é‡‡è´­æ‹›æ ‡) çš„ content è¯¦æƒ…é¡µ
è¯¦æƒ…é¡µ: https://sthjj.nantong.gov.cn/ntshbj/{æ �}/content/{uuid}.html (requests å�¯ç›´å�–, æ— WAFæ‹¦æˆª)
  ä¸Ž tzgg æ �ç›® URL ç›¸å�Œçš„è®°å½•ç”± INSERT OR IGNORE æŒ‰ URL åŽ»é‡�è‡ªåŠ¨è·³è¿‡, ä¸�é‡�å¤�å…¥åº“
æ ‡é¢˜: åˆ—è¡¨å�³å®Œæ•´æ ‡é¢˜ (å®¹å™¨ div.TRS_UEDITOR / #BodyLabel)
ç”¨æ³•: python3 crawl_nantong_gggs.py [--limit=N] [--pages=N]
é    N)ÚBeautifulSoup)Úurljoin)Úpush_to_searchdbu%   å�—é€šå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€-å…¬å‘Šå…¬ç¤ºu   å…¬å‘Šå…¬ç¤ºzDhttps://sthjj.nantong.gov.cn/truecms/messageController/getMessage.doz$f53004c4-95fe-476f-8a97-88df5f6e76b3é
   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36z.application/json, text/javascript, */*; q=0.01z2https://sthjj.nantong.gov.cn/ntshbj/gggs/gggs.htmlÚXMLHttpRequest)ú
User-AgentÚAcceptÚRefererzX-Requested-Withz)https://sthjj.nantong.gov.cn/ntshbj/gggs/)r   r
   )zdiv#zoomz
div.test-1zdiv.TRS_UEDITORúdiv#BodyLabelzdiv.zwcontentzdiv.contentzdiv#contentz:\.(pdf|doc|docx|xls|xlsx|ppt|pptx|zip|rar|wps|et|ofd|txt)$c                 óÞ   — t        j                  | xs d«      } t        j                  dd| «      } t        j                  dd| «      } t        j                  dd| «      } | j	                  «       S )NÚ z[\u200b\u200e\u200f\ufeff\xa0]ú\s+ú u   ^[â€¢Â·\-â€”]\s*)Úhtml_modÚunescapeÚreÚsubÚstrip)Úts    ú'/root/gov_crawler/crawl_nantong_gggs.pyÚclean_titler   )   sZ   € Ü×Ñ˜!š'˜rÓ"€AÜ
�‰Ð0°"°aÓ8€AÜ
�‰ˆv�s˜AÓ€AÜ
�‰Ð" B¨Ó*€AØ�7‰7‹9Ðó    c                 ó  — t         ||t        dœ}t        d«      D �]§  }	 | j                  t        |t
        d¬«      }|j                  dk7  r5t        d|› d|› d|j                  › d	�«       t        j                  d«       Œft        j                  |j                  «      }|j                  d
d«      }t        j                  d|«      }|rt        |j!                  d«      «      nd}	g }
t        j"                  d|t        j$                  «      D ]¯  }t        j                  d|«      }|st        j                  d|«      }|sŒ4|j!                  d«      t'        |j!                  d«      «      }}t)        |«      dk  rŒnd}t        j                  d|«      }|rd|j+                  «       z  }|
j-                  |||dœ«       Œ± |	|
fc S  dg fS # t.        $ r7}t        d|› d|› d|› d|› �«       t        j                  d«       Y d}~�Œêd}~ww xY w)u'   GET èŒƒå›´è®°å½•: startrecord~endrecord)ÚcolumnIdÚstartrecordÚ	endrecordÚperpageé   é   )ÚparamsÚheadersÚtimeoutéÈ   z    [WARN] list ú-z status=z, retryÚresultr   z<totalrecord>(\d+)<é   r   z&<record><!\[CDATA\[(.*?)\]\]></record>z"<a href="([^"]+)"[^>]*>([^<]+)</a>z"<a href='([^']+)'[^>]*>([^<]+)</a>é   é   z(\d{4})-(\d{2})-(\d{2})z%s-%s-%s)ÚtitleÚhrefÚdatez err z, retry N)Ú	COLUMN_IDÚPER_PAGEÚrangeÚgetÚAPI_URLÚHEADERSÚstatus_codeÚprintÚtimeÚsleepÚjsonÚloadsÚtextr   ÚsearchÚintÚgroupÚfindallÚSr   ÚlenÚgroupsÚappendÚ	Exception)ÚsessionÚstartÚendr    ÚattemptÚrÚjÚinnerÚtotal_mÚtotalÚitemsÚrecÚamr*   r)   r+   ÚdmÚes                     r   Úfetch_list_rangerP   1   sÛ  € ä#°EÈÔX`Ña€FÜ˜“8ó ˆð	Ø—‘œG¨F¼GÈR�ÓPˆAØ�}‰} Ò#ÜÐ(¨¨¨q°°°X¸a¿m¹m¸_ÈGÐTÔUÜ—
‘
˜1”ØÜ—
‘
˜1Ÿ6™6Ó"ˆAØ—E‘E˜( BÓ'ˆEÜ—i‘iÐ 6¸Ó>ˆGÙ-4”C˜Ÿ™ aÓ(Ô)¸!ˆEàˆEÜ—z‘zÐ"KÈUÔTV×TXÑTXÓYò K�Ü—Y‘YÐDÀcÓJ�ÙÜŸ™Ð#HÈ#ÓN�BÙØØ Ÿh™h q›k¬;°r·x±xÀ³{Ó+C�e�Ü�u“: ’>ØØ�Ü—Y‘YÐ9¸3Ó?�ÙØ%¨¯	©	«Ñ3�DØ—‘ u°dÀDÑIÕJðKð ˜%�<Òð7ð> ˆbˆ5€Løô ò 	ÜÐ$ U G¨1¨S¨E°°q°c¸À'ÀÐKÔLÜ�J‰J�q�MŠMûð	ús    A G
ÂEG
Ç
	H
Ç,HÈH
c           
      óD
  — 	 | j                  |t        d¬«      }d|_        |j                  }|j                  dk7  st        |«      dk  ryt        |d	«      }d
}|j                  d«      }|rt        |j                  dd¬«      «      }|s/|j                  d«      }|rt        |j                  dd¬«      «      }|sAt        j                  d|t        j                  «      }	|	rt        |	j!                  d«      «      }|s@|j                  d«      }
|
r-t        |
j                  d¬«      j#                  d«      d   «      }|syd
}t        j                  d|«      }|rGd|j!                  d«      t%        |j!                  d«      «      t%        |j!                  d«      «      fz  }d}t&        D ]*  }|j                  |«      }|sŒ|j                  d¬«      sŒ* n |€||d
g dœS |j                  d«      xs |}g }|j)                  dd¬«      D ]—  }|d   j+                  «       }t,        j                  |«      s)d|j/                  «       v sd|v sd |j/                  «       v sŒT|j1                  |j                  d¬«      xs |j#                  d!«      d"   t3        ||«      d#œ«       Œ™ g }|j)                  g d$¢«      D �]Ð  }|j4                  d%k(  rØ|j7                  d&«      s"|j                  d&«      s|j                  d%«      rŒG|j)                  dd¬«      D ]L  }|d   j+                  «       }t,        j                  |«      sd|j/                  «       v sŒ>t3        ||«      |d<   ŒN |j                  dd¬«      }t        j8                  d'd|«      }|sŒÖ|j1                  d(|z  «       Œë|j4                  d&k(  r~|j)                  dd¬«      D ]L  }|d   j+                  «       }t,        j                  |«      sd|j/                  «       v sŒ>t3        ||«      |d<   ŒN |j1                  t;        |«      «       �Œx|j4                  d)k(  s�Œ‰|j                  d*d
«      }|s�ŒŸ|j1                  d+t3        ||«      ›d,|j                  d-d
«      ›d.�«       �ŒÓ |D ]   }|j1                  d/|d0   ›d1|d2   ›d3�«       Œ" d4j=                  |«      }|s/|j                  dd¬«      }|rd(t        j8                  d'd|«      z  }||||dœS # t        $ r}t        d|› d|› �«       Y d}~yd}~ww xY w)5u)   æ��å�–è¯¦æƒ…: æ ‡é¢˜/æ—¥æœŸ/æ­£æ–‡/é™„ä»¶r   )r!   r"   zutf-8z    [WARN] detail fetch z: Nr#   iô  zhtml.parserr   Úh1r   T)r   zdiv.container-main-titlezE<meta[^>]*name=["\']ArticleTitle["\'][^>]*content=["\']([^"\']*)["\']r&   r)   r$   r   u-   (\d{4})[å¹´\-/. ](\d{1,2})[æœˆ\-/. ](\d{1,2})z%s-%02d-%02dr'   r   ©r)   r+   ÚcontentÚattachmentsr   Úa)r*   r*   Údownloadz
/attached/z/uploadú/éÿÿÿÿ)ÚnameÚurl)ÚpÚtableÚimgr\   r]   r   z	<p>%s</p>r^   Úsrcz<p><img src="z" alt="Úaltz"></p>z<p><a href="r[   z">rZ   z</a></p>ú
)r/   ÚDETAIL_HEADERSÚencodingr8   rA   r3   r2   r>   r   Úfindr   Úget_textÚ
select_oner   r9   ÚIr;   Úsplitr:   Ú
CONTAINERSÚfind_allr   Ú	ATTACH_REÚlowerr@   r   rZ   Úfind_parentr   ÚstrÚjoin)rB   Úpage_urlrF   ÚhrO   Úsoupr)   rR   ÚcmtÚmr   r+   ÚtmÚbody_elÚselÚ	att_scoperU   rV   r*   ÚpartsÚelÚtxtr_   ÚattrT   s                            r   Úfetch_detailr}   V   s»  € ðØ�K‰K˜¬.À"ˆKÓEˆØˆŒ
Ø�F‰Fˆð 	‡}�}˜Òœs 1›v¨š|ØÜ˜˜MÓ*€Dà€EØ	�‰�4‹€BÙ	Ü˜BŸK™K¨°4˜KÓ8Ó9ˆÙØ�o‰oÐ8Ó9ˆÙÜ §¡¨S¸ Ó =Ó>ˆEÙÜ�I‰IÐ^Ð`aÔce×cgÑcgÓhˆÙÜ §¡¨£
Ó+ˆEÙØ�I‰I�gÓˆÙÜ §
¡
° 
Ó 6× <Ñ <¸SÓ AÀ!Ñ DÓEˆEÙØà€DÜ	�‰ÐCÀQÓ	G€BÙ	Ø §¡¨!£¬c°"·(±(¸1³+Ó.>ÄÀBÇHÁHÈQÃKÓ@PÐ QÑQˆà€GÜò ˆØ—/‘/ #Ó&ˆÚ�w×'Ñ'¨dÐ'Õ3Ùðð €Ø¨¸ÈBÑOÐOà—‘ Ó0Ò;°G€IØ€KØ×Ñ ¨$ÐÓ/ò AˆØ�‰y�‰Ó ˆÜ×Ñ˜DÔ! Z°4·:±:³<Ñ%?À<ÐSWÑCWÐ[dÐhl×hrÑhrÓhtÒ[tØ×Ñ¨¯
©
¸¨
Ó(>Ò(UÀ$Ç*Á*ÈSÃ/ÐRTÑBUÜ'.¨x¸Ó'>ñ @õ AðAð €EØ×ÑÒ4Ó5ó mˆØ�7‰7�cŠ>Ø�~‰~˜gÔ&¨"¯'©'°'Ô*:¸b¿g¹gÀc¼lØØ—[‘[ ¨4�[Ó0ò 8�Ø˜‘y—‘Ó(�Ü×#Ñ# DÔ)¨Z¸4¿:¹:»<Ò-GÜ '¨°$Ó 7�A�f’Ið8ð —+‘+˜c¨�+Ó.ˆCÜ—&‘&˜  cÓ*ˆCÚØ—‘˜[¨3Ñ.Õ/Ø�W‰W˜ÒØ—[‘[ ¨4�[Ó0ò 8�Ø˜‘y—‘Ó(�Ü×#Ñ# DÔ)¨Z¸4¿:¹:»<Ò-GÜ '¨°$Ó 7�A�f’Ið8ð �L‰Lœ˜R›Ö!Ø�W‰W˜ÔØ—&‘&˜ Ó#ˆCÛØ—’ÄÈÐSVÕAWÐY[×Y_ÑY_Ð`eÐgiÕYjÐkÖlð+mð, ò OˆØ�Š°S¸³ZÀÀVÃÐMÕNðOà�i‰i˜Ó€GÙØ×Ñ˜s¨$ÐÓ/ˆÙØ!¤B§F¡F¨6°3¸Ó$<Ñ<ˆGØ D°WÈ[ÑYÐYøô[ ò ÜÐ(¨¨
°"°Q°CÐ8Ô9Üûðús   ‚+S; Ó;	TÔTÔTc                  ó   — d\  } }t         j                  dd  D ]`  }|j                  d«      rt        |j	                  d«      d   «      } Œ2|j                  d«      sŒDt        |j	                  d«      d   «      }Œb | |fS )N)r   r   r&   z--limit=ú=z--pages=)ÚsysÚargvÚ
startswithr:   rh   )ÚlimitÚpagesrV   s      r   Ú
parse_argsr…   ¬   st   € Ø�L€Eˆ5Ü�X‰X�a�bˆ\ò )ˆØ�<‰<˜
Ô#Ü˜Ÿ™ › Q™Ó(‰EØ�\‰\˜*Õ%Ü˜Ÿ™ › Q™Ó(‰Eð	)ð
 �%ˆ<Ðr   c                  óR  — t        «       \  } }t        dt        z  «       t        j                  «       }dt        «       g }}}d}d}	 |r||kD  rnÊ|t        z   dz
  }t        |||«      \  }	}
|
s|dk(  rt        d«       y |	r|	}|
D ]:  }|d   |v rŒ|j                  |d   «       d|d   z   |d<   |j                  |«       Œ< t        d|t        |
«      |t        |«      fz  «       |t        z   dz
  |k\  rn$|t        z  }|dz  }t        j                  d	«       ŒÒ|s|nt        ||t        z  «      }|rÄt        |«      |k  r¶t        d
t        |«      ||fz  «       d}||k  r~t        |dz   |«      }t        |||«      \  }}|D ]:  }|d   |v rŒ|j                  |d   «       d|d   z   |d<   |j                  |«       Œ< |dz   }t        j                  d	«       ||k  rŒ~t        dt        |«      z  «       t        dt        |«      |fz  «       | rt        |«      | kD  r|d |  }g }t        |d«      D ]¸  \  }}t        ||d   «      }|€|d   |d   dg dœ}|j                  t        t         |d   |d   |d   xs |d   |d   xs |d   |d   |d   rt#        j$                  |d   d¬«      ndddœ	«       |dz  dk(  rt        d|t        |«      fz  «       t        j                  d«       Œº t        dt        |«      z  «       t'        |d¬«       t        dt        |«      z  «       y )Nz[Nantong-gggs] SITE=%sr   r&   u#     [FAIL] åˆ—è¡¨APIæ— æ•°æ�®, é€€å‡ºr*   zhttps://sthjj.nantong.gov.cnr[   z2  page %d: got %d items (total=%d, accumulated=%d)g333333ã?zC  gap-fill: accumulated %d < %d, rescanning ranges of 30 (up to %d)é   z  after gap-fill: %d itemsz  list done: %d items, total=%dr)   r+   r   rS   rT   rU   F)Úensure_asciiÚnanTong_gggs)	Ú	site_nameÚcategoryÚ
source_urlr[   r)   Úpub_daterT   rU   Ú
group_nameé   z  detail %d/%dgš™™™™™Ù?z!  pushing %d items to searchdb...Únantong_gggs)Úbatch_labelz  DONE. pushed=%d)r…   r3   Ú	SITE_NAMEÚrequestsÚSessionÚsetr-   rP   Úaddr@   r>   r4   r5   ÚminÚ	enumerater}   ÚCATEGORYr6   Údumpsr   )rƒ   Ú	max_pagesrB   rJ   ÚseenÚ
list_itemsrC   Úpage_norD   r   rK   ÚitÚ	gap_limitÚs2Úe2Út2Úitems2ÚresultsÚiÚds                       r   Úmainr¨   ¶   s{  € Ü!“|Ñ€Eˆ9Ü	Ð
"¤YÑ
.Ô/Ü×ÑÓ €Gð  ¤£¨�ˆ4€EØ€EØ€GØ
Ù˜ 9Ò,ØØ”hÑ Ñ"ˆÜ# G¨U°CÓ8‰ˆˆ5Ù˜ AšÜÐ7Ô8ØÙØˆEØò 	"ˆBØ�&‰z˜TÑ!ØØ�H‰H�R˜‘ZÔ Ø6¸¸F¹ÑCˆBˆu‰IØ×Ñ˜bÕ!ð	"ô 	ÐBÀgÌsÐSXËzÐ[`ÔbeÐfpÓbqÐErÑrÔsØ”8Ñ˜aÑ 5Ò(ØØ”ÑˆØ�1‰ˆÜ�
‰
�3Œð+ ñ. '‘¬C°°yÄ8Ñ7KÓ,L€IÙ”�Z“ 9Ò,ÜÐSÔWZÐ[eÓWfÐhqÐs|ÐV}Ñ}Ô~ØˆØ�IŠoÜ�R˜"‘W˜iÓ(ˆBÜ)¨'°2°rÓ:‰JˆB�Øò &�Ø�f‘: Ñ%ØØ—‘˜˜F™Ô$Ø:¸RÀ¹ZÑG��5‘	Ø×!Ñ! "Õ%ð&ð �a‘ˆBÜ�J‰J�sŒOð �I‹oô 	Ð*¬S°«_Ñ<Ô=Ü	Ð
+¬s°:«ÀÐ.FÑ
FÔGá”�Z“ 5Ò(Ø  Ð'ˆ
ð €GÜ˜: qÓ)ò ‰ˆˆ2Ü˜ " U¡)Ó,ˆØˆ9Ø˜W™+¨r°&©zÀbÐY[Ñ\ˆAØ�‰Ü"Ü Ø˜U™)Ø�e‘9Ø�w‘ZÒ. 2 g¡;Ø˜&™	Ò/ R¨¡ZØ˜‘|ØOPÐQ^ÒO_œ4Ÿ:™: a¨Ñ&6ÀUÕKÐegØ(ñ

ô 
	ð ˆr‰6�QŠ;ÜÐ" a¬¨Z«Ð%9Ñ9Ô:Ü�
‰
�3�ð#ô( 
Ð
-´°G³Ñ
<Ô=Ü�W¨.Õ9Ü	Ð
¤ G£Ñ
,Õ-r   Ú__main__)&Ú__doc__Úosr€   r   r6   r4   Úhtmlr   r“   Úbs4r   Úurllib.parser   ÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r’   r™   r0   r,   r-   ÚUAr1   rb   ri   Úcompilerg   rk   r   rP   r}   r…   r¨   Ú__name__© r   r   ú<module>r¹      sÜ   ðñ÷ 1× 0× 0Û Ý Ý  à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à3€	Ø€Ø
P€Ø2€	Ø€àv€ØÐ'WØJÐ`pñr€à "Ð/ZÑ[€âz€
ØˆB�J‰JÐTÐVX×VZÑVZÓ[€	òò"òJSZòlòM.ð` ˆzÒÙ…Fð r   