Ë
    nÖzjK  ã                   óŽ  — 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
Z
ddlm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d
ZdZdZ ej8                  «       ZddiZd„ Zd„ Z d„ Z!d„ Z"d„ Z#e$dk(  �r‹ddl%Z% e%jL                  d¬«      Z'e'jQ                  ddd¬«       e'jQ                  ddd¬«       e'jS                  «       Z*e*jV                  r e#«         ejX                  d«        e-dd› �«        e-de› �«        e-d› «        ee«      Z.e.s e-d «        ejX                  d!«        e e.«      Z/ e-d" e0e/«      › d#�«       e*jb                  rV e-d$«       e/dd% D ]"  Z2 e-d&e2d'   dd( › d)e2d*   › d+e2d,   d-d › �«       Œ$  e-d. e0e/«      › d/�«        ejX                  d«        e!«         e"e/«      Z3 e-d0e3› d1�«        e-d2e/d3   d*   › d4e/d   d*   › �«        e-d5«        e#«         e-dd› �«        e-d6«       yy)7uY  
cnhu.com (æµ™æ±Ÿæ–°å’Œæˆ�) çŽ¯å¢ƒä¿¡æ�¯å…¬å¼€çˆ¬è™«
====================
åˆ—è¡¨é¡µ â†’ PDFç›´é“¾ â†’ å…¥åº“æ�œç´¢
  python3 crawl_cnhu.py              # å…¨é‡�çˆ¬å�–
  python3 crawl_cnhu.py --test       # æµ‹è¯•æ¨¡å¼�
  python3 crawl_cnhu.py --sync       # å�Œæ­¥åˆ°æœ�åŠ¡å™¨

