Ë
    †É…jÆE  ã                   óš  — 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Z
 ee
j                  «      dkD  r2e
j                  d   j                  «       r ee
j                  d   «      ndZe� ed ee«      z   «        e	j$                  d«       ej&                  j)                  ej&                  j+                  e«      «      Zej&                  j1                  ed«      ZdZdZd	Zd
ZdddddœZdZddddddddœZ ddddœZ!d„ Z"d„ Z#d,d„Z$d„ Z%d„ Z&d„ Z'd „ Z(d!„ Z)d"„ Z*d#„ Z+d$„ Z,d%„ Z-d&„ Z.d-d'„Z/d(„ Z0d)„ Z1d*„ Z2e3d+k(  r e2«        yy).u]  


crawl_eiacloud.py â€” çŽ¯è¯„äº‘(www.eiacloud.com) å¤šæ �ç›®çˆ¬è™«
========================================================
ç«™ç‚¹: https://www.eiacloud.com/gs/list/1 (çŽ¯è¯„æŠ¥å‘Šå…¬ç¤º)
å��çˆ¬: JSæ¸²æŸ“åˆ†é¡µï¼ŒAPI POST /gs/gkPublishList
åˆ—è¡¨: APIè¿”å›žJSONï¼Œ15æ�¡/é¡µ
è¯¦æƒ…: é�™æ€�HTMLï¼Œæ­£æ–‡åœ¨ div#contentContainer.detail_text

å¤šæ �ç›®æ”¯æŒ�: æŠ¥å‘Šå…¬ç¤º(id=1) / éªŒæ”¶æŠ¥å‘Š(id=2) / çŽ¯è¯„æŠ¥å‘Š(id=3)
           æ°´åœŸä¿�æŒ�(id=4) / åœŸå£¤æ±¡æŸ“(id=5) / ç«£å·¥è°ƒè¯•(id=6)

ç”¨æ³•:
  python3 crawl_eiacloud.py           # å¢žé‡�çˆ¬(æ‰€æœ‰æ �ç›®)
  python3 crawl_eiacloud.py --full    # å…¨é‡�çˆ¬(ä»…æ �ç›®1)
  python3 crawl_eiacloud.py --plate 3 # å�ªçˆ¬æŒ‡å®šæ �ç›®
  python3 crawl_eiacloud.py --sync    # ä»…å�Œæ­¥

å�Œæ­¥æœºåˆ¶:
  - æœ�åŠ¡å™¨æœ¬åœ°(/root/search.db å­˜åœ¨): ç›´æŽ¥å†™å…¥
  - Macæœ¬åœ°: é€šè¿‡SSHæŽ¨é€�åˆ°æœ�åŠ¡å™¨ search.db
