Ë
    nÖzjò   ã                   ó‚  — 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	Z	ddl
mZ ej                  j                  ej                  j                  e«      «      Zej                  j#                  ed«      ZdZdZdZdZ e	j.                  «       Zd	d
iZddddœZdd„Zd„ Zd„ Zd„ Zdd„Zd„ Z d„ Z!e"dk(  r e!«        yy)u²  
crawl_debaoenv.py â€” å¹¿ä¸œå¾·å®�çŽ¯å¢ƒæŠ€æœ¯ç ”ç©¶æœ‰é™�å…¬å�¸ å…¬ç¤ºä¿¡æ�¯çˆ¬è™«
============================================================
ç«™ç‚¹: https://www.debaoenv.com/Downs.aspx
å†…å®¹: çŽ¯è¯„/éªŒæ”¶ç­‰å…¬ç¤ºä¿¡æ�¯ï¼Œæ­£æ–‡ä¸ºPDFé™„ä»¶ï¼Œä¸�æ��å�–PDFæ–‡æœ¬ï¼Œ
      å�ªè®°å½•æ ‡é¢˜ + PDFé“¾æŽ¥ï¼ˆå�¯ç‚¹å‡»ï¼‰ã€‚

æ¨¡å¼�:
  - åˆ—è¡¨é¡µ: HTMLåˆ†é¡µ (Downs.aspx, Downs.aspx?page=N)
  - è¯¦æƒ…é¡µ: Down.aspx?id=N â†’ iframeå†…åµŒPDFé“¾æŽ¥
  - å­˜å‚¨: æ ‡é¢˜ + PDF URLå†…åµŒåˆ°content/summary

ç”¨æ³•:
  python3 crawl_debaoenv.py           # å¢žé‡�çˆ¬ (ç¬¬1é¡µ)
  python3 crawl_debaoenv.py --full    # å…¨é‡�çˆ¬æ‰€æœ‰é¡µ
  python3 crawl_debaoenv.py --sync    # ä»…å�Œæ­¥åˆ°æœ�åŠ¡å™¨
é    N)Úurljoinzdebaoenv_results.dbõ   å¾·å®�çŽ¯å¢ƒzwww.debaoenv.comzroot@1.94.217.116ú/root/search.dbz
User-Agentz[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36)ÚnewÚskipÚerrorsc                 óú   — 	 t         j                  j                  | t        ¬«      }t         j                  j	                  ||t
        ¬«      }|j                  «       j                  dd¬«      S # t        $ r Y y w xY w)N)Úheaders)ÚtimeoutÚcontextzutf-8Úreplace)r   )	ÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚCTXÚreadÚdecodeÚ	Exception)Úurlr   ÚreqÚresps       ú#/root/gov_crawler/crawl_debaoenv.pyÚhttp_getr   $   si   € ðÜ�n‰n×$Ñ$ S´'Ð$Ó:ˆÜ�~‰~×%Ñ% c°7ÄCÐ%ÓHˆØ�y‰y‹{×!Ñ! '°)Ð!Ó<Ð<øÜò Ùðús   ‚A+A. Á.	A:Á9A:c                  óº   — t        j                  t        «      } | j                  d«       | j                  d«       | j	                  «        | j                  «        y )NúPRAGMA journal_mode=WALu?  CREATE TABLE IF NOT EXISTS crawl_results (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        site_name TEXT DEFAULT 'å¾·å®�çŽ¯å¢ƒ',
        title TEXT,
        url TEXT UNIQUE,
        content TEXT,
        publish_date TEXT,
        summary TEXT,
        crawled_at TEXT DEFAULT (datetime('now','localtime'))
    ))Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcommitÚclose)Úconns    r   Úinit_dbr%   -   sB   € Ü�?‰?œ7Ó#€DØ‡L�LÐ*Ô+Ø‡L�Lð 		ô 	
ð 	‡K�K„MØ‡J�J…Ló    c                 ód  — t        j                  t        «      }	 |j                  d| ||||f«       |j	                  «        |j
                  dkD  rt        dxx   dz  cc<   nt        dxx   dz  cc<   |j                  «        y #  t        dxx   dz  cc<   Y Œ&xY w# |j                  «        w xY w)NzcINSERT OR IGNORE INTO crawl_results (title, url, content, publish_date, summary) VALUES (?,?,?,?,?)r   r   é   r   r   )r   r   r    r!   r"   Útotal_changesÚstatsr#   )Útitler   ÚcontentÚdateÚsummaryr$   s         r   Ústore_recordr/   >   s•   € Ü�?‰?œ7Ó#€DðØ�‰ð!ð �C˜ $¨Ð0ô		