è¯¦æƒ…é¡µä¸ºPDFæ–‡ä»¶ï¼Œç›´æŽ¥åµŒå…¥PDFé“¾æŽ¥å�³å�¯åœ¨çº¿é¢„è§ˆã€‚
é    N)Údatetime)Úurljoinzquality_results.dbzroot@1.94.217.116z/root/quality_results.dbú/root/search.dbz)https://www.cnhu.com/environment/42/zh-cnzhttps://www.cnhu.comõ   æ–°å’Œæˆ�çŽ¯å¢ƒä¿¡æ�¯zwww.cnhu.comz
User-Agentz[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36c                 ó  — t         j                  j                  | t        ¬«      }	 t         j                  j	                  |dt
        ¬«      }|j                  «       j                  dd¬«      S # t        $ r
}Y d }~y d }~ww xY w)N)Úheadersé   )ÚtimeoutÚcontextzutf-8Úreplace)Úerrors)	ÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚCTXÚreadÚdecodeÚ	Exception)ÚurlÚreqÚrespÚes       ú/root/gov_crawler/crawl_cnhu.pyÚhttp_getr   !   sj   € Ü
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°2¼sÐ%ÓCˆØ�y‰y‹{×!Ñ! '°)Ð!Ó<Ð<øÜò Üûðús   §AA. Á.	BÁ<Bc           	      óò  — g }t        j                  d| t         j                  «      D �]K  }|j                  d«      }t        j                  d|«      }|sŒ.|j                  d«      }t        t        |«      }t        j                  d|t         j                  «      }|s%t        j                  d|t         j                  «      }|sŒžt        j                  dd|j                  d«      «      j                  «       }|sŒÕd}	t        j                  d|«      }
|
r7|
j                  d«      › d	|
j                  d
«      › d	|
j                  d«      › �}	d|› d�}d|› d|› d�}|j                  |||	||dœ«       �ŒN |S )uC   è§£æž�åˆ—è¡¨é¡µï¼Œæ��å�–æ ‡é¢˜+PDFé“¾æŽ¥ï¼Œæ—¥æœŸä»Žæ–‡ä»¶å��æ��å�–z<li>(.*?)</li>é   zhref="([^"]+\.pdf)"z)<b[^>]*class="mediaul_frb"[^>]*>(.*?)</b>z2<span[^>]*class="mediaul_frtext"[^>]*>(.*?)</span>z<[^>]+>Ú z/(\d{4})/(\d{2})/(\d{2})/ú-é   é   u   ðŸ“Ž é™„ä»¶ï¼šåœ¨çº¿é¢„è§ˆ (ú)u   <p>ðŸ“„ <a href="u2   " target="_blank">ç‚¹å‡»åœ¨çº¿æŸ¥çœ‹PDF</a></p><p>z</p>)Útitler   ÚdateÚsummaryÚcontent)
ÚreÚfinditerÚDOTALLÚgroupÚsearchr   ÚBASEÚsubÚstripÚappend)ÚhtmlÚitemsÚmÚblockÚhref_mÚpdf_pathÚpdf_urlÚtitle_mr$   r%   Údate_mr&   r'   s                r   Ú
parse_listr:   )   ss  € à€Eä�[‰[ØØŒb�i‰ióó 'ˆð —‘˜“
ˆô —‘Ð1°5Ó9ˆÙØØ—<‘< “?ˆÜœ$ Ó)ˆô —)‘)ÐHÈ%ÔQS×QZÑQZÓ[ˆÙÜ—i‘iÐ UÐW\Ô^`×^gÑ^gÓhˆGÙØÜ—‘�z 2 w§}¡}°QÓ'7Ó8×>Ñ>Ó@ˆÙØð ˆÜ—‘Ð7¸ÓBˆÙØ—l‘l 1“oÐ& a¨¯©°Q«Ð'8¸¸&¿,¹,Àq»/Ð9JÐKˆDð 1°°	¸Ð;ˆØ& w iÐ/dÐejÐdkÐkoÐpˆà�‰ØØØØØñ
ö 	ðC'ðR €Ló    c                  óº   — t        j                  t        «      } | j                  d«       | j                  d«       | j	                  «        | j                  «        y )NúPRAGMA journal_mode=WALaH  CREATE TABLE IF NOT EXISTS quality_results (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        site_name TEXT NOT NULL,
        domain TEXT,
        title TEXT,
        url TEXT UNIQUE,
        content TEXT,
        publish_date TEXT,
        summary TEXT,
        crawled_at TEXT DEFAULT (datetime('now','localtime'))
    ))Úsqlite3ÚconnectÚ
QUALITY_DBÚexecuteÚcommitÚclose)Úconns    r   Úinit_dbrE   X   sB   € Ü�?‰?œ:Ó&€DØ‡L�LÐ*Ô+Ø‡L�Lð 
	ô 

ð 	‡K�K„MØ‡J�J…Lr;   c                 óŒ  — d}t        j                  t        «      }|j                  d«       | D ]N  }	 |j                  d|d   f«       |j                  dt        t
        |d   |d   |d   |d   |d	   f«       |d
z  }ŒP |j                  «        |j                  «        |S # t        $ r}t        d|› �«       Y d }~Œ�d }~ww xY w)Nr   r=   z'DELETE FROM quality_results WHERE url=?r   zrINSERT INTO quality_results (site_name, domain, title, url, content, publish_date, summary) VALUES (?,?,?,?,?,?,?)r$   r'   r%   r&   r   u       â�Œ DB: )
r>   r?   r@   rA   Ú	SITE_NAMEÚDOMAINr   ÚprintrB   rC   )r2   ÚnewrD   Úitemr   s        r   ÚstorerL   i   sÑ   € Ø
€CÜ�?‰?œ:Ó&€DØ‡L�LÐ*Ô+Øò 	&ˆð	&Ø�L‰LÐBÀTÈ%Á[ÀNÔSØ�L‰Lð EÜœF D¨¡M°4¸±;ÀÀYÁÐQUÐV\ÑQ]Ð_cÐdmÑ_nÐoôð �1‰H‰Cð	&ð 	‡K�K„MØ‡J�J„LØ€Jøô	 ò 	&Ü�L  Ð$×%Ñ%ûð	&ús   ³AB"Â"	CÂ+B>Â>Cc                  ó   — t        d«       t        j                  t        «      } | j	                  dt
        f«      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...z_SELECT title, url, content, publish_date, summary FROM crawl_results WHERE domain=? ORDER BY idu     æœ¬åœ°æ²¡æœ‰æ•°æ�®Nr   r=   r   r   zwINSERT OR IGNORE INTO gov_raw (title, page_url, content, publish_date, summary, site_name, tags) VALUES (?,?,?,?,?,?,?)r   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å…±u   æ�¡))rI   r>   r?   r@   rA   rH   ÚfetchallrC   Útotal_changesr   rB   ÚfetchoneÚlen)rD   ÚrowsÚdstÚ	site_nameÚ	new_countÚrr$   r   r'   Úpub_dater&   r   Útotals                r   Úsync_to_serverrZ   {   s¥  € ä	Ð
)Ô*ä�?‰?œ:Ó&€DØ�<‰<ØiÜ	ˆ	ó÷ �hƒjð 	ð 	‡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Å5FÆFÚ__main__u   æ–°å’Œæˆ�çŽ¯å¢ƒä¿¡æ�¯çˆ¬è™«)Údescriptionz--testÚ
store_trueu   æµ‹è¯•æ¨¡å¼�)ÚactionÚhelpz--syncu	   ä»…å�Œæ­¥ú
z2==================================================u   ðŸš€ u   â�Œ åˆ—è¡¨é¡µèŽ·å�–å¤±è´¥r   u     ðŸ“‹ è§£æž�åˆ° u
    æ�¡è®°å½•u   
ðŸ”¬ æµ‹è¯•æ¨¡å¼�ï¼šé   u     âœ… r$   é(   z... | r%   z | r   iâÿÿÿu     ...ï¼ˆå…±u   æ�¡ï¼Œæœªå­˜åº“ï¼‰u     âœ… å…¥åº“ u    æ�¡u   
  ðŸ“Š èŒƒå›´: éÿÿÿÿz ~ u     ðŸ“„ å…¨éƒ¨ä¸ºPDFæ–‡æ¡£u   ðŸ�� å®Œæˆ�)4Ú__doc__ÚsysÚosr(   Újsonr>   ÚsslÚurllib.requestr   Úbase64Ú
subprocessr   Úurllib.parser   ÚpathÚdirnameÚabspathÚ__file__ÚBASE_DIRÚjoinr@   Ú
SERVER_SSHÚ	SERVER_DBÚSERVER_SEARCH_DBÚLIST_URLr-   rG   rH   Ú_create_unverified_contextr   r   r   r:   rE   rL   rZ   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsÚsyncÚexitrI   r1   r2   rR   ÚtestrK   Ún© r;   r   ú<module>r„      s†  ðñ	÷ K× J× J× JÓ JÝ Ý  à�7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø�W‰W�\‰\˜(Ð$8Ó9€
Ø €
Ø&€	Ø$Ð à6€Ø€Ø#€	Ø	€à$€c×$Ñ$Ó&€àÐoð€òò-ò^ò"ò$1Tðh ˆzÓÛØ$ˆX×$Ñ$Ð1NÔO€FØ
×Ñ˜¨¸NÐÔKØ
×Ñ˜¨¸KÐÔHØ×ÑÓ€Dà‡y‚yÙÔØˆ�‰�Œá	ˆBˆvˆhˆ-ÔÙ	ˆE�)�Ð
ÔÙ	ˆVˆHÔá�HÓ€DÙÙÐ)Ô*Øˆ�‰�Œá�tÓ€EÙ	Ð™c %›j˜\¨Ð
4Ô5à‡y‚yÙÐ&Ô(Ø˜"˜1�Iò 	[ˆDÙ�F˜4 ™=¨¨"Ð-Ð.¨f°T¸&±\°NÀ#ÀdÈ5ÁkÐRUÐRVÐFWÐEXÐYÕZð	[á�™C ›J˜<Ð'9Ð:Ô;Øˆ�‰�Œá„IÙˆe‹€Aá	ˆM˜!˜˜DÐ
!Ô"Ù	Ð˜e B™i¨Ñ/Ð0°°E¸!±H¸VÑ4DÐ3EÐ
FÔGÙ	Ð%Ô'áÔÙ	ˆBˆvˆhˆ-ÔÙ	ˆKÕðO r;   