é    Né   z[AutoPg] max_pages=Úignorezeiacloud_results.dbzwww.eiacloud.comzroot@1.94.217.116ú/root/search.dbz)https://www.eiacloud.com/gs/gkPublishListz[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36ÚXMLHttpRequestú"https://www.eiacloud.com/gs/list/1z!application/x-www-form-urlencoded)ú
User-AgentzX-Requested-WithÚRefererzContent-Typeé   )u   æŠ¥å‘Šå…¬ç¤ºé   iH  )u   éªŒæ”¶æŠ¥å‘Šé   éÈ   )u   çŽ¯è¯„æŠ¥å‘Šr   r   )u   æ°´åœŸä¿�æŒ�é   éd   )u   åœŸå£¤æ±¡æŸ“r   r   )u   ç«£å·¥è°ƒè¯•r   r   )u   ç›‘æµ‹æŠ¥å‘Šé   é2   )r   r   r   é   r   é   é
   )ÚnewÚskipÚerrorsc                  ó¾   — t        j                  t        d¬«      } | j                  d«       | j                  d«       | j	                  «        | j                  «        y )Né<   ©ÚtimeoutúPRAGMA journal_mode=WALu_  CREATE TABLE IF NOT EXISTS crawl_results (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        site_name TEXT DEFAULT 'çŽ¯è¯„äº‘',
        plate_id TEXT DEFAULT '1',
        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    ú#/root/gov_crawler/crawl_eiacloud.pyÚinit_dbr'   A   sD   € Ü�?‰?œ7¨BÔ/€DØ‡L�LÐ*Ô+Ø‡L�Lð 
	ô 

ð 	‡K�K„MØ‡J�J…Ló    c                  ó¬   — t        j                  t        d¬«      } 	 | j                  d«       | j	                  «        | j                  «        y#  Y ŒxY w)u   ç»™å·²æœ‰è¡¨åŠ  plate_id åˆ—r   r   z>ALTER TABLE crawl_results ADD COLUMN plate_id TEXT DEFAULT '1'Nr   r$   s    r&   Úadd_plate_columnr*   S   sB   € ä�?‰?œ7¨BÔ/€DðØ�‰ÐUÔVØ�‰Œð 	‡J�J…LøðÙús   �!A ÁAc           	      ój  — t        j                  t        d¬«      }	 |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)	Nr   r   zoINSERT OR IGNORE INTO crawl_results (title, url, content, publish_date, summary, plate_id) VALUES (?,?,?,?,?,?)r   r   r   r   r   )r   r   r    r!   r"   Útotal_changesÚstatsr#   )ÚtitleÚurlÚcontentÚdateÚsummaryÚplate_idr%   s          r&   Ústore_recordr4   ^   s™   € Ü�?‰?œ7¨BÔ/€DðØ�‰ð#ð �C˜ $¨°Ð:ô		
ð 	�‰ŒØ×Ñ Ò!Ü�%‹L˜AÑŒLä�&‹M˜QÑ‹Mð 	�
‰
�øðÜˆh‹˜1Ñ�ûà�
‰
�ús   �AB ÂBÂB  Â B2c                 ó   — d|› �S )Nu
   çŽ¯è¯„äº‘-© )r3   Úplate_labels     r&   Úsite_name_forr8   r   s   € Ø˜�}Ð%Ð%r(   c                 óJ   — | €ydt        | «      j                  dd«      z   dz   S )Nz''ú')ÚstrÚreplace)Úvs    r&   Úescr>   v   s(   € Ø€y˜Ø”�Q“—‘  TÓ*Ñ*¨SÑ0Ð0r(   c                  ó@   — t         j                  j                  d«      S )Nr   )ÚosÚpathÚexistsr6   r(   r&   Úis_running_on_serverrC   {   s   € Ü�7‰7�>‰>Ð+Ó,Ð,r(   c                  ó  — t        d«       t        j                  t        d¬«      } | j	                  d«      j                  «       }| j                  «        |st        d«       yt        «       rt        |«       yt        |«       y)u4   å�Œæ­¥æ‰€æœ‰æ �ç›®çš„æ•°æ�®åˆ°æœ�åŠ¡å™¨çš„ search.dbu   
ðŸ“¤ å�Œæ­¥åˆ° search.db...r   r   zZSELECT title, url, content, publish_date, summary, plate_id FROM crawl_results ORDER BY idu     æœ¬åœ°æ²¡æœ‰æ•°æ�®N)
Úprintr   r   r    r!   Úfetchallr#   rC   Ú_sync_directÚ_sync_via_ssh)r%   Úrowss     r&   Úsync_to_serverrJ      sf   € ä	Ð
)Ô*ä�?‰?œ7¨BÔ/€DØ�<‰<Ødóç�hƒjð 	ð 	‡J�J„LáÜÐ$Ô%ØäÔÜ�TÕä�dÕr(   c                 óº  — t        j                  dd¬«      }|j                  d«       d}t        j	                  «       D ��ci c]  \  }}t        |«      |d   “Œ }}}| D ]p  }|\  }}}	}
}}t        ||j                  t        |«      d«      «      }	 |j                  d|||	xs dd d	 |
xs d|xs dd d
 |df«       |j                  dkD  r|dz  }Œr |dkD  rƒ|j                  «        t        j	                  «       D ��cg c](  \  }}t        |«      t        t        |«      |d   «      f‘Œ* c}}D ]  \  }}|j                  d|f«       Œ |j                  «        |j                  d«      j                  «       d   }|j                  «        t        d|› dt        | «      › d|› d�«       y c c}}w # t        $ r}t        d|› �«       Y d }~�Œod }~ww xY wc c}}w )Nr   r   r   r   r   õ   å…¶ä»–zwINSERT OR IGNORE INTO gov_raw (title, page_url, content, publish_date, summary, site_name, tags) VALUES (?,?,?,?,?,?,?)Ú é ¡ é,  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=?u>   SELECT COUNT(*) FROM gov_raw WHERE site_name LIKE 'çŽ¯è¯„äº‘%'u	     âœ… OK ú/u    æ�¡å�Œæ­¥åˆ° search.db (DBå…±õ   æ�¡))r   r   r!   ÚPLATESÚitemsr;   r8   Úgetr,   Ú	ExceptionrE   r"   Úfetchoner#   Úlen)rI   ÚdstÚ	new_countÚkr=   Ú	plate_mapÚrr.   r/   r0   Úpub_dater2   ÚpidÚsnÚeÚtotals                   r&   rG   rG   “   sÜ  € Ü
