Ë
    ¸¬uj»*  ã                   ó�  — 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 ej                  j                  ej                  j                  e«      «      Zej                  j#                  de«       dZdZdZdZdZd	Z ej0                  «       Zd
ddœZ G d„ de
«      Zedk(  r eeeddd¬«      Zej=                  «        yy)uÛ  
crawl_sthj_xz.py â€” å¾�å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€ æ”¿åºœä¿¡æ�¯å…¬å¼€çˆ¬è™«
====================================================
åŸºäºŽ base_crawler (GovCrawler) + API æ¨¡å¼�ã€‚

ç«™ç‚¹: https://sthj.xz.gov.cn/dynamic/zwgk/govInfoPub.html?categorynum=003015
åˆ†ç±»: 003015 = æ³•å®šä¸»åŠ¨å…¬å¼€å†…å®¹ï¼ˆå�«å…¬ç¤ºå…¬å‘Š = çŽ¯è¯„/çŽ¯ä¿�ç›¸å…³ï¼‰

æ•°æ�®:
  - åˆ—è¡¨: POST /EWB-FRONT/rest/lightfrontaction/getgovinfolist (åˆ†é¡µ, å…±400æ�¡)
  - è¯¦æƒ…: GET /govxxgk/...html (é�™æ€�é¡µ, å�«ç´¢å¼•å�·/å�‘å¸ƒæœºæž„/æˆ�æ–‡æ—¥æœŸ/ä¿¡æ�¯å��ç§°/é™„ä»¶)

ç”¨æ³•:
  python3 crawl_sthj_xz.py                 # å¢žé‡�çˆ¬ (ç¬¬1é¡µ)
  python3 crawl_sthj_xz.py --full          # å…¨é‡�çˆ¬æ‰€æœ‰é¡µ
  python3 crawl_sthj_xz.py --sync          # ä»…å�Œæ­¥
é    N)Ú
GovCrawlerÚextract_detailu   å¾�å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€zsthj.xz.gov.cnzEhttps://sthj.xz.gov.cn/EWB-FRONT/rest/lightfrontaction/getgovinfolistz$fb2ed5f8-902e-48bd-998f-a622a60c0951Ú001Ú003015z[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36zapplication/json;charset=UTF-8)z
User-AgentzContent-Typec                   ó    — e Zd Zdd„Zd„ Zd„ Zy)ÚXzGovCrawlerc                 óZ  — t        j                  t        t        ||t        dœ«      j                  d«      }t        j                  j                  t        |t        ¬«      }	 t        j                  j                  |dt        ¬«      }t        j                  |j                  «       j                  d«      «      }|j!                  di «      j!                  dg «      }|j!                  di «      j!                  dd	«      }||fS # t"        $ r}	t%        d
|› d|	› �«       g d	fcY d}	~	S d}	~	ww xY w)u   è°ƒç”¨åˆ—è¡¨APIèŽ·å�–å�•é¡µ)ÚdeptcodeÚcategorynumÚ	pageIndexÚpageSizeÚsiteGuidúutf-8)ÚdataÚheadersé   ©ÚtimeoutÚcontextÚcustomr   Útotalr   u     âš ï¸� APIè¯·æ±‚å¤±è´¥(page=z): N)ÚjsonÚdumpsÚ	DEPT_CODEÚCATEGORY_NUMÚ	SITE_GUIDÚencodeÚurllibÚrequestÚRequestÚLIST_APIÚHEADERSÚurlopenÚCTXÚloadsÚreadÚdecodeÚgetÚ	ExceptionÚprint)
ÚselfÚ
page_indexÚ	page_sizeÚbodyÚreqÚrespÚresultr   r   Úes
             ú"/root/gov_crawler/crawl_sthj_xz.pyÚfetch_list_pagezXzGovCrawler.fetch_list_page'   s  € ä�z‰zÜ!Ü'Ø#Ø!Ü!ñ
