Ë
    ¸¬uj”  ã                   ón  — d Z ddlZddlZddlZddlZddlmZmZmZ ddlm	Z	 ddl
Z
ddlZddlZ ej                  ej                  j                  «       dZdZ ej"                  dd«      Zd	Z ej(                  ej*                  «       ed
¬«      z
  j-                  d«      ZddiZd„ Zd„ Zd„ Zd„ Zd d„Zedk(  rzdej>                  v Z e rdndZ! e"«         e"de› de!› �«        ej                  «       Z# ee ¬«      \  Z$Z% e"d e& ej                  «       e#z
  d«      › d�«        e"de$› de%› �«       yy)!u˜  
è´µæºªå¸‚äººæ°‘æ”¿åºœ-é€šçŸ¥ (www.guixi.gov.cn)
==================================
CMS: å¤§æ±‰ç‰ˆé€š (Hanweb) - JPage AJAX (æ— CSRF)
åˆ—è¡¨API: /module/web/jpage/dataproxy.jsp (POST, startrecord/endrecord)
è¯¦æƒ…: /art/2026/6/8/art_6229_1594503.html, <div id=zoom> å�«æ­£æ–‡

ç”¨æ³•:
    python3 crawl_guixi_tz.py          # å…¨é‡�(æœ€å¤š78é¡µ~3588æ�¡)
    python3 crawl_guixi_tz.py --test   # æµ‹è¯• 5 æ�¡
é    N)ÚdatetimeÚ	timedeltaÚtimezone)Úquoteu   è´µæºªå¸‚-é€šçŸ¥z6http://www.guixi.gov.cn/module/web/jpage/dataproxy.jspÚ	SEARCH_DBz/root/search.dbé   iG  )Údaysz%Y-%m-%dz
User-Agentz<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36c           	      ó\  — | dz
  dz  dz   }| dz  }d|› d|› d�}|dz  }|dt        d«      z   z  }|d	z  }d
dddd
ddddœ}	 t        j                  t        dz   |z   |t        d¬«      }d|_        |j                  S # t        $ r'}t        d| › dt        |«      dd › �«       Y d}~yd}~ww xY w)zFetch JPage via POSTé   é   zstartrecord=z&endrecord=z&perpage=15z4&unitid=28132&webid=56&path=http://www.guixi.gov.cn/z	&webname=u   è´µæºªå¸‚äººæ°‘æ”¿åºœz9&col=1&columnid=6229&sourceContentType=1&permissiontype=0Ú1Ú56zhttp://www.guixi.gov.cn/Ú6229Ú28132Ú0)ÚcolÚwebidÚpathÚcolumnidÚsourceContentTypeÚunitidÚwebnameÚpermissiontypeú?é   )ÚdataÚheadersÚtimeoutúutf-8z  ! list page z fail: Né<   )
r   ÚrequestsÚpostÚ	PROXY_URLÚHEADERSÚencodingÚtextÚ	ExceptionÚprintÚstr)ÚpageÚstartÚendÚ
url_paramsÚ	post_dataÚrÚes          ú#/root/gov_crawler/crawl_guixi_tz.pyÚ
fetch_listr2      sß   € à�A‰X˜‰O˜aÑ€EØ
�‰)€CØ ˜w k°#°°kÐB€JØÐHÑH€JØ�+¤Ð&=Ó >Ñ>Ñ>€JØÐMÑM€Jð ˜TÐ+EØ°ÀØ*¸cñ€Ið
Ü�M‰Mœ) c™/¨JÑ6¸YÔPWÐacÔdˆØˆŒ
Ø�v‰vˆøÜò Ü�˜t˜f G¬C°«F°3°B¨K¨=Ð9Ô:Üûðús   Á9A; Á;	B+ÂB&Â&B+c                 ó
  — g }t        j                  d| t         j                  «      D ]X  }|j                  d«      }|j                  d«      }|j                  d«      j	                  «       }|j                  |||dœ«       ŒZ |S )NzP<li><span>(\d{4}-\d{2}-\d{2})</span>\s*<a[^>]*href="([^"]+)"[^>]*title="([^"]*)"r   é   é   )ÚtitleÚurlÚpub_date)ÚreÚfinditerÚDOTALLÚgroupÚstripÚappend)ÚhtmlÚitemsÚmr8   r7   r6   s         r1   Ú