�/‰/Ð+°RÔ
8€CØ‡K�KÐ)Ô*Ø€IÜ*0¯,©,«.×9¡$ ! Q”�Q“˜˜1™‘Ð9€IÑ9àò #ˆØ67Ñ3ˆˆs�G˜X w°Ü˜3 	§¡¬c°#«h¸Ó AÓBˆð	#Ø�K‰Kð)ð ˜˜gšm¨¨W¨fÐ5°x²~À2Ø’-˜R  #Ð&¨¨Bð0ô	ð × Ñ  1Ò$Ø˜Q‘�	øð#ð  �1‚}Ø�
‰
ŒäJPÏ,É,Ë.×YÁ$À!ÀQœ˜Q›¤¬s°1«v°q¸±tÓ!<Ò=ÓYò 	‰GˆC�Ø�K‰KðUð �õ	ð	ð 	�
‰
Œà�K‰KØHóç�hƒj�ñ€Eð ‡I�I„KÜ	ˆI�i�[ ¤# d£) Ð,JÈ5È'ÐQUÐ
VÕWùóC :øô ò 	#Ü�I˜a˜S�/×"Ò"ûð	#üó Zs$   ÁF,Â?F2Ã?-GÆ2	GÆ;GÇGc                 ó\  — dd l }t        j                  «       D ��ci c]  \  }}t        |«      |d   “Œ }}}dj	                  d„ t        j                  «       D «       «      }dt
        › d|› d�}	 t        j                  dt        |gddd	¬
«      }|j                  j                  «       r2t        |j                  j                  «       j                  d«      «      n	t        «       }g }	| D ]_  }|\  }
}}}}}||v rŒt        ||j                  t        |«      d«      «      }|	j                  |
||xs dd d |xs d|xs dd d |df«       Œa |	st!        dt#        | «      › d�«       y t!        dt#        |	«      › d�«       d}d}t%        dt#        |	«      |«      D ]ê  }|	|||z    }dj	                  d„ |D «       «      }dt
        › d|› d�}	 |j'                  |j)                  «       «      j+                  «       }d|› dt        › dt
        › d�}t        j                  |dddd	¬«      }|j,                  dk7  r|D ]  }t/        |«       Œ |t#        |«      z  }t!        d||z  d z   › d!t#        |«      › d"|› d#t#        |	«      › d$�	«       Œì t        j                  «       D ��cg c](  \  }}t        |«      t        t        |«      |d   «      f‘Œ* c}}D ]6  \  }}d%|› d&�}	 t        j                  dt        dt
        › d'|› d�gdd	¬(«       Œ8 	 t        j                  dt        dt
        › d)�gddd*¬