ó ÷ ‰6�'‹?ð 	ô �n‰n×$Ñ$¤X°DÄ'Ð$ÓJˆð	Ü—>‘>×)Ñ)¨#°rÄ3Ð)ÓGˆDÜ—Z‘Z §	¡	£× 2Ñ 2°7Ó ;Ó<ˆFØ—:‘:˜h¨Ó+×/Ñ/°¸Ó;ˆDØ—J‘J˜x¨Ó,×0Ñ0°¸!Ó<ˆEØ˜�;ÐøÜò 	ÜÐ2°:°,¸cÀ!ÀÐEÔFØ�q�5�Lûð	ús   Á"BD Ä	D*ÄD%ÄD*Ä%D*c                 óô
  — |j                  d«      rdt        › |› �n|}t        j                  j	                  |t
        ¬«      }	 t        j                  j                  |dt        ¬«      }|j                  «       j                  dd¬«      }d}t        j                  d|t        j                  «      }|r4t        j                  dd|j!                  d«      «      j#                  «       }|sVt        j                  d|t        j                  «      }|r/|j!                  d«      j%                  dd«      j#                  «       }i }	g d¢}
|
D ]d  \  }}t        j                  ||t        j                  «      }|sŒ.t        j                  dd|j!                  d«      «      j#                  «       |	|<   Œf g }t        j&                  d|t        j                  «      D ]{  }|j!                  d«      j#                  «       }|j!                  d«      j#                  «       }|sŒD|sŒG|j                  d«      rdt        › |› �n|}|j)                  d|› d|› �«       Œ} d}t        j                  d|t        j                  «      }|r|j!                  d«      j#                  «       }|sFt        j                  d|t        j                  «      }|r|j!                  d«      j#                  «       }t        j                  dd|t        j                  t        j*                  z  ¬«      }t        j                  dd|t        j                  t        j*                  z  ¬«      }t        j                  dd|t        j*                  ¬«      }t        j                  dd|«      }t        j                  dd|«      }g }dD ](  }||	v sŒ|	|   sŒ|j)                  d|› d |	|   › d!�«       Œ* |r|j)                  |«       |rs|j)                  d"«       |D ]]  }d|v rB|j                  d#«      r1|dd
 j-                  dd«      \  }}|j)                  d$|› d%|› d&�«       ŒI|j)                  d'|› d!�«       Œ_ d(j/                  |«      }|	j1                  d)d«      }g }d*D ]&  }||	v sŒ|	|   sŒ|j)                  |› d|	|   › �«       Œ( |rRt        j                  dd|«      }t        j                  d+d,|«      j#                  «       d