parse_listrB   2   sy   € Ø€EÜ�[‰[Ø[ØŒb�i‰ióò Iˆð —7‘7˜1“:ˆØ�g‰g�a‹jˆØ—‘˜“
× Ñ Ó"ˆØ�‰˜u¨S¸hÑGÕHðIð €Ló    c                 ó”  — 	 t        j                  | t        d¬«      }d|_        |j                  }|j                  d«      }|dk  r|j                  d«      }|dk  ry|j                  dd|«      }|dk  ry||d	 }d}d}t        t        |«      «      D ]_  }|||d
z    dk(  r!|d
z   t        |«      k\  s
||d
z      dv r|dz  }Œ/|||dz    dk(  sŒ;|dz  }|dk(  sŒF|j                  d«      }	||	dz   | } n ddl	m
}
 d}d} |
|d«      }|j                  ddg«      D ]  }|j                  «        Œ g }|j                  d«      D ]À  }|j                  dd«      }|j                  d¬«      }|rˆ|j                  d«      sw|j                  d«      sf|j                  d«      r||z   }n7|j                  d«      s&| j                  | j!                  d«      d   «      |z   }|j#                  d|› d |› d!�«       |j                  «        ŒÂ g }|j                  d"«      D ],  }|j#                  t%        |«      «       |j                  «        Œ. |j                  g d#¢«      D ]%  }|j'                  d|«       |j#                  |«       Œ' |j                  d$«      D ]  }|j)                  |«       Œ |j                  g d%¢«      D ]  }|j+                  «        Œ |j                  dd¬&«      }t-        j.                  d'd|«      }|j1                  dd(«      }t-        j.                  d)d(|«      }|j3                  «       }|D ]
  }|d(|› �z  }Œ |D ]
  }|d(|› �z  }Œ |rt        |«      dk  r4d| j!                  d«      d   › d | › d!�}|r|d(d*j5                  |«      z   z  }|S # t6        $ r$}t9        d+t%        |«      d	d, › �«       Y d	}~yd	}~ww xY w)-uC   Extract body from <div id=zoom> â€” preserves attach links + tablesr   )r   r   r   zid=zoomr   z	id="zoom"Ú z<divNé   z >
	r   é   z</div>ú>)ÚBeautifulSoupz P zhttp://www.guixi.gov.cnzhtml.parserÚscriptÚstyleÚaÚhrefT)r=   Ú
javascriptú#ú/Úhttpéÿÿÿÿú[z](ú)Útable)ÚpÚh1Úh2Úh3Úh4Úh5Úh6Úbr)ÚspanÚbÚstrongÚfontÚemÚiÚuÚs)Ú	separatorr=   z\x00P\x00(\s*\x00P\x00)+z