«      }|j                  j                  «       }t!        d+|› d,�«       y c c}}w #  t        «       }Y �Œ‰xY w#  |D ]  }t/        |«       Œ |t#        |«      z  }Y �ŒþxY wc c}}w #  Y ŒÖxY w#  Y y xY w)-Nr   z','c              3   óR   K  — | ]  \  }}t        t        |«      |d    «      –— Œ! y­w)r   N)r8   r;   )Ú.0rZ   r=   s      r&   ú	<genexpr>z _sync_via_ssh.<locals>.<genexpr>Á   s#   è ø€ ÒWÁÀÀ1¤¬c°!«f°a¸±d× ;ÑWùs   ‚%'zsqlite3 z4 "SELECT page_url FROM gov_raw WHERE site_name IN ('z')"ÚsshTé   )Úcapture_outputÚtextr   ú
rL   rM   rN   rO   u     âœ… æ‰€æœ‰ u+    æ�¡å·²åœ¨æœ�åŠ¡å™¨ä¸­å­˜åœ¨ï¼Œæ— éœ€å�Œæ­¥u     å¾…å�Œæ­¥ u    æ�¡...r   z,
c              3   óÚ   K  — | ]c  \  }}}}}}}d t        |«      › dt        |«      › dt        |«      › dt        |«      › dt        |«      › dt        |«      › dt        d«      › d�–— Œe y­w)ú(ú,rM   ú)N)r>   )rd   ÚtÚuÚcÚdÚsr_   Ú_s           r&   re   z _sync_via_ssh.<locals>.<genexpr>â   so   è ø€ ò #
á$��1�a˜˜A˜r 1ð ”�A“ˆx�qœ˜Q›˜ ¤# a£& ¨¬3¨q«6¨(°!´C¸³F°8¸1¼SÀ»W¸IÀQÄsÈ2ÃwÀiÈqÔQñ#
ùs   ‚A)A+zATTACH DATABASE 'z|' AS maindb;
INSERT OR IGNORE INTO maindb.gov_raw (title, page_url, content, publish_date, summary, site_name, tags) VALUES
z;
DETACH DATABASE maindb;
úecho ú | base64 -d | ssh ú
 "sqlite3 ú")Úshellrh   ri   r   u	     âœ… æ‰¹r   ú: u   æ�¡ (ç´¯è®¡rP   rn   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';z ")rh   r   uA    "SELECT COUNT(*) FROM gov_raw WHERE site_name LIKE 'çŽ¯è¯„äº‘%'"r   u.     ðŸ“Š æœ�åŠ¡å™¨ search.db çŽ¯è¯„äº‘ç³»åˆ—å…± u    æ�¡)Úbase64rR   rS   r;   ÚjoinÚSERVER_SEARCH_DBÚ
subprocessÚrunÚ
SERVER_SSHÚstdoutÚstripÚsetÚsplitr8   rT   ÚappendrE   rW   ÚrangeÚ	b64encodeÚencodeÚdecodeÚ
returncodeÚ_sync_one_via_ssh)rI   r{   rZ   r=   r[   Úall_site_namesÚ	check_cmdr\   Úexisting_urlsÚbatchr.   r/   r0   r]   r2   r^   r_   Ú
BATCH_SIZEÚpushedÚiÚchunkÚvalues_clauseÚsqlÚencodedÚcmdÚitemÚ	pid_labelÚfts_sqlra   s                                r&   rH   rH   »   sø  € Ûä*0¯,©,«.×9¡$ ! Q”�Q“˜˜1™‘Ð9€IÑ9ð —Z‘ZÑWÌÏÉËÔWÓW€Nà
Ô#Ð$ð %?Ø?MÐ>NÈdð	Tð ðÜ�N‰NØ”J 	Ð*Ø d°Bô
ˆð >?¿X¹X¿^¹^Ô=Mœ˜AŸH™HŸN™NÓ,×2Ñ2°4Ó8Ô9ÔSVÓSXˆð €EØò 7ˆØ67Ñ3ˆˆs�G˜X w°Ø�-ÑØÜ˜3 	§¡¬c°#«h¸Ó AÓBˆØ�‰�e˜S 7¢=¨b°'°6Ð":¸HºNÈØš 2 t¨Ð,¨b°"ð6õ 	7ð7ñ Ü�œc $›i˜[Ð(SÐTÔUØä	ˆLœ˜U›˜ GÐ
,Ô-à€JØ€FÜ�1”c˜%“j *Ó-ò !ˆØ�a˜˜J™Ð'ˆØŸ
™
ñ #
à(-ô#
ó 
ˆð
  Ô 0Ð1ð 2ð %�oð &(ð)ð 	ð	!Ø×&Ñ& s§z¡z£|Ó4×;Ñ;Ó=ˆGØ˜'˜Ð"5´j°\ÀÔL\ÐK]Ð]^Ð_ˆCÜ—‘˜s¨$¸tÈ$ÐXZÔ[ˆAØ�|‰|˜qÒ Ø!ò ,�DÜ% dÕ+ð,à”c˜%“jÑ ˆFÜ�I˜a ™m¨A™oÐ.¨b´°U³°¸KÈÀxÈqÔQTÐUZÓQ[ÐP\Ð\]Ð^Õ_ð+!ô8 MSÏLÉLËN×[ÁDÀAÀqœ3˜q›6¤=´°Q³¸¸1¹Ó#>Ò?Ó[ò ‰ˆ	�2ðQàQSÐPTÐTVðXð 	ð
	Ü�N‰NØœ
 hÔ/?Ð.@ÀÀ7À)È1Ð$MÐNØ#¨Röðð	Ü�N‰NØ”JØÔ(Ð)Ð)lÐmðoà d°Bô
ˆð
 —‘—‘Ó ˆÜÐ>¸u¸gÀTÐJÕKùói :øðÜ›‹ûðR	!Øò (�Ü! $Õ'ð(à”c˜%“jÑ ‹Füó \øð	ÙûðÙús>   œMÁ0A6M  Ç
B:M2Ê-NË*N ÌAN' Í M/Í2"NÎ N$Î'N+c                 ó’  — dd l }| \  }}}}}}}dt        |«      › dt        |«      › dt        |«      › dt        |«      › dt        |«      › dt        |«      › dt        d«      › d�}		 |j                  |	j                  «       «      j	                  «       }
d|
› dt
        › dt        › d	�}t        j                  |d
