Ë
    æiŸj›  ã                   ó<  — 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mc mZ	 ddl
mZ ddlmZmZ d„ ZdZdZdZ ej$                  d	d
«      ZdZdZdZ ej.                  «       Zej2                  j5                  dedœ«        ej6                  «        ed¬«      z
  j9                  d«      ZddddœZdd„Zd„ Z d„ Z!d„ Z"d d„Z#e$dk(  rXdejJ                  v Z&dZ'ejJ                  D ].  Z(e(jS                  d«      sŒ e*e(jW                  d«      d   «      Z'Œ0  e#e&e'¬«       yy)!uì   
crawl_xiushui_hp.py -- Xiushui county EIA project crawler (TRS)

2026-09-08 ä¿®å¤�: æ �ç›®åˆ—è¡¨å·²æ”¹ JS æ¸²æŸ“, é�™æ€� index.html æ— è¡Œ â†’
æ”¹ä»Žå�Œç›®å½• data_<å¹´ä»½>.xml æ‹‰å�–(éœ€ x-api-key å¤´, è§� enc.js/document_year.js)ã€‚
é    N)ÚBeautifulSoup)ÚdatetimeÚ	timedeltac                 ó¼   — | syt        | d«      } |ddg«      D ]  }|j                  «        Œ |j                  dd¬«      }t        j                  dd|«      }|d d	 S )
NÚ úhtml.parserÚscriptÚstyleú T)Ú	separatorÚstripz\s+iô  )r   Ú	decomposeÚget_textÚreÚsub)Ú	html_textÚsoupÚtagÚtexts       ú%/root/gov_crawler/crawl_xiushui_hp.pyÚextract_plain_textr      sf   € ÙØÜ˜ MÓ2€DÙ�X˜wÐ'Ó(ò ˆØ�‰�ðà�=‰= 3¨dˆ=Ó3€DÜ�6‰6�&˜#˜tÓ$€DØ��ˆ:Ðó    zhttps://www.xiushui.gov.cnz$/xxgk/bmxxgk/sthjj/sthj/zdmsxm/xmhp/z********^^^^^^^^Ú	SEARCH_DBz/root/search.dbu   ä¿®æ°´åŽ¿-é¡¹ç›®çŽ¯è¯„é&   é   z<Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36)z
User-Agentz	x-api-keyiG  )Údaysz%Y-%m-%d)ÚnewÚskipÚerrorsc                 óþ   — t        |«      D ]C  }	 t        j                  | d|xs i ¬«      }d|_        |j                  dk(  r|j
                  c S ŒE y # t        $ r  ||dz
  k  rt        j                  d«       Y Œow xY w)Né   )ÚtimeoutÚheaderszutf-8éÈ   é   é   )	ÚrangeÚsessionÚgetÚencodingÚstatus_coder   Ú	ExceptionÚtimeÚsleep)ÚurlÚmax_retriesÚextra_headersÚattemptÚresps        r   Úfetchr4   *   s†   € Ü˜Ó%ò ˆð	Ü—;‘;˜s¨B¸Ò8KÈ�;ÓLˆDØ#ˆDŒMØ×Ñ 3Ò&Ø—y‘yÒ ð 'ð	ð øô ò 	Ø˜ q™Ò(Ü—
‘
˜1”ùð	ús   �=AÁ&A<Á;A<c           
      ó†  ‡— t         › t        › d| › d�}t        |«      }|st        d| › d�«       g S 	 t	        j
                  |«      }g }|j                  d«      D ]l  Šˆfd„} |d«      }	 |d«      }
 |d«      }|	r|
sŒ%|
j                  d«      st         t        z   |
j                  d«      z   }
|j                  |	|
|dd dœ«       Œn |S # t        $ rk}	 t        j                  dd|d¬«      }t	        j
                  |«      }n1# t        $ r%}t        d| › d	|› d
|› �«       g cY d}~cY d}~S d}~ww xY wY d}~Œód}~ww xY w)u@   æ‹‰ data_<year>.xml â†’ [{title,url,date}], å¤±è´¥è¿”å›žç©º listÚdata_z.xmlz  [WARN] data_z.xml fetch failedz^[^<]*<ú<r%   )Úcountz.xml parse failed: z / NÚITEMc                 óˆ   •— ‰j                  | «      }|�-dj                  |j                  «       «      j                  «       S dS )Nr   )ÚfindÚjoinÚitertextr   )r   ÚeÚits     €r   Úgzfetch_items_xml.<locals>.gJ   s7   ø€ Ø—‘˜“ˆAØ45°M�2—7‘7˜1Ÿ:™:›<Ó(×.Ñ.Ó0ÐIÀrÐIr   ÚTITLEÚPUBURLÚRELTIMEÚhttpz./é
   )Útitler/   Údate)ÚBASE_URLÚXML_DIRr4   ÚprintÚETÚ