z\n{3,}ú
z  ! detail fail: r    )r!   Úgetr$   r%   r&   ÚfindÚrfindÚrangeÚlenÚbs4rI   Úfind_allÚ	decomposeÚget_textÚ
startswithÚrstripÚsplitr>   r)   ÚinsertÚreplace_withÚunwrapr9   ÚsubÚreplacer=   Újoinr'   r(   )r7   r/   r?   ÚidxÚ	div_startÚsectionÚdepthÚcontentrc   ÚgtrI   ÚMARKERÚBASEÚsoupÚtagÚattach_linksrL   rM   ÚtxtÚtables_htmlrU   r]   r&   ÚtblÚlinkr0   s                             r1   Úfetch_detailr‰   >   sä  € ðHÜ�L‰L˜¤g°rÔ:ˆØˆŒ
Ø�v‰vˆØ�i‰i˜	Ó"ˆØ�Š7Ø—)‘)˜KÓ(ˆCØ�Š7ØØ—J‘J˜v q¨#Ó.ˆ	Ø�qŠ=ØØ�y�zÐ"ˆØˆØˆÜ”s˜7“|Ó$ò 	ˆAØ�q˜˜1™ˆ~ Ò'¨Q¨q©S´C¸³LÒ-@ÀGÈAÈaÉCÁLÐT^ÑD^Ø˜‘
‘Ø˜˜1˜Q™3� 8Ó+Ø˜‘
�Ø˜A“:Ø Ÿ™ cÓ*�BØ% b¨¡d¨1˜o�GÙð	õ 	&ØˆØ(ˆÙ˜W mÓ4ˆØ—=‘= (¨GÐ!4Ó5ò 	ˆCØ�M‰M�Oð	ð ˆØ—‘˜sÓ#ò 		ˆAØ—5‘5˜ Ó$ˆDØ—*‘* 4�*Ó(ˆCÙ˜DŸO™O¨LÔ9À$Ç/Á/ÐRUÔBVØ—?‘? 3Ô'Ø $™;‘DØŸ™¨Ô0ØŸ:™: c§i¡i°£n°RÑ&8Ó9¸DÑ@�DØ×#Ñ# a¨ u¨B¨t¨f°AÐ$6Ô7Ø�K‰K�Mð		ð ˆØ—]‘] 7Ó+ò 	ˆEØ×Ñœs 5›zÔ*Ø�O‰OÕð	ð —=‘=Ò!JÓKò 	ˆCØ�J‰J�q˜&Ô!Ø�J‰J�vÕð	ð —-‘- Ó%ò 	$ˆBØ�O‰O˜FÕ#ð	$ð —=‘=Ò!UÓVò 	ˆCØ�J‰J�Lð	à�}‰} r°ˆ}Ó6ˆÜ�v‰vÐ1°;ÀÓEˆØ�|‰|˜K¨Ó0ˆÜ�v‰v�i ¨Ó.ˆØ�z‰z‹|ˆØò 	!ˆCØ�d˜3˜%�LÑ ‰Dð	!à ò 	"ˆDØ�d˜4˜&�MÑ!‰Dð	"á”s˜4“y 2’~Ø�s—y‘y “~ bÑ)Ð*¨"¨S¨E°Ð3ˆDÙØ˜ §¡¨<Ó!8Ñ8Ñ8�ØˆøÜò ÜÐ!¤# a£&¨¨" + Ð/Ô0Üûðús2   ‚AN ÁN Á7AN Ã
N ÃJ?N Î	OÎ#OÏOc                 óJ  — | sydd l }|j                  t        «      }|j                  d«       |j                  d«       d\  }}| D ]†  }	 |j                  dt        |j                  d«      xs dd d |j                  d	d«      |j                  d
d«      |j                  d«      xs dd d ddf«       |j                  dkD  r|dz  }n|dz  }Œˆ |j                  dt        f«       |j                  «        |j                  «        ||fS # t        $ r}|dz  }Y d }~Œ×d }~ww xY w)N©r   r   r   zPRAGMA journal_mode=WALzPRAGMA synchronous=NORMALzxINSERT OR REPLACE INTO gov_raw (site_name, title, page_url, content, publish_date, summary, tags) VALUES (?,?,?,?,?,?,?)r6   rE   iô  r7   r~   r8   é
   u   é€šçŸ¥r   z·INSERT INTO gov_search(rowid, title, site_name, summary) SELECT r.id, r.title, r.site_name, r.summary FROM gov_raw r WHERE r.id NOT IN (SELECT rowid FROM gov_search) AND r.site_name=?)
Úsqlite3Úconnectr   ÚexecuteÚ	SITE_NAMErh   Útotal_changesr'   ÚcommitÚclose)r@   r�   ÚdbÚokÚfailÚitr0   s          r1   Úto_dbr˜   Š   s2  € ÙØÛØ	�‰œÓ	#€BØ‡J�JÐ(Ô)Ø‡J�JÐ*Ô+Ø�H€BˆØò ˆð	Ø�J‰Jð)ô Ø—V‘V˜G“_Ò*¨¨D¨SÐ1Ø—F‘F˜5 "Ó%Ø—F‘F˜9 bÓ)Ø—V‘V˜JÓ'Ò-¨2¨s°Ð3ØØðô	ð ×Ñ !Ò#Ø�a‘‘à˜‘	�øð'ð, ‡J�Jð	\ô 
ˆô	ð ‡I�I„KØ‡H�H„JØˆtˆ8€Oøô ò 	Ø�A‰I�Dûð	ús   Á
BD
Ä
	D"ÄDÄD"c                 ó4  — g }t        «       }| rdnt        }t        d|dz   «      D ]¾  }t        |«      }|s n¯t	        |«      }|st        d|› d�«        n‘d}|D ]F  }|d   |v rŒ|j                  |d   «       |d   r|d   t        k  rŒ1|j                  |«       |dz  }ŒH |r|d   d   nd}	|r|d	   d   nd}