ð 	�‰ŒØ×Ñ Ò!Ü�%‹L˜AÑŒLä�&‹M˜QÑ‹Mð 	�
‰
�øðÜˆh‹˜1Ñ�ûà�
‰
�ús   ›AB ÂBÂB ÂB/c                  ó  — t        d«       t        j                  t        «      } | j	                  d«      j                  «       }| j                  «        |st        d«       yt        j                  d«      }|j	                  d«       d}d}|D ]J  }|\  }}}}	}
	 |j	                  d	|||xs d
dd |	xs d
|
xs d
dd |d
f«       |j                  dkD  r|dz  }ŒL |dkD  r3|j                  «        |j	                  d|f«       |j                  «        |j	                  d|f«      j                  «       d   }|j                  «        t        d|› dt        |«      › d|› d�«       y# t        $ r}t        d|› �«       Y d}~Œôd}~ww xY w)u@   å°†æœ¬åœ°æ•°æ�®ç›´æŽ¥å†™å…¥ search.dbï¼ˆæœ�åŠ¡å™¨æœ¬åœ°æ¨¡å¼�ï¼‰u   
ðŸ“¤ å�Œæ­¥åˆ° search.db...zPSELECT title, url, content, publish_date, summary FROM crawl_results ORDER BY idu     æœ¬åœ°æ²¡æœ‰æ•°æ�®Nr   r   r   r   zwINSERT OR IGNORE INTO gov_raw (title, page_url, content, publish_date, summary, site_name, tags) VALUES (?,?,?,?,?,?,?)Ú i ¡ i,  r(   z	  Error: 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=?z.SELECT COUNT(*) FROM gov_raw WHERE site_name=?z  OK ú/u    æ�¡å�Œæ­¥åˆ° search.db (DBå…±õ   æ�¡))Úprintr   r   r    r!   Úfetchallr#   r)   r   r"   ÚfetchoneÚlen)r$   ÚrowsÚdstÚ	site_nameÚ	new_countÚrr+   r   r,   Úpub_dater.   ÚeÚtotals                r   Úsync_to_serverr@   R   s™  € ä	Ð
)Ô*ä�?‰?œ7Ó#€DØ�<‰<ÐjÓk×tÑtÓv€DØ‡J�J„LáÜÐ$Ô%Øä
�/‰/Ð+Ó
,€CØ‡K�KÐ)Ô*à€IØ€IØò #ˆØ12Ñ.ˆˆs�G˜X wð	#Ø�K‰Kð)ð ˜˜gšm¨¨W¨fÐ5°x²~À2Ø’-˜R  #Ð&¨	°2ð7ô	ð × Ñ  1Ò$Ø˜Q‘�	øð#ð �1‚}Ø�
‰
Œà�‰ðQð ˆLô		ð
 	�
‰
Œà�K‰KØ8¸9¸,óHßHPÉË
ÐSTñV€Eà‡I�I„Kä	ˆE�)�˜Aœc $›i˜[Ð(FÀuÀgÈTÐ
RÕSøô# ò 	#Ü�I˜a˜S�/×"Ñ"ûð	#ús   Â?E&Å&	FÅ/FÆFc                 ó0  — | dk(  r
dt         › d�ndt         › d| › �}t        |«      }|st        d| › d�«       g S g }t        j                  d|«      D ]€  }|j                  d«      j                  «       }|j                  d«      j                  «       xs |j                  d	«      j                  «       }dt         › |› �}|j                  ||d
œ«       Œ‚ t        j                  d|«      }t        |«      D ]  \  }	}
|	t        |«      k  r||	   nd|
d<   Œ |S )u1   èŽ·å�–åˆ—è¡¨é¡µï¼Œè¿”å›ž [{'title','url','date'}]r(   úhttps://z/Downs.aspxz/Downs.aspx?page=u     âš ï¸� åˆ—è¡¨é¡µu   åŠ è½½å¤±è´¥zD<a href="(/Down\.aspx\?id=\d+)"[^>]*title="([^"]*)"[^>]*>([^<]+)</a>é   é   )r   r+   u"   å�‘å¸ƒæ—¥æœŸï¼š(\d{4}-\d{2}-\d{2})r1   r-   )ÚDOMAINr   r4   ÚreÚfinditerÚgroupÚstripÚappendÚfindallÚ	enumerater7   )Úpager   ÚhtmlÚitemsÚmÚhrefr+   Úfull_urlÚdatesÚiÚitems              r   Úfetch_list_pagerV   ƒ   s  € à,0°AªIˆH”V�H˜KÑ
(¸XÄfÀXÐM^Ð_cÐ^dÐ;e€CÜ�C‹=€DÙÜÐ" 4 &¨Ð5Ô6Øˆ	à€EÜ�[‰[ØOØóò 8ˆð �w‰w�q‹z×ÑÓ!ˆØ—‘˜“
× Ñ Ó"Ò8 a§g¡g¨a£j×&6Ñ&6Ó&8ˆØœf˜X d VÐ,ˆØ�‰˜X°Ñ6Õ7ð8ô �J‰JÐ<¸dÓC€EÜ˜UÓ#ò :‰ˆˆ4Ø#$¤s¨5£z¢>�u˜Q’x°rˆˆVŠð:ð €Lr&   c                 ó   — t        | «      }|syd}t        j                  d|«      }|r|j                  d«      j	                  «       }d}t        j                  d|«      }|r2|j                  d«      j	                  «       }t        dt        › �|«      }d}t        j                  d|«      }|r|j                  d«      }|r|j                  d«      d	   nd}	|r
d
|› d|	› d�}
nd|› d�}
|r|› d|› �n|}|xs d|
|||dœS )u8   æŠ“å�–è¯¦æƒ…é¡µï¼Œæ��å�–æ ‡é¢˜+PDF URLï¼ˆä¸�ä¸‹è½½PDFï¼‰Nr1   z<title>(.*?)</title>r(   z<iframe[^>]*src="([^"]+\.pdf)"rB   u(   å�‘å¸ƒæ—¥æœŸ[ï¼š:]\s*(\d{4}-\d{2}-\d{2})r2   éÿÿÿÿz<p><a href="u(   " target="_blank">ðŸ“„ ä¸‹è½½PDFé™„ä»¶: z</a></p>z<p>z</p>z
PDF: )r+   r,   Úpdf_urlr-   r.   )r   rF   ÚsearchrH   rI   r   rE   Úsplit)Ú
detail_urlrN   r+   ÚtmrY   ÚpmÚpdf_relr-   ÚdmÚpdf_namer,   r.   s               r   Úfetch_detailrb   œ   s$  € ä�JÓ€DÙØð €EÜ	�‰Ð*¨DÓ	1€BÙ	Ø—‘˜“×!Ñ!Ó#ˆð €GÜ	�‰Ð4°dÓ	;€BÙ	Ø—(‘(˜1“+×#Ñ#Ó%ˆÜ˜H¤V HÐ-¨wÓ7ˆð €DÜ	�‰Ð>ÀÓ	E€BÙ	Ø�x‰x˜‹{ˆñ *1ˆw�}‰}˜SÓ! "Ò%°b€HÙØ   	Ð)QÐRZÐQ[Ð[cÐd‰à˜�w˜dÐ#ˆá,3���w˜w˜iÑ(¸€Gð ’˜"ØØØØñð r&   c                  ó<  — dd l } | j                  «       }|j                  ddd¬«       |j                  dt        dd¬	«       |j                  d
dd¬«       |j                  dt        dd¬	«       |j	                  «       }t        «        |j                  rt        «        y |j                  rdn|j                  }t        j                  «       }d}t        d|dz   «      D �]Å  }t        |«      }|st        d|› d�«        �n¦t        d|› dt        |«      › d�«       |D �]‚  }|j                  r||j                  k\  r Œat!        j"                  t$        «      }	|	j'                  d|d   f«      j)                  «       }
|	j+                  «        |
rt,        dxx   dz  cc<   Œ‚t        d|d   d d › d�dd¬«       t/        |d   «      }|€t        d«       t,        dxx   dz  cc<   ŒÇt1        |d   xs |d   |d   |d    |j3                  d!«      xs |j3                  d!d«      |d"   «       t,        d#   dkD  rK|dz  }|j3                  d$«      r$|j3                  d$d«      j5                  d%«      d&   nd'}t        d(|› �«       nt        d)«       t        j6                  d*«       �Œ… �ŒÈ t        j                  «       |z
  }t        d+d,› �«       t        d-t,        d#   › d.t,        d   › d/t,        d   › �«       t        d0|d1›d2�«       t,        d#   dkD  rt        «        y y )3Nr   z--fullÚ