d
d¬«       y #  Y y xY w)Nr   ziINSERT OR IGNORE INTO gov_raw (title, page_url, content, publish_date, summary, site_name, tags) VALUES (rm   rM   z);ru   rv   rw   rx   Tr
   )ry   rh   r   )	r{   r>   r‡   rˆ   r‰   r€   r}   r~   r   )r˜   r{   ro   rp   rq   rr   rs   r_   rt   r•   r–   r—   s               r&   r‹   r‹     sÏ   € ÛØÑ€A€qˆ!ˆQ��2�qðä�q“6�(˜!œC ›F˜8 1¤S¨£V H¨A¬c°!«f¨X°Q´s¸1³v°h¸aÄÀBÃ¸yÈÌ#ÈbË'ÈÐRTð	Vð ð
Ø×"Ñ" 3§:¡:£<Ó0×7Ñ7Ó9ˆØ�g�YÐ1´*°¸ZÔHXÐGYÐYZÐ[ˆÜ�‰�s $°tÀRÖHøðÙús   Á'AC ÃCc                  óž   — t        j                  «       } | j                  j                  dt        d   i«       | j                  ddd¬«       | S )Nr   r   rg   F©r   Úverify)ÚrequestsÚSessionÚheadersÚupdateÚREQ_HEADERSrT   )rs   s    r&   Úmake_sessionr¤   '  sD   € Ü×ÑÓ€AØ‡I�I×Ñ�l¤K°Ñ$=Ð>Ô?Ø‡E�EÐ
.¸À5€EÔIØ€Hr(   c           	      ó˜  — t        |«      t        |«      t        t        «      dœ}	 | j                  t        |t        dd¬«      }t        j                  |j                  «      }g }|D ]µ  }|j                  dd«      }|j                  dd«      j                  «       }	|	r|sŒ:|dk(  rŒ@|j                  d	d
«      }
|
r-t        j                  dt        j                  |
dz  «      «      }n|j                  dd«      }|j                  dt        › d|› d|› �|	||dœ«       Œ· |S # t        $ r}t!        d|› d|› d|› �«       Y d}~yd}~ww xY w)u'   è°ƒç”¨APIèŽ·å�–æŒ‡å®šæ �ç›®çš„åˆ—è¡¨é¡µ)Ú	gkPlateIdzpageModel.numberNozpageModel.numberSizerg   F)Údatar¡   r   rž   ÚidrM   r.   Ú
21010yzwakÚ
createDater   z%Y-%m-%diè  ÚreadableCreateDatezhttps://z/gs/detail/z?id=)r/   r.   r1   r¨   u     âš ï¸� APIé”™è¯¯(æ �ç›®õ   ç¬¬u   é¡µ): N)r;   Ú	PAGE_SIZEÚpostÚAPI_URLr£   ÚjsonÚloadsri   rT   r‚   ÚtimeÚstrftimeÚ	localtimer…   ÚDOMAINrU   rE   )ÚsessionÚgk_plate_idÚpage_numr§   r\   rS   Úresultr˜   Úitem_idr.   Útsr1   r`   s                r&   Úfetch_list_pager¼   .  sH  € ô ˜Ó%Ü! (›mÜ #¤I£ñ€Dð
Ø�L‰Lœ t´[È"ÐUZˆLÓ[ˆÜ—
‘
˜1Ÿ6™6Ó"ˆØˆØò 	ˆDØ—h‘h˜t RÓ(ˆGØ—H‘H˜W bÓ)×/Ñ/Ó1ˆEÙ¡ØØ˜,Ò&ØØ—‘˜,¨Ó*ˆBÙÜ—}‘} Z´·±ÀÀTÁ	Ó1JÓK‘à—x‘xÐ 4°bÓ9�Ø�M‰MØ!¤& ¨°[°MÀÀgÀYÐOØØØñ	õ ð	ð$ ˆøÜò ÜÐ)¨+¨°c¸(¸À6È!ÈÐMÔNÜûðús   §C:D" Ä"	E	Ä+EÅE	c                 ór  — | j                  d«      }|dk(  ry| j                  d|«      }|dk(  ry|dz   }d}|}|t        | «      k  rq| ||dz    dk(  r-| j                  d|«      }|dk7  r| |dz
     d	k7  r|dz  }|dz   }n*| ||d
z    dk(  r|dkD  r|dk(  r| || S |dz  }|d
z  }n|dz  }|t        | «      k  rŒqy)Nzid="contentContainer"éÿÿÿÿrM   ú>r   r   r   z<divrP   r   z</div>)ÚfindrW   )ÚhtmlÚidxÚgtÚinner_startÚdepthr’   Úcis          r&   Úextract_content_containerrÇ   Q  sö   € Ø
�)‰)Ð+Ó
,€CØ
ˆb‚yØØ	�‰�3˜Ó	€BØ	ˆR‚xØØ�q‘&€KØ€EØ€AØ
Œc�$‹iŠ-Ø��!�A‘#ˆ;˜&Ò Ø—‘˜3 Ó"ˆBØ�RŠx˜D  A¡™J¨#Ò-Ø˜‘
�Ø�Q‘‰AØ�!�A�a‘Cˆ[˜HÒ$¨¨QªØ˜ŠzØ˜K¨Ð*Ð*Ø�Q‰JˆEØ�‰F‰Aà�‰FˆAð Œc�$‹i‹-ð r(   c           
      óö  — t        |dz   «      D �]Â  }	 | j                  |dd¬«      }|j                  }t        |«      dk  r||k  rt        j                  d«       ŒN y d|v r y d}t        j                  d	|t        j                  «      }|r|j                  d«      j                  «       }|sFt        j                  d