t        d|› d
t        |«      › d|	› d|
› d|› �
«       |dk(  sŒ¾ n t        dt        |«      › d�«       | r|d d }t        dt        |«      › d�«       |syt        |«      D ]Y  \  }}t        d|dz   › dt        |«      › d
|d   d d › d�dd¬«       t        |d   «      }||d<   t        t        |«      › d�«       Œ[ t        |«      \  }}||fS )Nr   r   z  [Page z] empty, reached endr   r7   r8   r   rR   ú] z items (z ~ z), new: z	  Total: z items within 3yrz  TEST mode: z itemsr‹   z  [rP   r6   é(   z... rE   T)r,   Úflushr~   ÚB)ÚsetÚ	MAX_PAGESrk   r2   rB   r(   ÚaddÚCUTOFFr>   rl   Ú	enumerater‰   r˜   )ÚtestÚ	all_itemsÚ	seen_urlsÚmax_pr*   r?   r@   ÚnewÚitemÚfÚlrc   r~   r•   r–   s                  r1   Úcrawlr«   ²   sô  € Ø€IÜ“€IÙ‰Aœ9€EÜ�a˜ ™Ó#ò ˆÜ˜$ÓˆÙÙÜ˜4Ó ˆÙÜ�H˜T˜FÐ"6Ð7Ô8ÙØˆØò 	ˆDØ�E‰{˜iÑ'ØØ�M‰M˜$˜u™+Ô&Ø�JÒ D¨Ñ$4´vÒ$=ØØ×Ñ˜TÔ"Ø�1‰H‰Cð	ñ %*ˆE�!‰H�ZÒ ¨sˆÙ%*ˆE�"‰I�jÒ!°ˆÜ�˜˜˜b¤ U£ ¨H°Q°C°s¸1¸#¸XÀcÀUÐKÔLØ�!‹8Ùð+ô, 
ˆI”c˜)“nÐ%Ð%6Ð
7Ô8ÙØ˜b˜q�Mˆ	Ü�œc )›nÐ-¨VÐ4Ô5ÙØÜ˜YÓ'ò "‰ˆˆ4Ü��A�a‘C�5˜œ#˜i›.Ð)¨¨D°©M¸#¸2Ð,>Ð+?¸tÐDÈ"ÐTXÕYÜ˜t E™{Ó+ˆØ!ˆˆY‰Ü”�W“�˜aÐ Õ!ð	"ô
 �YÓ�H€BˆØˆtˆ8€OrC   Ú__main__z--testÚTESTÚFULLrS   rš   )r£   z  Time: r   re   z  New: z Skip: )F)'Ú__doc__r9   ÚsysÚosÚtimer   r   r   Úurllib.parser   r!   Úurllib3Údisable_warningsÚ
exceptionsÚInsecureRequestWarningr�   r#   Úgetenvr   rŸ   ÚnowÚutcÚstrftimer¡   r$   r2   rB   r‰   r˜   r«   Ú__name__Úargvr£   Úmoder(   Út0r•   r–   Úround© rC   r1   ú<module>rÂ      sE  ðñ
÷ × ß 2Ñ 2Ý ß Û 	Ø €× Ñ ˜×+Ñ+×BÑBÔ Cà€	ØE€	ØˆB�I‰I�kÐ#4Ó5€	Ø€	Øˆh�l‰l˜8Ÿ<™<Ó(©9¸%Ô+@Ñ@×JÑJÈ:ÓV€ØÐZÐ[€òò,
òJòX&óP&ðP ˆzÒØ�s—x‘xÐ€DÙ‰6˜v€DÙ	„GÙ	ˆAˆiˆ[˜˜4˜&Ð
!Ô"Ø	ˆ�‰‹€BÙ˜$Ô�H€BˆÙ	ˆH‘U˜9˜4Ÿ9™9›; r™>¨1Ó-Ð.¨aÐ
0Ô1Ù	ˆG�B�4�w˜t˜fÐ
%Õ&ð rC   