store_trueu   å…¨é‡�)ÚactionÚhelpz--pagesr(   u   é¡µæ•°)ÚtypeÚdefaultrf   z--syncu	   ä»…å�Œæ­¥z--testu
   æµ‹è¯•Næ�¡i'  u   â�¹ ç¬¬u   é¡µæ— æ•°æ�®ï¼Œç»“æ�Ÿu	   
ðŸ“ƒ ç¬¬u   é¡µ (r3   z'SELECT 1 FROM crawl_results WHERE url=?r   r   u     ðŸ“„ r+   é#   z...r1   T)ÚendÚflushu    âœ— è¯¦æƒ…é¡µå¤±è´¥r   r,   r-   r.   r   rY   r2   rX   u   æ— PDFu    âœ… u    â�­ï¸� é‡�å¤�g333333Ó?ú
z2==================================================u   ðŸ�� å®Œæˆ�! æ–°å¢ž:u    è·³è¿‡:u    é”™è¯¯:u   â�±ï¸� z.0fÚs)ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsr%   Úsyncr@   ÚfullÚpagesÚtimeÚrangerV   r4   r7   Útestr   r   r    r!   r6   r#   r*   rb   r/   Úgetr[   Úsleep)rn   ÚparserÚargsÚ	max_pagesÚ
start_timeÚ	total_newrM   rO   rU   r$   ÚexistsÚdetailra   Úelapseds                 r   Úmainrƒ   Ç   sò  € ÛØ×$Ñ$Ó&€FØ
×Ñ˜¨¸HÐÔEØ
×Ñ˜	¬°Q¸XÐÔFØ
×Ñ˜¨¸KÐÔHØ
×Ñ˜¤s°A¸LÐÔIØ×ÑÓ€Dä„Ià‡y‚yÜÔØàŸ	š	‘ t§z¡z€IÜ—‘“€Jà€IÜ�a˜ Q™Ó'ó ,ˆÜ Ó%ˆÙÜ�G˜D˜6Ð!6Ð7Ô8Úä�
˜4˜& ¤c¨%£j \°Ð6Ô7àó $	ˆDØ�yŠy˜Y¨$¯)©)Ò3Ùä—?‘?¤7Ó+ˆDØ—\‘\Ø9¸DÀ¹K¸>óç‰h‹jð ð �J‰JŒLÙÜ�f“ Ñ"“Øä�G˜D ™M¨#¨2Ð.Ð/¨sÐ3¸À4ÕHÜ! $ u¡+Ó.ˆFàˆ~ÜÐ,Ô-Ü�h“ 1Ñ$“ØäØ�w‘Ò0 4¨¡=Ø�U‘Ø�yÑ!Ø—
‘
˜6Ó"Ò: d§h¡h¨v°rÓ&:Ø�yÑ!ôô �U‰|˜aÒØ˜Q‘�	ØGMÇzÁzÐR[ÔG\˜6Ÿ:™: i°Ó4×:Ñ:¸3Ó?ÀÒCÐbj�Ü˜˜h˜ZÐ(Õ)äÐ&Ô'ä�J‰J�sŽOòI$	ð,ô\ �i‰i‹k˜JÑ&€GÜ	ˆBˆvˆhˆ-ÔÜ	Ð ¤ u¡ ¨h´u¸V±}°oÀXÌeÐT\ÉoÐM^Ð
_Ô`Ü	ˆG�G˜C�= Ð
"Ô#äˆU�|�aÒÜÕð r&   Ú__main__)é   )r(   )#Ú__doc__ÚosrF   Úsysrv   r   Ú
subprocessÚurllib.requestr   ÚsslÚurllib.parser   ÚpathÚdirnameÚabspathÚ__file__ÚBASE_DIRÚjoinr    Ú	SITE_NAMErE   Ú
SERVER_SSHÚSERVER_SEARCH_DBÚ_create_unverified_contextr   r   r*   r   r%   r/   r@   rV   rb   rƒ   Ú__name__© r&   r   ú<module>r™      sÌ   ðñ÷" C× B× B× BÝ  à�7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø
�'‰'�,‰,�xÐ!6Ó
7€Ø€	Ø	€Ø €
Ø$Ð Ø$€c×$Ñ$Ó&€àÐoð€ð ˜1¨Ñ*€óòò"ò(.Tóbò2(òVGðT ˆzÒÙ…Fð r&   