|t        j                  «      }|r|j                  d«      j                  «       }t        |«      }	d}
|	r€t        j                  dd|	t        j                  t        j                  z  ¬«      }	t        j                  dd|	t        j                  t        j                  z  ¬«      }	|	j                  «       }
d}t        j                  d|«      }|r|j                  d«      }g }t        j                  d|
xs |t        j                  «      D ]ˆ  }|j                  d«      j                  «       }|j                  d«      j                  «       }|j                  d«      r|j!                  d|› d|› d�«       Œk|j!                  dt"        › |› d|› d�«       ŒŠ |r|
r|
ddj%                  |«      z   z  }
t        j                  dd|
xs d«      }|r(t        j                  dd|«      j                  «       d d n|}||
xs d||dœc S  y #  ||k  rt        j                  d«       Y �ŒæY  y xY w)Nr   rg   Fr�   r   iô  zexception.cssrM   z<title>(.*?)</title>z3<meta[^>]*name="ArticleTitle"[^>]*content="([^"]+)"z<script[^>]*>.*?</script>)Úflagsz<style[^>]*>.*?</style>u   å�‘è¡¨äºŽ\s*(\d{4}-\d{2}-\d{2})zI<a[^>]*href="([^"]+\.(?:pdf|doc|docx|xls|xlsx|zip|rar))"[^>]*>([^<]+)</a>Úhttpz	<a href="z" target="_blank">z</a>z<a href="https://u&   <br><br><strong>é™„ä»¶ï¼š</strong><br>z<br>z<[^>]+>z\s+ú )r.   r0   r1   r2   )r†   rT   ri   r²   ÚsleeprW   ÚreÚsearchÚDOTALLÚgroupr‚   ÚIrÇ   ÚsubÚfinditerÚ
startswithr…   rµ   r|   )r¶   Ú
detail_urlÚretryÚattemptr\   rÁ   r.   ÚtmÚatmÚcontent_rawr0   r1   ÚdmÚattachesÚamr/   Únamer2   s                     r&   Úfetch_detailrß   k  s´  € Ü˜ ™Ó#ó <
ˆð	Ø—‘˜J°¸5�ÓAˆAØ—6‘6ˆDô ˆt‹9�sŠ?Ø˜ŠÜ—
‘
˜1”ØÙà˜dÑ"ÙàˆÜ�Y‰YÐ.°´b·i±iÓ@ˆÙØ—H‘H˜Q“K×%Ñ%Ó'ˆEÙÜ—)‘)ÐRÐTXÔZ\×Z^ÑZ^Ó_ˆCÙØŸ	™	 !›×*Ñ*Ó,�ä/°Ó5ˆØˆÙÜŸ&™&Ð!=¸rÀ;ÔVX×V_ÑV_Ô`b×`dÑ`dÑVdÔeˆKÜŸ&™&Ð!;¸RÀÔTV×T]ÑT]Ô^`×^bÑ^bÑTbÔcˆKØ!×'Ñ'Ó)ˆGàˆÜ�Y‰YÐ9¸4Ó@ˆÙØ—8‘8˜A“;ˆDàˆÜ—+‘+ÐjØ&š¨$´·±ó6ò 	_ˆBà—(‘(˜1“+×#Ñ#Ó%ˆCØ—8‘8˜A“;×$Ñ$Ó&ˆDØ�~‰~˜fÔ%Ø—‘ )¨C¨5Ð0BÀ4À&ÈÐ MÕNà—‘Ð"3´F°8¸C¸5Ð@RÐSWÐRXÐX\Ð ]Õ^ð	_ñ ™ØÐ?À&Ç+Á+ÈhÓBWÑWÑWˆGä—&‘&˜ R¨ª°BÓ7ˆÙ@G”"—&‘&˜  gÓ.×4Ñ4Ó6°t¸Ñ<ÈUˆð Ø’} "ØØñ	
ò 	
ðo<
ð| øðu	Ø˜ŠÜ—
‘
˜1”ÚÚús   ” KËK8c           
      ó&  — t        j                  t        d¬«      }|j                  d|d   f«      j	                  «       }|j                  «        |ryt        d|d   d d › d	�d