fromstringr,   r   r   ÚiterÚ
startswithÚlstripÚappend)Úyearr/   ÚrawÚrootr>   ÚsÚe2Úrecordsr@   rF   ÚpubÚrelr?   s               @r   Úfetch_items_xmlrY   7   sP  ø€ äˆJ”w�i˜u T F¨$Ð
/€CÜ
�‹*€CÙÜ�˜t˜fÐ$5Ð6Ô7Øˆ	ð	Ü�}‰}˜SÓ!ˆð €GØ�i‰i˜Óò Gˆô	Jñ �'“
ˆÙ�‹kˆÙ�	‹lˆÙ™CØØ�~‰~˜fÔ%ÜœWÑ$ s§z¡z°$Ó'7Ñ7ˆCØ�‰ ¨s¸CÀÀ¸HÑEÕFðGð €Nøô+ ò ð	Ü—‘�z 3¨°1Ô5ˆAÜ—=‘= Ó#‰DøÜò 	Ü�N 4 &Ð(;¸A¸3¸cÀ"ÀÐFÔGØ�IŠIûð	úô ûð	úsG   ³C Ã	E Ã.DÄD;Ä	D3ÄD.Ä#D3Ä$D;Ä(E Ä.D3Ä3D;Ä;E c                 ón  — t        | «      }|syt        |d«      }|j                  dddi¬«      }d}|r|j                  dd«      }|r|d d	 nd}|j                  d
d„ ¬«      }|s|j                  d
d„ ¬«      }|s|j                  d
d„ ¬«      }|s|j                  d
d¬«      }d}|rt	        |«      }||fS )N)r   r   r   ÚmetaÚnameÚPubDate)Úattrsr   ÚcontentrE   Údivc                 óB   — | xr dt        | «      v xr dt        | «      v S )NÚTRS_UEDITORÚview©Ústr©Úcs    r   ú<lambda>zfetch_detail.<locals>.<lambda>d   s&   € °AÒ4f¸-Ì3ÈqË6Ð:QÒ4fÐV\Ô`cÐdeÓ`fÐVf€ r   )Úclass_c                 ó$   — | xr dt        | «      v S )Nrb   rd   rf   s    r   rh   zfetch_detail.<locals>.<lambda>f   s   € ¸Ò8U¸mÌsÐSTËvÐ>U€ r   c                 ó$   — | xr dt        | «      v S )NÚtrs_editor_viewrd   rf   s    r   rh   zfetch_detail.<locals>.<lambda>h   s   € ¸Ò8YÐ>OÔSVÐWXÓSYÐ>Y€ r   zarticle-box)Úid)r4   r   r;   r)   re   )r/   r   r   Ú	meta_dateÚdate_strÚraw_dateÚcontent_divÚcontent_htmls           r   Úfetch_detailrs   X   sÌ   € Ü�c“
€IÙØÜ˜ MÓ2€Dà—	‘	˜&¨°Ð(;�	Ó<€IØ€HÙØ—=‘= ¨BÓ/ˆÙ$,�8˜C˜R‘=°"ˆà—)‘)˜EÑ*f�)Óg€KÙØ—i‘i Ñ.U�iÓVˆÙØ—i‘i Ñ.Y�iÓZˆÙØ—i‘i ¨-�iÓ8ˆà€LÙÜ˜;Ó'ˆà˜Ð!Ð!r   c                 ó¸  — dd l }	 |j                  t        «      }|j                  «       }t	        |«      }d}|j                  |t        | |||||df«       |j                  dkD  rt        dxx   dz  cc<   nt        dxx   dz  cc<   |j                  «        |j                  «        y # t        $ r'}	t        d|	«       t        dxx   dz  cc<   Y d }	~	y d }	~	ww xY w)	Nr   z�INSERT OR IGNORE INTO gov_raw (site_name, title, page_url, publish_date, content, source_url, summary, category) VALUES (?, ?, ?, ?, ?, ?, ?, ?)Úxmhpr   r%   r   z  [DB]r   )Úsqlite3ÚconnectÚDB_PATHÚcursorr   ÚexecuteÚ	SITE_NAMEÚrowcountÚstatsÚcommitÚcloser,   rJ   )
rF   r/   r_   ro   rv   Úconnrg   ÚsummaryÚsqlr>   s
             r   Ú
store_itemrƒ   s   s»   € ÛðØ�‰œwÓ'ˆØ�K‰K‹MˆÜ$ WÓ-ˆð aˆØ	�	‰	�#Ü˜e S¨(°G¸SÀ'È6ÐRô	Tà�:‰:˜Š>Ü�%‹L˜AÑŒLä�&‹M˜QÑ‹MØ�‰ŒØ�
‰
�øÜò Üˆh˜ÔÜˆh‹˜1Ñ�ˆûðús   †B"B) Â)	CÂ2CÃCc           
      ót  — t        d«       t        d«       t        d«       t        j                  «       j                  }t	        t
        d d «      }t        t        ||dz
  d«      «      }t        d|› dt
        › d�«       g }|D ]9  }t        |«      }t        d	|› d
