Ë
    t
ƒj"  ã                   óT  — 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ej                  j                  dej                  j                  ej                  j                  e«      «      «       ddlmZ dZdZedz   ZdZdZdd	lmZ dd
lmZ d„ Zd„ Zd„ Zdd„Zd„ Zedk(  r e«        yy)u7  
crawl_jinxiang_tzgg.py - é‡‘ä¹¡åŽ¿é€šçŸ¥å…¬å‘Š (jinxiang.gov.cn col18311, JXA61)
ç«™ç‚¹: æ—  WAF, ä½† curl è¢«æœ¬åœ° TLS æ‹¦æˆª -> playwright ç¨³å®š
åˆ—è¡¨: POST /module/xxgk/search.jsp
  body: infotypeId=JXA61&jdid=96&area=&divid=div4&vc_title=&vc_number=
        &sortfield=compaltedate:0&currpage={N}&standardXxgk=1&isAllList=1
  è¿”å›ž HTML ç‰‡æ®µ, æ¯�é¡µ 15 æ�¡, total=3102 (207é¡µ)
åˆ—è¡¨æ�¡ç›®: a[href*="art_18311_"] è¯¦æƒ…é“¾æŽ¥
è¯¦æƒ…: /art/YYYY/M/D/art_18311_{id}.html?xxgkhide=1
  æ ‡é¢˜: meta ArticleTitle | æ�¥æº�: meta ContentSource | æ­£æ–‡: div#zoom