d¬«       t        | |d   «      }|€t        d«       t        dxx   dz  cc<   yt        |d   xs |d   |d   |d   |j                  d«      xs |j                  dd
«      |d   t        |«      «       t        |j                  dd
«      «      }t        d|› d�«       y)Nr   r   z'SELECT 1 FROM crawl_results WHERE url=?r/   Fu     ðŸ“„ r.   é(   z...rM   T)ÚendÚflushu    âœ— è¯¦æƒ…å¤±è´¥r   r   r0   r1   r2   u    âœ… ÚB)r   r   r    r!   rV   r#   rE   rß   r-   r4   rT   r;   rW   )r¶   r˜   r3   r%   rB   ÚdetailÚclens          r&   Úprocess_itemrç   ­  s  € Ü�?‰?œ7¨BÔ/€DØ�\‰\ÐCÀdÈ5ÁkÀ^ÓT×]Ñ]Ó_€FØ‡J�J„LÙØä	ˆG�D˜‘M # 2Ð&Ð' sÐ
+°¸4Õ@Ü˜' 4¨¡;Ó/€Fà€~ÜÐ!Ô"Üˆh‹˜1Ñ‹ØäØˆw‰Ò(˜4 ™=ØˆU‰ØˆyÑØ�
‰
�6ÓÒ2˜dŸh™h v¨rÓ2ØˆyÑÜˆH‹ôô ˆv�z‰z˜) RÓ(Ó)€DÜ	ˆE�$��qˆ/ÔØr(   c                 óŒ  — t        dd› �«       t        d|› d|› d|› d�«       t        d› «       d}t        dt        |t        xs |«      dz   «      D ]Î  }t	        | ||«      }|€t        d	|› d
|› d�«        n«|st        d|› d�«        n˜t        d|› dt        |«      › d�«       |D ]D  }t        | ||«      r|dz  }t        j                  dt        t        |d   «      «      dz  z   «       ŒF ||k  sŒ£d|dz  z   }t        d|› d�«       t        j                  |«       ŒÐ t        d|› d|› �«       |dkD  r
t        «        |S )u   çˆ¬å�–æŒ‡å®šæ �ç›®rj   ú2==================================================u   ðŸ“‚ æ �ç›®rz   u    (å…±u   é¡µ)r   r   u     â�Œ æ �ç›®r¬   u   é¡µAPIå¤±è´¥ï¼Œè·³è¿‡è¯¥æ �ç›®u
     ðŸ“­ ç¬¬u   é¡µä¸ºç©ºï¼Œç»“æ�Ÿu   ðŸ“ƒ ç¬¬u   é¡µ (rQ   r/   r   r   r   u     â�³ ç­‰å¾…zs...u     âœ… æ �ç›®u   å®Œæˆ�: æ–°å¢ž)rE   r†   ÚminÚ_MAX_PGr¼   rW   rç   r²   rÌ   ÚabsÚhashrJ   )	r¶   r·   r7   Ú	max_pagesÚ	total_newr¸   rS   r˜   Ú
page_delays	            r&   Úcrawl_platerñ   Ê  sm  € ä	ˆBˆvˆhˆ-ÔÜ	ˆK˜�} B { m°5¸¸À4Ð
HÔIÜ	ˆVˆHÔà€IÜ˜!œS ¬GÒ,@°yÓAÀ!ÑCÓDò #ˆÜ ¨°hÓ?ˆØˆ=Ü�L  ¨S°°
Ð:XÐYÔZÙÙÜ�J˜x˜jÐ(:Ð;Ô<Ùä�˜˜
 %¬¨E«
 |°4Ð8Ô9Øò 	7ˆDÜ˜G T¨;Ô7Ø˜Q‘�	ä�J‰J�qœ3œt D¨¡KÓ0Ó1°AÑ5Ñ5Õ6ð		7ð �iÓØ˜h¨™lÑ+ˆJÜ�L  ¨DÐ1Ô2Ü�J‰J�zÕ"ð)#ô, 
ˆL˜˜ ^°I°;Ð
?Ô@ð �1‚}ÜÔàÐr(   c                  óè  — dd l } | j                  «       }|j                  ddd¬«       |j                  ddd¬«       |j                  dt        dd	¬
«       |j                  dt        dd¬
«       |j                  dt        dd¬
«       |j	                  «       }t        «        t        «        |j                  rt        «        y t        j                  «       }t        «       }g }|j                  dkD  rx|j                  t        v r8t        |j                     \  }}}|j                  r|n|}	|j                  ||	fg}n§t        d|j                  › �«       t        j                   d«       ny|j                  rt        d   \  }}
}d||fg}nYt        j#                  «       D ]B  \  }\  }}}
|j$                  dkD  rt'        ||j$                  «      }|j)                  |||f«       ŒD d}|D ]  \  }}}	|t+        ||||	«      z  }Œ t        j                  «       |z
  }t        dd› �«       t        dt,        d   › dt,        d   › dt,        d   › dt/        |«      › d�	«       t        d|d›d|dz  d›d �«       y )!Nr   z--fullÚ