t        |«      › d�«       |j                  |«       Œ; t        dt        |«      › �«       d}t        |«      D ]¨  \  }	}
|
d   r|
d   t
        k  rt        dxx   dz  cc<   Œ)t        d|	dz   › d|
d   d d › d|
d   › �«       |r||k\  rt        d|› d�«        nJt        |
d   «      \  }}|xs |
d   }t        |
d   |
d   ||«       |dz  }t        j                   d«       Œª t        dt        d   › dt        d   › dt        d   › �«       y )Nz<============================================================z&Xiushui EIA project crawler (XML mode)é   r%   éÿÿÿÿzYears: z	 (cutoff ú)z  z: z items from xmlzTotal items: r   rG   r   z  [z] rF   é(   z | z
  Test mode: z items doner/   g      à?z
Done! New: r   z, Skip: z
, Errors: r   )rJ   r   ÚnowrQ   ÚintÚTHREE_YEARS_AGOÚlistr'   rY   ÚlenÚextendÚ	enumerater}   rs   rƒ   r-   r.   )ÚfullÚtest_nÚnow_yearÚcutoff_yearÚyearsÚ	items_allÚyÚrecsÚseenÚidxÚitemr_   Údetail_datero   s                 r   Úcrawlrœ   ‡   sÈ  € Ü	ˆ(„OÜ	Ð
2Ô3Ü	ˆ(„Oä�|‰|‹~×"Ñ"€HÜ”o b qÐ)Ó*€KÜ”�x ¨q¡°"Ó5Ó6€EÜ	ˆG�E�7˜)¤OÐ#4°AÐ
6Ô7à€IØò ˆÜ˜qÓ!ˆÜ��1�#�Rœ˜D›	�{ /Ð2Ô3Ø×Ñ˜Õðô 
ˆMœ#˜i›.Ð)Ð
*Ô+à€DÜ˜yÓ)ò ‰	ˆˆTØ�Š<˜D ™L¬?Ò:Ü�&‹M˜QÑ‹MØÜ��C˜‘E�7˜"˜T '™]¨3¨BÐ/Ð0°°D¸±L°>ÐBÔCá�d˜f’nÜ�O F 8¨;Ð7Ô8Ùä+¨D°©KÓ8Ñˆ�ØÒ. $ v¡,ˆÜ�4˜‘= $ u¡+¨w¸ÔAØ�‰	ˆÜ�
‰
�3�ðô  
ˆMœ% ™,˜ x´°f±¨¸jÌÈxÉÐHYÐ
ZÕ[r   Ú__main__z--fullz--test=ú=r%   )r�   r‘   )é   N)FN),Ú__doc__Úsysr   r-   ÚosÚrequestsÚxml.etree.ElementTreeÚetreeÚElementTreerK   Úbs4r   r   r   r   rH   rI   ÚXML_API_KEYÚgetenvrx   r{   ÚTOTAL_PAGESÚ	MAX_PAGESÚSessionr(   r#   Úupdater‰   Ústrftimer‹   r}   r4   rY   rs   rƒ   rœ   Ú__name__Úargvr�   r‘   ÚargrN   rŠ   Úsplit© r   r   ú<module>r´      s6  ðñ÷ × Û ß "Ð "Ý ß (òð (€Ø
0€Ø €Ø
ˆ"�)‰)�KÐ!2Ó
3€Ø$€	Ø€Ø€	à
ˆ(×
Ñ
Ó
€Ø ‡�× Ñ ØPØñô ð
  �8—<‘<“>¡I°5Ô$9Ñ9×CÑCÀJÓO€Ø˜1¨Ñ*€ó
òòB"ò6ó("\ðJ ˆzÒØ�s—x‘xÐ€DØ€FØ�x‰xò ,ˆØ�>‰>˜)Õ$Ù˜Ÿ™ 3›¨Ñ*Ó+‰Fð,ñ 
ˆt˜FÖ#ð r   