d- }|r|j)                  |«       |r"|j)                  d.«       |j3                  |«       d(j/                  |«      }|xs |	j1                  d/d«      ||||d0œS # t        $ r}t        d	|› �«       Y d
}~y
d
}~ww xY w)1u(   æŠ“å�–è¯¦æƒ…é¡µé�™æ€�HTMLï¼Œæ��å�–å†…å®¹ú/úhttps://)r   r   r   r   Úreplace)Úerrorsu      âš ï¸� è¯¦æƒ…é¡µåŠ è½½å¤±è´¥: NÚ z&<h1[^>]*id="ivs_title"[^>]*>(.*?)</h1>z<[^>]+>é   z<title>(.*?)</title>u   _å¾�å·žå¸‚ç”Ÿæ€�çŽ¯å¢ƒå±€))u*   ç´¢å¼•å�·[^:]*:</td>\s*<td[^>]*>(.*?)</td>õ	   ç´¢å¼•å�·)u-   å�‘å¸ƒæœºæž„[^:]*:</td>\s*<td[^>]*>(.*?)</td>õ   å�‘å¸ƒæœºæž„)u-   æˆ�æ–‡æ—¥æœŸ[^:]*:</td>\s*<td[^>]*>(.*?)</td>õ   æˆ�æ–‡æ—¥æœŸ)u-   ä¿¡æ�¯å��ç§°[^:]*:</td>\s*<td[^>]*>(.*?)</td>õ   ä¿¡æ�¯å��ç§°)u'   æ–‡å�·[^:]*:</td>\s*<td[^>]*>(.*?)</td>õ   æ–‡å�·zA<a[^>]*href="([^"]+)"[^>]*>\s*<i></i>\s*<span>(.*?)</span>\s*</a>é   u   ðŸ“Ž z: zY<div[^>]*class="cont-p"[^>]*id="ivs_content"[^>]*>(.*?)</div>\s*<div[^>]*class="cont-loadzc<div[^>]*class="ewb-article-info"[^>]*>(.*?)</div>\s*<div[^>]*class="(?:share|ewb-attach|cont-load)z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>z<o:p>[^<]*</o:p>zX\s+(?:style|class|height|width|valign|align|bordercolor|cellpadding|cellspacing)="[^"]*"z\s+align="[^"]*")r<   r=   r>   r?   r@   z<p><strong>u   ï¼š</strong>ú</p>u!   <p><strong>é™„ä»¶ï¼š</strong></p>u   ðŸ“Žu   <p>ðŸ“Ž <a href="z" target="_blank">z</a></p>z<p>ú
r>   )r<   r=   r>   r?   z\s+ú i,  u   é™„ä»¶:r?   ©ÚtitleÚcontentÚdateÚattachmentsÚsummary)Ú
startswithÚDOMAINr   r   r    r"   r#   r$   r&   r'   r)   r*   ÚreÚsearchÚDOTALLÚsubÚgroupÚstripr8   ÚfinditerÚappendÚIÚsplitÚjoinr(   Úextend)r+   ÚinfourlÚfull_urlr/   r0   Úhtmlr2   rG   ÚtmÚ	meta_rowsÚmeta_patternsÚpatÚkeyÚmrJ   ÚamÚhrefÚnameÚ	full_hrefÚ	body_htmlÚ
body_matchÚbody_match2Úcontent_partsÚaÚurlrH   rI   Úsummary_linesÚ	body_textrK   s                                 r3   Úfetch_detailzXzGovCrawler.fetch_detail;   s  € à3:×3EÑ3EÀcÔ3J�Xœf˜X g YÑ/ÐPWˆÜ�n‰n×$Ñ$ X´wÐ$Ó?ˆð	Ü—>‘>×)Ñ)¨#°rÄ3Ð)ÓGˆDØ—9‘9“;×%Ñ% g°iÐ%Ó@ˆDð ˆÜ�Y‰YÐ@À$ÌÏ	É	ÓRˆÙÜ—F‘F˜: r¨2¯8©8°A«;Ó7×=Ñ=Ó?ˆEÙÜ—‘Ð2°D¼"¿)¹)ÓDˆBÙØŸ™ ›×+Ñ+Ð,GÈÓL×RÑRÓT�ð ˆ	ò
ˆð &ò 	L‰HˆC�Ü—	‘	˜#˜t¤R§Y¡YÓ/ˆAÚÜ!#§¡¨
°B¸¿¹À»
Ó!C×!IÑ!IÓ!K�	˜#’ð	Lð ˆÜ—+‘+ØPØ”"—)‘)ó
ò 	@ˆBð —8‘8˜A“;×$Ñ$Ó&ˆDØ—8‘8˜A“;×$Ñ$Ó&ˆDÚšØ9=¿¹ÈÔ9M˜h¤v h¨t¨fÑ5ÐSW�	Ø×"Ñ" U¨4¨&°°9°+Ð#>Õ?ð	@ð ˆ	Ü—Y‘YØhØ”"—)‘)ó
ˆ
ñ Ø"×(Ñ(¨Ó+×1Ñ1Ó3ˆIáÜŸ)™)ØvØ”b—i‘ióˆKñ Ø'×-Ñ-¨aÓ0×6Ñ6Ó8�	ä—F‘FÐ7¸¸YÌbÏiÉiÔXZ×X\ÑX\ÉnÔ]ˆ	Ü—F‘FÐ5°r¸9ÌBÏIÉIÔVX×VZÑVZÉNÔ[ˆ	Ü—F‘FÐ.°°IÄRÇTÁTÔJˆ	ä—F‘FÐvÐxzð  }Fó  Gˆ	Ü—F‘FÐ.°°IÓ>ˆ	ð ˆØZò 	ZˆCØ�iÒ I¨c£NØ×$Ñ$ {°3°%°|ÀIÈcÁNÐCSÐSWÐ%XÕYð	Zñ Ø× Ñ  Ô+ÙØ× Ñ Ð!DÔEØ ò 8�Ø˜1‘9 §¡¨fÔ!5Ø ! ! " §¡¨D°!Ó 4‘I�D˜#Ø!×(Ñ(Ð+<¸S¸EÐASÐTXÐSYÐYaÐ)bÕcà!×(Ñ(¨3¨q¨c°¨Õ7ð8ð —)‘)˜MÓ*ˆð �}‰}˜^¨RÓ0ˆð ˆØPò 	AˆCØ�iÒ I¨c£NØ×$Ñ$¨ u¨B¨y¸©~Ð.>Ð%?Õ@ð	Añ ÜŸ™˜z¨2¨yÓ9ˆIÜŸ™˜v s¨IÓ6×<Ñ<Ó>¸tÀÐDˆIÙØ×$Ñ$ YÔ/ÙØ× Ñ  Ô+Ø× Ñ  Ô-Ø—)‘)˜MÓ*ˆð Ò?˜iŸm™m¨N¸BÓ?ØØØ&Øñ
ð 	
øôG ò 	ÜÐ4°Q°CÐ8Ô9Üûð	ús   ÁAU Õ	U7ÕU2Õ2U7c                 óô  — dd l }|j                  «       }|j                  ddd¬«       |j                  dt        dd¬	«       |j                  d
dd¬«       |j	                  «       \  }}|j
                  r| j                  «        y |j                  rdn|j                  }t        dt        › d�«       t        d|j                  rdn|› �«       t        |«      D �]›  }| j                  |«      \  }}|st        d|dz   › d�«        y t        d|dz   › dt        |«      › d|› d�«       |D �]ü  }	|	j                  dd«      xs |	j                  dd«      }