store_trueu   å…¨é‡�(ä»…æ �ç›®1))ÚactionÚhelpz--syncu	   ä»…å�Œæ­¥z--testu
   æµ‹è¯•Næ�¡)ÚtypeÚdefaultrõ   z--plateu   å�ªçˆ¬æŒ‡å®šæ �ç›®IDz--pagesu   é™�åˆ¶æ¯�æ �ç›®æœ€å¤§é¡µæ•°u   â�Œ æœªçŸ¥æ �ç›®ID: r   rj   ré   u   ðŸ�� æ€»è®¡: æ–°å¢žr   u    è·³è¿‡r   u    é”™è¯¯r   u    (æ �ç›®æ•°rn   u   â�±ï¸� z.0fzs (r   z.1fzmin))ÚargparseÚArgumentParserÚadd_argumentÚintÚ
parse_argsr'   r*   ÚsyncrJ   r²   r¤   ÚplaterR   ÚfullrE   ÚsysÚexitrS   Úpagesrê   r…   rñ   r-   rW   )rø   ÚparserÚargsÚ
start_timer¶   Úplates_to_crawlÚlabelÚ	inc_pagesÚ
full_pagesÚmprt   r^   rï   Úelapseds                 r&   Úmainr  ð  sT  € ÛØ×$Ñ$Ó&€FØ
×Ñ˜¨Ð<PÐÔQØ
×Ñ˜¨¸KÐÔHØ
×Ñ˜¤s°A¸LÐÔIØ
×Ñ˜	¬°QÐ=SÐÔTØ
×Ñ˜	¬°QÐ=ZÐÔ[Ø×ÑÓ€Dä„IÜÔà‡y‚yÜÔØä—‘“€JÜ‹n€Gà€OØ‡z�z�A‚~Ø�:‰:œÑÜ+1°$·*±*Ñ+=Ñ(ˆE�9˜jØ#Ÿyšy‘¨iˆBØ $§
¡
¨E°2Ð6Ð7‰OäÐ(¨¯©¨Ð5Ô6Ü�H‰H�Q�KØ	�Šä% a™yÑˆˆq�*Ø˜u jÐ1Ð2‰ä*0¯,©,«.ò 	<Ñ&ˆCÑ&�%˜ AØ�z‰z˜AŠ~Ü 	¨4¯:©:Ó6�	Ø×"Ñ" C¨°	Ð#:Õ;ð	<ð
 €IØ)ò :‰ˆˆU�BØ”[ ¨#¨u°bÓ9Ñ9‰	ð:ô �i‰i‹k˜JÑ&€GÜ	ˆBˆvˆhˆ-ÔÜ	Ð¤ e¡˜~¨W´U¸6±]°OÀ7Ì5ÐQYÉ?ÐJ[Ð[fÔgjÐkzÓg{Ðf|Ð|}Ð
~ÔÜ	ˆG�G˜C�=  G¨B¡J¨sÐ#3°4Ð
8Õ9r(   Ú__main__)Ú1)r   )4Ú__doc__r@   rÍ   r   r²   r°   r   r~   rŸ   ÚwarningsÚ_SYSrW   ÚargvÚisdigitrû   rë   rE   r;   ÚfilterwarningsrA   ÚdirnameÚabspathÚ__file__ÚBASE_DIRr|   r    rµ   r€   r}   r¯   r£   r­   rR   r-   r'   r*   r4   r8   r>   rC   rJ   rG   rH   r‹   r¤   r¼   rÇ   rß   rç   rñ   r  Ú__name__r6   r(   r&   ú<module>r     s€  ðñ÷0 4× 3× 3Ó 3Û Û Û Ù" 4§9¡9›~°Ò1°d·i±iÀ±l×6JÑ6JÔ6L‰#ˆd�i‰i˜‰lÔ
ÐRV€Ø
ÐÙ	Ð
¡# g£,Ñ
.Ô/à €× Ñ ˜Ô !à�7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø
�'‰'�,‰,�xÐ!6Ó
7€Ø	€Ø €
Ø$Ð à
5€àoØ(Ø3Ø7ñ	€ð €	ð 	#Ø!Ø!Ø!Ø!Ø!Ø ñ
€ð ˜1¨Ñ*€òò$óò(&ò1ò
-òò(%XòPYòxò ò òFó4?òDò:#òL.:ðb ˆzÒÙ…Fð r(   