é    N)Úpush_to_searchdbu   é‡‘ä¹¡åŽ¿-é€šçŸ¥å…¬å‘Šzhttp://www.jinxiang.gov.cnzX/module/xxgk/search.jsp?standardXxgk=1&isAllList=1&currpage={p}&sortfield=compaltedate:0zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36z
2023-08-17)Úasync_playwright)ÚStealthc                 ó6   — dddddddt        | «      dddddddœS )NÚJXA61Ú96Ú Údiv4zcompaltedate:0Ú1)Ú
infotypeIdÚjdidÚareaÚdividÚvc_titleÚ	vc_numberÚ	sortfieldÚcurrpageÚvc_filenumberÚvc_allÚtexttypeÚfbtimeÚstandardXxgkÚ	isAllList)Ústr)r   s    ú(/root/gov_crawler/crawl_jinxiang_tzgg.pyÚsearch_bodyr      s:   € àØØØØØØ%Ü˜“MØØØØØØñð ó    c                 óX  — g }t        j                  d| t         j                  «      D ]¿  }|j                  d«      }t        j                  dd|j                  d«      «      j                  «       }t        j                  dd|«      j                  «       }t        j                  dd|«      j                  «       }|j                  d	«      s	t        |z   }|j                  ||d
œ«       ŒÁ t        «       }g }|D ]/  }|d   |vsŒ|j                  |d   «       |j                  |«       Œ1 |S )u'   è§£æž� search.jsp è¿”å›žçš„ HTML ç‰‡æ®µz<<a[^>]*href="([^"]*art_18311_\d+\.html[^"]*)"[^>]*>(.*?)</a>é   z<[^>]+>r	   é   z\s+ú u   ^ã€�[^ã€‘]*ã€‘Úhttp)ÚtitleÚurlr$   )ÚreÚfinditerÚSÚgroupÚsubÚstripÚ
startswithÚBASEÚappendÚsetÚadd)ÚhtmlÚitemsÚmÚhrefr#   ÚseenÚoutÚits           r   Ú
parse_listr7   0   s  € à€Eä�[‰[ÐXÐZ^Ô`b×`dÑ`dÓeò 4ˆØ�w‰w�q‹zˆÜ—‘�z 2 q§w¡w¨q£zÓ2×8Ñ8Ó:ˆÜ—‘�v˜s EÓ*×0Ñ0Ó2ˆÜ—‘Ð(¨"¨eÓ4×:Ñ:Ó<ˆØ�‰˜vÔ&Ü˜$‘;ˆDØ�‰˜u¨TÑ2Õ3ð4ô ‹5€DØ
€CØò ˆØˆe‰9˜DÒ Ø�H‰H�R˜‘YÔØ�J‰J�r�Nðð €Jr   c                 ó*  — d}t        j                  d| «      }|r|j                  d«      j                  «       }d}t        j                  d| «      }|r"|j                  d«      j                  «       d d }d}t        j                  d| «      }|r|j                  d«      j                  «       }d}t        j                  d| t         j                  «      }|s%t        j                  d| t         j                  «      }|r|j                  d«      }|sy t        j
                  d	d|t         j                  ¬
«      }t        j
                  dd|t         j                  ¬
«      }t        j
                  dd|t         j                  ¬
«      }t        j
                  dd|«      }t        j
                  dd|«      }t        j
                  dd|«      }d„ }t        j
                  d||«      }t        j
                  dd|«      }|j                  «       }||||dœS )Nr	   z'name="ArticleTitle"\s+content="([^"]+)"r   z"name="pubdate"\s+content="([^"]+)"é
   z(name="ContentSource"\s+content="([^"]+)"zO<div[^>]*id="zoom"[^>]*>(.*?)</div>\s*<div[^>]*class="[^"]*(?:clear|foot)[^"]*"z<div[^>]*id="zoom"[^>]*>(.*)z<script.*?</script>)Úflagsz<style.*?</style>z
<!--.*?-->u   <!--\$\[ä¿¡æ�¯å†…å®¹\]-->z'<!--ZJEG_RSS\.content\.(?:begin|end)-->u   <\$\[ä¿¡æ�¯å†…å®¹\]>c                 ó’   — | j                  d«      }|j                  d«      rd|z   }n|j                  d«      r	t        |z   }d|› d�S )Nr   z//zhttp:ú/z	<a href="ú")r(   r+   r,   )Úmatchr3   s     r   Úabs_urlzparse_detail.<locals>.abs_urlh   sH   € Ø�{‰{˜1‹~ˆØ�?‰?˜4Ô Ø˜T‘>‰DØ�_‰_˜SÔ!Ü˜$‘;ˆDØ˜4˜& Ð"Ð"r   z<a[^>]*href="([^"]+)"z
<p>\s*</p>)r#   ÚsourceÚbodyÚpub_date)r%   Úsearchr(   r*   r'   r)   )r0   r#   r2   rB   r@   rA   r?   s          r   Úparse_detailrD   F   s±  € Ø€EÜ
�	‰	Ð<¸dÓC€AÙØ—‘˜“
× Ñ Ó"ˆà€HÜ
�	‰	Ð7¸Ó>€AÙØ—7‘7˜1“:×#Ñ#Ó% c rÐ*ˆà€FÜ
�	‰	Ð=¸tÓD€AÙØ—‘˜“×!Ñ!Ó#ˆð €DÜ
�	‰	ÐdÐfjÔln×lpÑlpÓq€AÙÜ�I‰IÐ5°t¼R¿T¹TÓBˆÙØ�w‰w�q‹zˆÙØä�6‰6Ð(¨"¨d¼"¿$¹$Ô?€DÜ�6‰6Ð&¨¨D¼¿¹Ô=€DÜ�6‰6�-  T´·±Ô6€Dä�6‰6Ð.°°DÓ9€DÜ�6‰6Ð<¸bÀ$ÓG€DÜ�6‰6Ð)¨2¨tÓ4€Dò#ô �6‰6Ð*¨G°TÓ:€DÜ�6‰6�-  TÓ*€DØ�:‰:‹<€DØ f°dÈÑQÐQr   c              ƒ   ó`
  K  — t        «       4 ƒd {  –—† }|j                  j                  dddg¬«      ƒ d {  –—† }|j                  t        ddddœ¬«      ƒ d {  –—† }t        «       }|j                  |«      ƒ d {  –—†  |j                  «       ƒ d {  –—† }d	}t        d
«      D ]}  }	 |j                  t        › d�dd¬«      ƒ d {  –—† }|j                  d«      ƒ d {  –—†  t        d|dz   › d|r|j                  nd› d|j                  «       ƒ d {  –—† › �«       d} n |s*|j#                  «       ƒ d {  –—†  	 d d d «      ƒd {  –—†  yg }
d	}t        d| dz   «      D ]ô  }	 |j%                  dt&        j)                  |¬«      t+        |«      dœ«      ƒ d {  –—† }|d   }t-        |«      }t        d |› d!t/        |«      › d"�«       |s nŠ|D ]  }|
j1                  |«       Œ t3        j4                  d#|«      }|r+t7        |«      t8        k  rd}t        d$|› d%t8        › �«        n/|j                  t;        j<                  d&d'«      «      ƒ d {  –—†  Œö t        d(t/        |
«      › d"�«       |
s*|j#                  «       ƒ d {  –—†  	 d d d «      ƒd {  –—†  yg }t?        |
d«      D �]  \  }}|d)   }	 |j%                  d*|«      ƒ d {  –—† }tC        |«      }|r?|d   r:|j1                  t@        |d.   xs |d.   |jE                  d3d/«      |d   ||d2œ«       nJt        d+|› d,t/        |
«      › d4|d.   d d5 › d6�«       |j1                  t@        |d.   d/d0|d.   › d1�||d2œ«       |d7z  dk(  rt        d+|› d,t/        |
«      › d8�«       |j                  t;        j<                  d9d:«      «      ƒ d {  –—†  �Œ |j#                  «       ƒ d {  –—†  tG        |d;¬<«      }|cd d d «      ƒd {  –—†  S 7 �Œç7 �ŒÃ7 �Œ£7 �Œƒ7 �Œn7 �Œ=7 �Œ'7 �Œõ# t        $ rE}	t        d|dz   › dt!        |	«      d d › �«       |j                  d«      ƒ d {  –—†7   Y d }	~	�Œ±d }	~	ww xY w7 �Œ$7 �Œ7 �ŒÇ# t        $ r(}	t        d|› dt!        |	«      d d › �«       Y d }	~	�Œ/d }	~	ww xY w7 �ŒG7 �Œ7 �Œ7 �ŒÕ# t        $ rZ}	t        d+|› d,t/        |
«      › d-t!        |	«      d d › �«       |j1                  t@        |d.   d/d0|d.   › d1�||d2œ«       Y d }	~	�ŒXd }	~	ww xY w7 �ŒX7 �Œ@7 �Œ$# 1 ƒd {  –—†7  sw Y   y xY w­w)=NTz---disable-blink-features=AutomationControlledz--no-sandbox)ÚheadlessÚargsiV  i„  )ÚwidthÚheight)Ú
user_agentÚignore_https_errorsÚviewportFé   z?/col/col18311/index.html?vc_xxgkarea=jnsjxx&number=JXA61&jh=263Údomcontentloadedi`ê  )Ú
wait_untilÚtimeouti@  z[LOAD] attempt=r   z status=zN/Az title=z[LOAD-ERR] z: é<   iˆ  r   a  async (args) => {
                    const form = new URLSearchParams();
                    for (const [k, v] of Object.entries(args.body)) form.append(k, v);
                    const res = await fetch(args.url, {
                        method: 'POST',
                        body: form,
                        credentials: 'include',
                        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
                    });
                    return {status: res.status, body: await res.text()};
                })Úp)r$   rA   rA   z  [API-ERR] page=éP   u     ç¬¬u   é¡µ: u    æ�¡z(\d{4}-\d{2}-\d{2})u     [CUTOFF] ç¬¬u   é¡µå‡ºçŽ° < iÐ  i¬  u     [LIST] å…± r$   z—async (url) => {
                    const r = await fetch(url, {credentials: 'include'});
                    return await r.text();
                }z  [r<   z] [ERR] r#   r	   z<p>z</p>)Ú	site_namer#   rB   ÚcontentÚ
source_urlr$   rB   z] [SKIP-EMPTY] é2   z...é   z] ...iÜ  i¸  Újinxiang_tzgg)Úbatch_label)$r   ÚchromiumÚlaunchÚnew_contextÚUAr   Úapply_stealth_asyncÚnew_pageÚrangeÚgotor,   Úwait_for_timeoutÚprintÚstatusr#   Ú	Exceptionr   ÚcloseÚevaluateÚ
SEARCH_URLÚformatr   r7   Úlenr-   r%   ÚfindallÚminÚCUTOFFÚrandomÚrandintÚ	enumerateÚ	SITE_NAMErD   Úgetr   )ÚpagesrR   ÚbrowserÚctxÚstealthÚpageÚokÚattemptÚrespÚeÚ	items_allÚ
cutoff_hitÚpgÚresultr0   r1   r6   ÚdatesÚrecordsÚir$   ÚdhtmlÚdÚnew_cs                           r   Ú	run_asyncr‡   u   s¢  è ø€ ÜÓ!÷ gð g QØŸ
™
×)Ñ)°4Ø;Øð?
Ð)ó ÷ ˆð ×'Ñ'ÜØ $Ø#¨sÑ3ð (ó 
÷ 
ˆô
 “)ˆØ×)Ñ)¨#Ó.×.Ð.Ø—\‘\“^×#ˆð ˆÜ˜Q“xò 		2ˆGð2Ø!ŸY™Y¬$¨Ð/nÐ'oð  }Oð  Y^˜Yó  _÷  _�Ø×+Ñ+¨DÓ1×1Ð1Ü˜¨°©	 {°(É$¸4¿;º;ÐTYÐ:ZÐZaÐhl×hrÑhrÓht×btÐauÐvÔwØ�Ùð		2ñ Ø—-‘-“/×!Ð!Ø÷9g÷ gð gð> ˆ	Øˆ
Ü˜˜5 1™9Ó%ò 	DˆBðØ#Ÿ}™}ð 
.ô )×/Ñ/°"Ð/Ó5¼{È2»ÑOó
 Q÷ 
Q�ð ˜f‘~�ô ˜tÓ$ˆEÜ�E˜"˜˜U¤3 u£: ,¨dÐ3Ô4ÙÙØò %�Ø× Ñ  Õ$ð%ô —J‘JÐ5°tÓ<ˆEÙœ˜U›¤fÒ,Ø!�
Ü˜ r d¨,´v°hÐ?Ô@ÙØ×'Ñ'¬¯©°t¸TÓ(BÓC×CÑCð;	Dô> 	�œc )›nÐ-¨TÐ2Ô3ÙØ—-‘-“/×!Ð!Ø÷Gg÷ gð gðL ˆÜ˜y¨!Ó,ó 	D‰EˆAˆrØ�U‘)ˆCðØ"Ÿm™mð -ð ó÷ �ô ˜UÓ#ˆAÙ�Q�v’YØ—‘Ü!*°Q°w±ZÒ5NÀ2ÀgÁ;Ð\]×\aÑ\aÐblÐnpÓ\qØ  ™y¸ÀCñ õ ô
 ˜˜A˜3˜a¤ I£Ð/¨¸rÀ'¹{È3ÈBÐ?OÐ>PÐPSÐTÔUØ—‘Ü!*°R¸±[ÈbØ!$ R¨¡[ M°Ð6ÀcÐRUñ ô ð �2‰v˜Š{Ü˜˜A˜3˜a¤ I£Ð/¨uÐ5Ô6Ø×'Ñ'¬¯©°t¸TÓ(BÓC×CÒCð9	Dð< �m‰m‹o×ÐÜ  °oÔFˆØ÷Og÷ gò gùðùð
ùð 	/ùØ#ùð _ùØ1ùØbtúô ò 2Ü˜ G¨A¡I ;¨b´°Q³¸¸°°Ð>Ô?Ø×+Ñ+¨DÓ1×1×1ûð2úð "ùð7gùðF
Qúô ò ÜÐ)¨"¨¨R´°A³°s¸°¨}Ð=Ô>Ýûðúð Dùð "ùðEgùðTúô ò Ü˜˜A˜3˜a¤ I£Ð/¨x¼¸A»¸sÀ¸°}ÐEÔFØ—‘Ü!*°R¸±[ÈbØ!$ R¨¡[ M°Ð6ÀcÐRUñ ô õ ûðúð* DùàùðKgù÷ g÷ gñ güsõ  ‚T.‘O8’T.•#T¸O;¹"TÁO>Á"TÁ>PÁ?TÂPÂTÂ,PÃ
PÃPÃ#P
Ã$4PÄPÄPÄ%TÄ=Q!Ä>TÅT.ÅQ$ÅT.ÅTÅ+5Q*Æ Q'Æ!	Q*Æ*B-TÉRÉ3TÊR!ÊTÊT.ÊR$ÊT.Ê"TÊ=R*ËR'ËR*ËC!TÎ8TÎ9TÏTÏTÏ&T.Ï2TÏ3T.Ï;TÏ>TÐTÐTÐPÐ
PÐPÐ	QÐ4QÑQ
ÑQÑTÑQÑTÑ$T.Ñ'Q*Ñ*	RÑ3RÒTÒRÒTÒ!TÒ$T.Ò'R*Ò*	TÒ3ATÔTÔTÔTÔTÔT.ÔT+ÔT"Ô T+Ô'T.c                  óŽ  — d} t        t        j                  «      D ]y  \  }}|j                  d«      rt	        |j                  d«      d   «      } Œ5|dk(  sŒ;|dz   t        t        j                  «      k  sŒ[t	        t        j                  |dz      «      } Œ{ t        j                  t        | ¬«      «      }t        d|› d�«       y )	Né   z--pages=ú=r   z--pages)rt   zDone: z records)rq   ÚsysÚargvr+   ÚintÚsplitrk   ÚasyncioÚrunr‡   rd   )rt   rƒ   ÚaÚns       r   Úmainr“   à   s›   € Ø€EÜœ#Ÿ(™(Ó#ò )‰ˆˆ1Ø�<‰<˜
Ô#Ü˜Ÿ™ › Q™Ó(‰EØ�)‹^  A¡¬¬C¯H©H«Ó 5ÜœŸ™  Q¡™Ó(‰Eð	)ô
 	�‰”I EÔ*Ó+€AÜ	ˆF�1�#�XÐ
Õr   Ú__main__)r‰   )Ú__doc__r‹   Úosr%   r�   Újsonro   ÚtimeÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   rr   r,   ri   r^   rn   Úplaywright.async_apir   Úplaywright_stealthr   r   r7   rD   r‡   r“   Ú__name__© r   r   ú<module>r£      s�   ðñ
÷ 0× /× /Ó /Ø ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >Ý (à$€	Ø#€ØÐnÑn€
Øv€à	€å 1Ý &òò&ò,,Ró^hòV ð ˆzÒÙ…Fð r   