|	j                  dd«      }|	j                  dd«      }|	j                  dd«      }|	j                  dd«      }|
r|sŒw|j                  d«      rdt         › |› �n|}| j#                  «       }|j%                  d || j&                  f«      j)                  «       }|j+                  «        |r| j,                  d!xx   dz  cc<   Œû| j/                  |«      }|€,| j,                  d"xx   dz  cc<   |
d#|
› d$|› d%�|g d&|
› d'|› �d(œ}| j1                  |d   xs |
||d)   |j                  d*«      xs ||j                  d+d«      «       |j                  d,«      rd-t        |j                  d,g «      «      › d.�nd}t        d/|
d d0 › d1t        |j                  d)d«      «      › d2|› �«       t3        j4                  | j6                  «       �Œÿ t        |«      d3k  r y t        d4| j,                  d5   › d6| j,                  d!   › d7| j,                  d"   › �«       �Œž y )8Nr   z--fullÚ
store_trueu   å…¨é‡�çˆ¬å�–)ÚactionÚhelpz--pagesr;   u   çˆ¬å�–é¡µæ•°)ÚtypeÚdefaultrs   z--syncu	   ä»…å�Œæ­¥i'  u   
ðŸ“‹ åˆ†ç±»: u    (æ³•å®šä¸»åŠ¨å…¬å¼€å†…å®¹)u   ðŸ“„ æœ€å¤§é¡µæ•°: u   æ— é™�u	     â�¹ ç¬¬u   é¡µæ— æ•°æ�®ï¼Œç»“æ�Ÿu	   
ðŸ“ƒ ç¬¬u   é¡µ (u   æ�¡, å…±u   æ�¡)rG   r:   Ú	realtitlerZ   ÚinfodateÚinfoidÚcategorynamer6   r7   z5SELECT 1 FROM crawl_results WHERE url=? AND site_id=?Úskipr9   u   <p>ä¿¡æ�¯å��ç§°ï¼šu   </p><p>å�‘å¸ƒæ—¥æœŸï¼šrC   u   ä¿¡æ�¯å��ç§°: u   
å�‘å¸ƒæ—¥æœŸ: rF   rH   rI   rK   rJ   z +u   é™„ä»¶u     âœ… é#   z | ÚBé   u     ðŸ“Š ç´¯è®¡: +Únewu    æ–° | è·³è¿‡u	    | é”™è¯¯)ÚargparseÚArgumentParserÚadd_argumentÚintÚparse_known_argsÚsyncÚsync_to_serverÚfullÚpagesr*   r   Úranger4   Úlenr(   rL   rM   Ú_get_dbÚexecuteÚsite_idÚfetchoneÚcloseÚ_statsro   Ú
store_itemÚtimeÚsleepÚ
sync_delay)r+   r   ÚparserÚargsÚ_Ú	max_pagesr,   Úitemsr   ÚitemrG   rZ   rw   rx   Úcategoryr[   ÚconnÚexistsÚdetailÚattach_infos                       r3   Údo_crawlzXzGovCrawler.do_crawl­   s‡  € ÛØ×(Ñ(Ó*ˆØ×Ñ˜H¨\ÀÐÔOØ×Ñ˜I¬C¸ÀÐÔPØ×Ñ˜H¨\ÀÐÔLØ×)Ñ)Ó+‰ˆˆaà�9Š9Ø×ÑÔ!Øà ŸIšI‘D¨4¯:©:ˆ	Ü�¤˜~Ð-HÐIÔJÜÐ#°·	²	¡H¸yÐ#IÐJÔKä 	Ó*ó <	}ˆJØ×/Ñ/°
Ó;‰LˆE�5ÙÜ˜	 *¨Q¡, Ð/DÐEÔFÙä�J˜z¨!™|˜n¨E´#°e³*°¸XÀeÀWÈDÐQÔRàó .,�ØŸ™ ¨"Ó-ÒJ°·±¸+ÀrÓ1J�ØŸ(™( 9¨bÓ1�ØŸ8™8 J°Ó3�ØŸ™ (¨BÓ/�ØŸ8™8 N°BÓ7�á¡GØð <C×;MÑ;MÈcÔ;R˜X¤f X¨g¨YÑ7ÐX_�Ø—|‘|“~�ØŸ™ØKØ˜tŸ|™|Ð,ó÷ ‘(“*ð ð —
‘
”ÙØ—K‘K Ó'¨1Ñ,Ó'Øð ×*Ñ*¨7Ó3�Ø�>Ø—K‘K Ó)¨QÑ.Ó)ð "'Ø%7¸°wÐ>TÐU]ÐT^Ð^bÐ#cØ (Ø')Ø%3°E°7Ð:JÈ8È*Ð#Uñ�Fð —‘Ø˜7‘OÒ, uØØ˜9Ñ%Ø—J‘J˜vÓ&Ò2¨(Ø—J‘J˜y¨"Ó-ôð QW×PZÑPZÐ[hÔPi ¤3 v§z¡z°-ÀÓ'CÓ#DÐ"EÀVÑLÐoq�Ü˜˜u S b˜z˜l¨#¬c°&·*±*¸YÀrÓ2JÓ.KÐ-LÈAÈkÈ]Ð[Ô\ä—
‘
˜4Ÿ?™?Ö+ð].,ôb �5‹z˜BŠÙäÐ$ T§[¡[°Ñ%7Ð$8¸ÀdÇkÁkÐRXÑFYÐEZÐZcÐdh×doÑdoÐpxÑdyÐczÐ{Ö|ñy<	}ó    N)r}   )Ú__name__Ú
__module__Ú__qualname__r4   ro   rŸ   © r    r3   r   r   %   s   „ óò(p
ódL}r    r   Ú__main__zFhttps://sthj.xz.gov.cn/dynamic/zwgk/govInfoPub.html?categorynum=003015zsthj_xz_results.dbg333333Ó?)Ú	site_nameÚdomainrl   Údb_namer“   )Ú__doc__ÚosrN   Úsysr‘   r   Úurllib.requestr   ÚsslÚbase_crawlerr   r   ÚpathÚdirnameÚabspathÚ__file__ÚBASE_DIRÚinsertÚ	SITE_NAMErM   r!   r   r   r   Ú_create_unverified_contextr$   r"   r   r¡   ÚcrawlerÚrunr¤   r    r3   ú<module>r¹      sË   ðñ÷" 4× 3× 3Ó 3ß 3à�7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø ‡�‡���8Ô à&€	Ø	€ØR€Ø2€	Ø€	Ø€Ø$€c×$Ñ$Ó&€àoØ4ñ€ô
T}�:ô T}ðn ˆzÒÙØØØTØ$Øô€Gð ‡K�K…Mð r    