Ë
    CE•j3g  ã                   óÞ  — 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ddlZddlm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dZ  ejB                  «       Z"dddddœZ#dMd„Z$d„ Z%d„ Z&d„ Z'd„ Z(d„ Z)d„ Z*ddl+Z+ddl,Z, e+jZ                  «       Z.da/d„ Z0d„ Z1d„ Z2d„ Z3d „ Z4d!„ Z5d"„ Z6d#„ Z7d$„ Z8d%„ Z9dNd&„Z:dOd(„Z;d)„ Z<e=d*k(  �rÕddl>Z> e>j~                  d+¬,«      Z@e@jƒ                  d-d.d/¬0«       e@jƒ                  d1eBd2d3¬4«       e@jƒ                  d5eBd'd6¬4«       e@jƒ                  d7d.d8¬0«       e@jƒ                  d9d.d:¬0«       e@jƒ                  d;d.d<¬0«       e@j‡                  «       ZDeDjŠ                  r e9«         ejŒ                  d«        e*«        eDjŽ                  r% e<«       ZHeHdkD  r e9«         ejŒ                  d«       eDj’                  reneDj”                  ZJeDj–                   ZL eMd=d>› �«        eMd?eDj’                  rd@ndAeJ› dB�› �«        eMd>› «        eMdCeDj’                  rd@ndD› �«        eMdEeJ› dFeDjœ                  › dG�«        eMdHeLrdIndJ› �«        eMd>› «        e;eJeDjœ                  eL¬K«      ZOeOdkD  r e9«         eMd=d>› �«        eMdL«       yy)Pu©  
EIAFans (çŽ¯è¯„çˆ±å¥½è€…) çˆ¬è™« â€” Discuz! X3.4 è®ºå�›
====================
å…¨é‡�/å¢žé‡�ä¸¤ç§�æ¨¡å¼�ï¼š
  python3 crawl_eiafans.py              # å¢žé‡�ï¼ˆé»˜è®¤ï¼šå�ªçˆ¬æœ€æ–°10é¡µï¼‰
  python3 crawl_eiafans.py --full       # å…¨é‡�ï¼š2078é¡µ
  python3 crawl_eiafans.py --pages=50   # æŒ‡å®šé¡µæ•°
  python3 crawl_eiafans.py --sync       # å�Œæ­¥å·²æœ‰æ•°æ�®åˆ°æœ�åŠ¡å™¨
  python3 crawl_eiafans.py --refetch    # é‡�æŠ“å­˜é‡�è¯¦æƒ…é¡µï¼ˆä¿®å¤�æ ‡é¢˜çœ�ç•¥å�·+æ­£æ–‡å� ä½�ç¬¦ï¼‰

âš ï¸� 2026-08-31 é‡�å¤§æ›´æ–°ï¼šè¯¦æƒ…é¡µ JS å��çˆ¬å·²å¤±æ•ˆï¼ˆå®žæµ‹å�¯æŠ“æ­£æ–‡ï¼‰
   - æ­£æ–‡ï¼šä»Žè¯¦æƒ…é¡µ <td class="t_f"> æ��å�–ï¼Œä¿�ç•™ <p> æ®µè�½ç»“æž„ + é™„ä»¶è½¬ <a href>
   - æ ‡é¢˜ï¼šåˆ—è¡¨é¡µæ ‡é¢˜è¢« Discuz æœ�åŠ¡ç«¯æˆªæ–­ï¼ˆå¸¦ ...ï¼‰ï¼Œä»Žæ­£æ–‡é¦–æ®µã€Šã€‹é‡�å»ºå®Œæ•´æ ‡é¢˜
   - å…œåº•ï¼šè¯¦æƒ…é¡µ 404/æ¸¸å®¢æ— æ�ƒé™�/å��çˆ¬ â†’ ä¿�ç•™å� ä½�ç¬¦+åˆ—è¡¨é¡µæ ‡é¢˜

æ•°æ�®æµ�ï¼šæœ¬åœ° quality_results.db â†’ SSH â†’ æœ�åŠ¡å™¨ search.db
é    N)Údatetime)Úurljoin)Úunescapezquality_results.dbzroot@1.94.217.116z/root/quality_results.dbú/root/search.dbzhttp://www.eiafans.comz+http://www.eiafans.com/forum-64-{page}.htmli  uy   âš ï¸� è¯¥æ•°æ�®æ�¥è‡ªçŽ¯è¯„çˆ±å¥½è€…è®ºå�›ï¼Œè¯¦æƒ…é¡µæœ‰å��çˆ¬ä¿�æŠ¤ï¼Œè¯·ç‚¹å‡»é“¾æŽ¥è·³è½¬åŽŸç«™æŸ¥çœ‹æ­£æ–‡å†…å®¹ã€‚uA   çŽ¯è¯„çˆ±å¥½è€…è®ºå�›å…¬ç¤ºä¿¡æ�¯ â€” è¯¦æƒ…è¯·è·³è½¬åŽŸç«™æŸ¥çœ‹z[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36z&http://www.eiafans.com/forum-64-1.htmlz?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8)z
User-AgentÚRefererÚAcceptzAccept-Languagec                 óJ  — t         j                  j                  | t        ¬«      }	 t         j                  j	                  ||t
        ¬«      }|j                  «       }|j                  dd¬«      }||j                  «       fS # t        $ r}dt        |«      fcY d}~S d}~ww xY w)u0   è¿”å›ž (text, final_url) â€” GBK è‡ªåŠ¨è½¬ UTF-8)Úheaders)ÚtimeoutÚcontextÚgbkÚreplace)ÚerrorsN)ÚurllibÚrequestÚRequestÚHEADERSÚurlopenÚCTXÚreadÚdecodeÚgeturlÚ	ExceptionÚstr)Úurlr   ÚreqÚrespÚrawÚtextÚes          ú"/root/gov_crawler/crawl_eiafans.pyÚhttp_getr"   1   s‡   € ä
�.‰.×
 Ñ
  ¬gÐ
 Ó
6€CðÜ�~‰~×%Ñ% c°7ÄCÐ%ÓHˆØ�i‰i‹kˆØ�z‰z˜%¨	ˆzÓ2ˆØ�T—[‘[“]Ð"Ð"øÜò Ø”S˜“Vˆ|Õûðús   §AB Â	B"ÂBÂB"ÂB"c                 ó2  — g }t        «       }t        j                  d| t        j                  «      D �]a  }|j	                  d«      }|j	                  d«      }||v rŒ+|j                  |«       t        j                  d|t        j                  «      }|sŒdt        j                  dd|j	                  d«      «      j                  «       }|rt        |«      dk  rŒ©t        j                  d|«      }|rt        t        |j	                  d«      «      nt        › d	|› d
�}	d}
t        j                  d|«      }|r|j	                  d«      }
|
s)t        j                  d|«      }|r|j	                  d«      }
|j                  |t        › d	|› d
�||
dœ«       �Œd |S )uE   ä»Ž Discuz! åˆ—è¡¨é¡µè§£æž�æ‰€æœ‰å¸–å­�ï¼Œæ��å�–æ ‡é¢˜ã€�URLã€�æ—¥æœŸz5<tbody[^>]*id="normalthread_(\d+)"[^>]*>(.*?)</tbody>é   é   zclass="s xst"[^>]*>(.*?)</a>ú<[^>]+>Ú é   zhref="(thread-\d+-1-\d+\.html)"ú/thread-ú	-1-1.htmlz.<em[^>]*>\s*<a[^>]*>\s*(\d{4}-\d{1,2}-\d{1,2})z%(\d{4}-\d{1,2}-\d{1,2})\s+\d{2}:\d{2})Útidr   ÚtitleÚdate)ÚsetÚreÚfinditerÚDOTALLÚgroupÚaddÚsearchÚsubÚstripÚlenr   ÚBASE_URLÚappend)ÚhtmlÚthreadsÚ	seen_tidsÚmr+   ÚblockÚtitle_mr,   Úurl_mÚ
thread_urlr-   Údate_ms               r!   Úparse_list_pagerC   =   sw  € à€GÜ“€Iô �[‰[Ø@ØŒb�i‰ióó (ˆð �g‰g�a‹jˆØ—‘˜“
ˆà�)ÑØØ�‰�cÔô —)‘)Ð;¸UÄBÇIÁIÓNˆÙØÜ—‘�z 2 w§}¡}°QÓ'7Ó8×>Ñ>Ó@ˆÙœ˜E›
 QšØô —	‘	Ð<¸eÓDˆÙ:?”WœX u§{¡{°1£~Ô6ÌÀzÐQYÐZ]ÐY^Ð^gÐEhˆ
ð ˆÜ—‘ÐLÈeÓTˆÙØ—<‘< “?ˆDñ Ü—Y‘YÐGÈÓOˆFÙØ—|‘| A“�à�‰ØÜ�Z˜x¨ u¨IÐ6ØØñ	
ö 	ðG(ðT €Nó    c                 ón  — d| v rd| v rydD ]  }|| v sŒ y t        j                  d| t         j                  «      }|r|j                  d«      nd}|s:t        j                  d| t         j                  «      }|r|j                  d«      nd}|syd}t        j                  d	| «      }|r|j                  d«      }d}t        j                  d
| t         j                  «      }|rzt        j                  ddt        j                  dd|j                  d«      «      «      j                  «       }t        j                  dd|«      }|rt        j                  d|«      s|}|s—t        j                  d|t         j                  «      }	|	D ]m  }
t        j                  ddt        j                  dd|
«      «      }t        j                  d|«      rt        |«      dk  rŒTt        |«      t        |«      kD  sŒl|}Œo |sÃt        j                  dd|«      }t        j                  dd|«      j                  «       }t        j                  d|«      }|r |j                  d«      j                  «       }nOt        j                  d|«      }|r7|j                  d«      j                  «       }t        j                  d|«      r|}|�shd}t        j                  d|t         j                  «      }|rLt        j                  dd|j                  d«      «      }t        j                  dd|«      j                  «       }nPt        j                  dd|«      }t        j                  dd|«      j                  «       }|j                  d«      d   }t        j                  d|«      }|r.t        |j                  d«      «      dk\  r|j                  d«      }t        j                  d|«      }|rE|j                  d«      j                  «       }t        j                  d|«      rt        |«      dk\  r|}t        |«      }|||fS )u—   
    ä»Žè¯¦æƒ…é¡µæ��å�– (å®Œæ•´æ ‡é¢˜, æ­£æ–‡HTML, å�‘å¸ƒæ—¥æœŸ)
    è¿”å›ž None è¡¨ç¤ºè¯¦æƒ…é¡µä¸�å�¯ç”¨ï¼ˆ404/æ¸¸å®¢æ— æ�ƒé™�/å��çˆ¬challengeï¼‰
    ÚKa7z
return Ka7N)u   æ— æ³•è¿›è¡Œæ­¤æ“�ä½œu   æŒ‡å®šçš„ä¸»é¢˜ä¸�å­˜åœ¨u   å·²è¢«åˆ é™¤z=<td class="t_f"[^>]*>(.*?)(<div id="p_btn"|<div class="psth")r$   r'   z<td class="t_f"[^>]*>(.*?)</td>u;   authorposton\d*[^>]*>\s*å�‘è¡¨äºŽ\s*(\d{4}-\d{1,2}-\d{1,2})z id="thread_subject"[^>]*>(.*?)</z\s+r&   z^\[[^\]]+\]\s*u   \.\.\.$|â€¦$u   ã€Š(.{10,200}?)ã€‹uI   (æ�¡ä¾‹|åŠžæ³•|è§„å®š|å†³å®š|å…¬å‘Š|å®žæ–½ç»†åˆ™|å¯¼åˆ™|æ ‡å‡†(ï¼ˆ|\(|$))é#   ú u7   é¡¹ç›®å��ç§°[ï¼š:]\s*ã€Š?([^ã€Šã€‹\nï¼Œã€‚,]{8,80})ã€‹?uG   ^([^ã€‚\n]{8,90}?)(?:ä½�äºŽ|åœ°å¤„|å��è�½|å»ºè®¾åœ°ç‚¹[ï¼š:]|ï¼Œä½�äºŽ)u/   (é¡¹ç›®|åœ°å�—|å…¬å�¸|åŽ‚|å·¥ç¨‹|æŠ¥å‘Š|å…¬ç¤º)z!<(?:p|div)[^>]*>(.*?)</(?:p|div)>u   ã€‚r   uC   ^(?:æ ¹æ�®|æŒ‰ç…§|ä¾�æ�®|ä¾�ç…§|é�µç…§)[^ï¼Œã€‚]{0,60}[ï¼Œã€‚]?(.*)é
   u(   ^(.{8,120}?)(?:[ï¼Œ,ã€‚]|è¯¦è§�é™„ä»¶|$)u=   (é¡¹ç›®|åœ°å�—|å…¬å�¸|åŽ‚|å·¥ç¨‹|æŠ¥å‘Š|å…¬ç¤º|ç›‘æµ‹|éªŒæ”¶)é   )r/   r4   r1   r2   r5   r6   Úfindallr7   ÚsplitÚmatchÚclean_body_html)r:   Úkwr=   Ú	body_htmlr-   ÚdmÚ
full_titleÚtsÚtstÚbooksÚbÚcleanr   Úm1Úm2ÚcandÚ
first_paraÚpmÚfmÚemÚcleaneds                        r!   Úparse_detail_pager`   q   s�  € ð ��}˜¨Ñ-ØàSò ˆØ�Š:Ùðô
 	�	‰	ÐRÐTXÔZ\×ZcÑZcÓd€AÙ�—‘˜”
 R€IÙä�I‰IÐ8¸$ÄÇ	Á	ÓJˆÙ"#�A—G‘G˜A”J¨ˆ	ÙØð €DÜ	�‰ÐQÐSWÓ	X€BÙ	Ø�x‰x˜‹{ˆð €JÜ	�‰Ð6¸¼b¿i¹iÓ	H€BÙ	Ü�f‰f�V˜R¤§¡¨
°B¸¿¹À»Ó!DÓE×KÑKÓMˆä�f‰fÐ&¨¨CÓ0ˆÙ”r—y‘y °#Ô6ØˆJáä—
‘
Ð0°)¼R¿Y¹YÓGˆØò 	#ˆAÜ—F‘F˜6 2¤r§v¡v¨j¸"¸aÓ'@ÓAˆEä�y‰yÐeÐglÔmÔruÐv{Ór|ð  @Bò  sBØä�5‹zœC 
›OÓ+Ø"‘
ð	#ñ ä�v‰v�j # yÓ1ˆÜ�v‰v�f˜c 4Ó(×.Ñ.Ó0ˆÜ�Y‰YÐQÐSWÓXˆÙØŸ™ !›×*Ñ*Ó,‰Jô —‘ÐeÐgkÓlˆBÙØ—x‘x “{×(Ñ(Ó*�ä—9‘9ÐOÐQUÔVØ!%�Jâð ˆ
Ü�Y‰YÐ;¸YÌÏ	É	ÓRˆÙÜŸ™ 
¨B°·±¸³Ó<ˆJÜŸ™ ¨¨JÓ7×=Ñ=Ó?‰Jô Ÿ™ 
¨C°Ó;ˆJÜŸ™ ¨¨JÓ7×=Ñ=Ó?ˆJØ#×)Ñ)¨%Ó0°Ñ3ˆJä�Y‰YÐ]Ð_iÓjˆÙ”#�b—h‘h˜q“kÓ" bÒ(ØŸ™ !›ˆJä�X‰XÐAÀ:ÓNˆÙØ—8‘8˜A“;×$Ñ$Ó&ˆDÜ�y‰yÐYÐ[_Ô`ÔehÐimÓenÐrtÒetØ!�
ô ˜iÓ(€Gà�w Ð$Ð$rD   c                 ó–  — t        j                  dd| «      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd|«      }t        j                  dd	|«      }t        j                  d
d|«      }t        j                  dd|«      }t        j                  dd	|«      }|j                  «       }|S )u  
    æ¸…ç�†è¯¦æƒ…é¡µæ­£æ–‡ HTMLï¼š
    - <div align="left"> â†’ <p>ï¼ˆä¿�ç•™æ®µè�½ç»“æž„ï¼Œå‹¿æ‹�å¹³ï¼‰
    - <font face="..."> å‰¥æŽ‰æ ‡ç­¾ä¿�ç•™æ–‡å­—
    - æ¸…ç�†ç©º divã€�å¤šä½™ç©ºç™½
    - é™„ä»¶åŒºåœ¨æ­£æ–‡å¤–ï¼ˆpattlï¼‰ï¼Œç”±è°ƒç”¨æ–¹å�•ç‹¬å¤„ç�†
    z<div[^>]*align="left"[^>]*>z<p>z
<div[^>]*>z</div>z</p>z</?font[^>]*>r'   z	<br\s*/?>ú
z
<p>\s*</p>z[ \t]+rH   z\n\s*\n+)r/   r5   r6   )rP   r:   s     r!   rN   rN   Ò   s¦   € ô �6‰6Ð0°%¸ÓC€DÜ�6‰6�- ¨Ó-€DÜ�6‰6�)˜V TÓ*€Dä�6‰6Ð" B¨Ó-€Dä�6‰6�,  dÓ+€Dä�6‰6�-  TÓ*€Dä�6‰6�)˜S $Ó'€DÜ�6‰6�+˜t TÓ*€DØ�:‰:‹<€DØ€KrD   c                 óF  — g }t        j                  d| t         j                  «      D ]v  }|j                  d«      j	                  dd«      }t        j
                  dd|j                  d«      «      j                  «       }|sŒ[|j                  |t        › d|› �f«       Œx |S )	u®   
    ä»Žè¯¦æƒ…é¡µæ��å�–é™„ä»¶åˆ—è¡¨ï¼š[(é™„ä»¶å��, å®Œæ•´ä¸‹è½½URL)]
    é™„ä»¶åœ¨ <div class="pattl"> â†’ <ignore_js_op> â†’ <a href="forum.php?mod=attachment&aid=...">
    z:<a href="(forum\.php\?mod=attachment[^"]+)"[^>]*>(.*?)</a>r$   z&amp;ú&r&   r'   r%   ú/)	r/   r0   r1   r2   r   r5   r6   r9   r8   )r:   Úattsr=   r   Únames        r!   Úextract_attachmentsrh   ê   s’   € ð
 €DÜ�[‰[ØEØŒb�i‰ióò 5ˆð �g‰g�a‹j× Ñ  ¨#Ó.ˆÜ�v‰v�j " a§g¡g¨a£jÓ1×7Ñ7Ó9ˆÚØ�K‰K˜¤( ¨1¨S¨EÐ2Ð3Õ4ð5ð €KrD   c                 óŠ   — t         › d| › d�}t        |d¬«      \  }}|syt        |«      }|sy|\  }}}t        |«      }||||fS )ub   
    æŠ“å�–è¯¦æƒ…é¡µ â†’ (å®Œæ•´æ ‡é¢˜, æ­£æ–‡HTML, é™„ä»¶HTML, æ—¥æœŸ)
    å¤±è´¥è¿”å›ž None
    r)   r*   é   )r   N)r8   r"   r`   rh   )	r+   r   r:   Ú_ÚparsedrR   Ú
body_cleanr-   rf   s	            r!   Úfetch_detailrn   ú   sa   € ô
 ˆJ�h˜s˜e 9Ð
-€CÜ�s BÔ'�G€Dˆ!ÙØÜ˜tÓ$€FÙØØ#)Ñ €J�
˜DÜ˜tÓ$€DØ�z 4¨Ð-Ð-rD   c                  óÜ   — t        j                  t        «      } | j                  d«       | j                  d«       | j	                  d«       | j                  «        | j                  «        y )NúPRAGMA journal_mode=WALzPRAGMA synchronous=NORMALap  
        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'))
        );
        CREATE TABLE IF NOT EXISTS eiafans_threads (
            tid TEXT PRIMARY KEY,
            title TEXT,
            url TEXT,
            publish_date TEXT,
            crawled_at TEXT DEFAULT (datetime('now','localtime'))
        );
    )Úsqlite3ÚconnectÚ
QUALITY_DBÚexecuteÚexecutescriptÚcommitÚclose)Úconns    r!   Úinit_dbry     sQ   € Ü�?‰?œ:Ó&€DØ‡L�LÐ*Ô+Ø‡L�LÐ,Ô-Ø×Ñð ô 	ð( 	‡K�K„MØ‡J�J…LrD   Fc                  óÂ   — 	 t         j                  «       } | €y | \  }}}	  ||i |¤Ž t         j	                  «        Œ;# t        $ r}t        d|› �«       Y d }~Œ1d }~ww xY w)Nu       â�Œ DBå†™å…¥é”™è¯¯: )Ú_write_queueÚgetr   ÚprintÚ	task_done)ÚtaskÚfuncÚargsÚkwargsr    s        r!   Ú_write_workerrƒ   +  sq   € Ø
Ü×ÑÓ!ˆØˆ<ØØ!Ñˆˆd�Fð	2Ù�$Ð!˜&Ò!ô 	×ÑÔ ð øô ò 	2ÜÐ,¨Q¨CÐ0×1Ñ1ûð	2ús    = ½	AÁAÁAc                  ól   — t         s.t        j                  t        d¬«      } | j	                  «        da y y )NT)ÚtargetÚdaemon)Ú_write_thread_startedÚ	threadingÚThreadrƒ   Ústart)Úts    r!   Ú_ensure_write_threadrŒ   7  s+   € å Ü×Ñ¤M¸$Ô?ˆØ	�‰Œ	Ø $Ñð !rD   c                 ó|  — t        j                  t        «      }|j                  d«       	 |j                  d|f«       |j                  d| ||||xs d|xs d|xs df«       |j	                  «        |j                  «        y # t
        $ r}t        d|› �«       Y d }~Œ-d }~ww xY w# |j                  «        w xY w)Nrp   z'DELETE FROM quality_results WHERE url=?zrINSERT INTO quality_results (site_name, domain, title, url, content, publish_date, summary) VALUES (?,?,?,?,?,?,?)r'   õ       â�Œ DB: ©rq   rr   rs   rt   rv   r   r}   rw   )	rg   Údomainr,   r   Úcontentr-   Úsummaryrx   r    s	            r!   Ú_db_save_qualityr“   >  s©   € Ü�?‰?œ:Ó&€DØ‡L�LÐ*Ô+ð
Ø�‰Ð>ÀÀÔGØ�‰ð AØ�6˜5 # w¢}°"°d²j¸bÀ'Â-ÈRÐPô	
ð 	�‰Œð 	�
‰
�øô ò "Ü�˜Q˜CÐ ×!Ñ!ûð"ûð 	�
‰
�ús*   ¬AB Â	B&ÂB!ÂB) Â!B&Â&B) Â)B;c                 ó8  — t        j                  t        «      }|j                  d«       	 |j                  d| |||f«       |j	                  «        |j                  «        y # t
        $ r}t        d|› �«       Y d }~Œ-d }~ww xY w# |j                  «        w xY w)Nrp   zVINSERT OR IGNORE INTO eiafans_threads (tid, title, url, publish_date) VALUES (?,?,?,?)rŽ   r�   ©r+   r,   r   r-   rx   r    s         r!   Ú_db_mark_threadr–   M  sƒ   € Ü�?‰?œ:Ó&€DØ‡L�LÐ*Ô+ð	Ø�‰ØdØ�%˜˜dÐ#ô	
ð 	�‰Œð 	�
‰
�øô ò "Ü�˜Q˜CÐ ×!Ñ!ûð"ûð 	�
‰
�úó)   ¬&A# Á#	BÁ,A?Á:B Á?BÂB ÂBc                 ó8  — t        j                  t        «      }|j                  d«       	 |j                  d|||| f«       |j	                  «        |j                  «        y # t
        $ r}t        d|› �«       Y d }~Œ-d }~ww xY w# |j                  «        w xY w)Nrp   zEUPDATE eiafans_threads SET title=?, url=?, publish_date=? WHERE tid=?rŽ   r�   r•   s         r!   Ú_db_update_threadr™   [  sƒ   € Ü�?‰?œ:Ó&€DØ‡L�LÐ*Ô+ð	Ø�‰ØSØ�C˜˜sÐ#ô	
ð 	�‰Œð 	�
‰
�øô ò "Ü�˜Q˜CÐ ×!Ñ!ûð"ûð 	�
‰
�úr—   c                 óì   — t        j                  t        «      }	 |j                  d«       |j                  d| f«      j	                  «       }|d u|j                  «        S # |j                  «        w xY w)Nrp   z)SELECT 1 FROM eiafans_threads WHERE tid=?)rq   rr   rs   rt   Úfetchonerw   )r+   rx   Úrs      r!   Úis_thread_crawledr�   i  sX   € Ü�?‰?œ:Ó&€DðØ�‰Ð.Ô/Ø�L‰LÐDÀsÀfÓM×VÑVÓXˆØ˜ˆ}à�
‰
�øˆ�
‰
�ús   ›5A! Á!A3c                 óX   — t        «        t        j                  t        | |||fi f«       y ©N)rŒ   r{   Úputr–   ©r+   r,   r   r-   s       r!   Úmark_thread_crawledr¢   r  s&   € ÜÔÜ×Ñ”o¨¨U°C¸Ð'>ÀÐCÕDrD   c                 óX   — t        «        t        j                  t        | |||fi f«       y rŸ   )rŒ   r{   r    r™   r¡   s       r!   Úupdate_threadr¤   v  s'   € ÜÔÜ×ÑÔ'¨#¨u°c¸4Ð)@À"ÐEÕFrD   c           
      ó^   — t        «        t        j                  t        | ||||||fi f«       y rŸ   )rŒ   r{   r    r“   )rg   r�   r,   r   r‘   r-   r’   s          r!   Úsave_to_qualityr¦   z  s/   € ÜÔÜ×ÑÔ&¨¨v°u¸cÀ7ÈDÐRYÐ(ZÐ\^Ð_Õ`rD   c                  óÈ  — t        d«       t        j                  t        «      } | j	                  d«      j                  «       }| j                  «        |st        d«       yt        j                  d«      }|j	                  d«       d}d}d}|D ]’  }|\  }}}	}
}	 |j	                  d	||f«      j                  «       }|r2|j	                  d
||	xs ddd |
xs d|xs ddd |d   f«       |dz  }n1|j	                  d|||	xs ddd |
xs d|xs ddd |ddf«       |dz  }Œ” |dkD  s|dkD  rF|j                  «        |j	                  d|f«       |j	                  d|f«       |j                  «        |j	                  d|f«      j                  «       d   }|j                  «        t        d|› d|› d|› d�«       y# t        $ r}t        d|› �«       Y d}~�ŒLd}~ww xY w)u@   å°†æœ¬åœ°æ•°æ�®ç›´æŽ¥å†™å…¥ search.dbï¼ˆæœ�åŠ¡å™¨æœ¬åœ°æ¨¡å¼�ï¼‰u   
ðŸ“¤ å�Œæ­¥åˆ° search.db...zqSELECT title, url, content, publish_date, summary FROM quality_results WHERE domain='www.eiafans.com' ORDER BY idu     æœ¬åœ°æ²¡æœ‰æ•°æ�®Nr   rp   Úeiafansr   z7SELECT id FROM gov_raw WHERE page_url=? AND site_name=?zKUPDATE gov_raw SET title=?, content=?, publish_date=?, summary=? WHERE id=?r'   i ¡ i,  r$   zyINSERT INTO gov_raw (title, page_url, content, publish_date, summary, site_name, tags, industry) VALUES (?,?,?,?,?,?,?,?)u   çŽ¯ä¿�z	  Error: z(DELETE FROM gov_search WHERE site_name=?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.site_name=?z.SELECT COUNT(*) FROM gov_raw WHERE site_name=?u     OK æ–°å¢žu   /æ›´æ–°u    æ�¡å�Œæ­¥åˆ° search.db (DBå…±u   æ�¡))
r}   rq   rr   rs   rt   Úfetchallrw   r›   r   rv   )rx   ÚrowsÚdstÚ	site_nameÚ	new_countÚ	upd_countrœ   r,   r   r‘   Úpub_dater’   Úexistsr    Útotals                  r!   Úsync_to_serverr²     s  € ä	Ð
)Ô*ä�?‰?œ:Ó&€Dð �<‰<Ø{óç�hƒjð 	ð 	‡J�J„LáÜÐ$Ô%Øä
�/‰/Ð+Ó
,€CØ‡K�KÐ)Ô*à€IØ€IØ€IØò #ˆØ12Ñ.ˆˆs�G˜X wð	#à—[‘[Ð!ZÐ]`ÐbkÐ\lÓm×vÑvÓxˆFÙØ—‘ØaØ˜Wš]¨¨G¨VÐ4°h²nÀ"ÀwÂ}ÐRTÐVZÐWZÐF[Ð]cÐdeÑ]fÐgôð ˜Q‘‘	à—‘ð/à˜C '¢-¨R°°&Ð!9¸8º>ÀrØ’m  T cÐ*¨I°r¸8ðEôð ˜Q‘�	øð%#ð, �1‚}˜	 AšØ�
‰
Œà�‰Ð>ÀÀÔMØ�‰ð[àˆLô	ð 	�
‰
Œà�K‰KØ8¸9¸,óHßHPÉË
ÐSTñV€Eà‡I�I„Kä	ˆK˜	�{ '¨)¨Ð4RÐSXÐRYÐY]Ð
^Õ_øô# ò 	#Ü�I˜a˜S�/×"Ò"ûð	#ús   ÂBF?Æ?	G!ÇGÇG!c                 ó†  — t         j                  | ¬«      }t        |«      \  }}|st        d| › d�«       yt	        |«      }|st        d| › d�«       y|D ]  }t
        › d|d   › d	�|d
<   Œ d}|D �]L  }t        |d   «       }	d}
|�rOt        |d   «      }
|
rÃ|
\  }}}}|r|n|d   }|}|r#dj                  d„ |D «       «      }|r|› d|› �n|}|xs |d   }|st        j                  dd«      › d|d
   › �nd|d
   › �}t        dd||d
   |||«       |	rt        |d   ||d
   |«       nt        |d   ||d
   |«       |dz  }t        d|dd › d|› d�«       �nt        dd|d   |d
   t        |d   t        › d|d
   › �«       |	rt        |d   |d   |d
   |d   «       nt        |d   |d   |d
   |d   «       |dz  }t        d|d   dd › d�«       nŠt        dd|d   |d
   t        |d   t        › d|d
   › �«       |	rt        |d   |d   |d
   |d   «       nt        |d   |d   |d
   |d   «       |dz  }t        d|d   dd › d|d   rd|d   z   nd› �«       |s�Œõ|j                  t!        j"                  d|d   |d   |d
   |d   t        › d |d
   › �d!œd"¬#«      dz   «       |j%                  «        �ŒO |S )$u/   çˆ¬å�–å�•é¡µåˆ—è¡¨ â€” å�¯é€‰æŠ“è¯¦æƒ…é¡µæ­£æ–‡)Úpageu     â�Œ åˆ—è¡¨é¡µ u    å¤±è´¥r   u     âš ï¸� åˆ—è¡¨é¡µ u
    æ— å¸–å­�r)   r+   r*   r   Nr,   rb   c              3   ó4   K  — | ]  \  }}d |› d|› d�–— Œ y­w©z<p><a href="z">z</a></p>N© ©Ú.0ÚnÚus      r!   ú	<genexpr>z!crawl_one_page.<locals>.<genexpr>Þ  s(   è ø€ ò )Ù<@¸A¸q˜, q c¨¨A¨3¨hÔ7ñ)ùó   ‚r-   u     â€” è¯¦æƒ…è¯·è·³è½¬åŽŸç«™æŸ¥çœ‹r'   u   
ðŸ“Ž åŽŸå¸–é“¾æŽ¥ï¼šu6   çŽ¯è¯„çˆ±å¥½è€…è®ºå�›å…¬ç¤ºä¿¡æ�¯
ðŸ“Ž åŽŸå¸–é“¾æŽ¥ï¼šu   çŽ¯è¯„çˆ±å¥½è€…zwww.eiafans.comr$   u       âœ… é(   z... (ú)u       âš ï¸� u   ... (è¯¦æƒ…ä¸�å�¯ç”¨)rG   ú...z | u    â€” )r¬   r,   Úpublish_dateÚpage_urlr‘   Úcontent_textF)Úensure_ascii)Ú	FORUM_URLÚformatr"   r}   rC   r8   r�   rn   ÚjoinÚPLACEHOLDER_SUMMARYr   r¦   r¢   r¤   ÚPLACEHOLDER_CONTENTÚwriteÚjsonÚdumpsÚflush)Úpage_numÚout_fileÚfetch_detail_pagesÚlist_urlr:   rk   r;   r‹   ÚcountÚis_newÚdetailrR   rm   rf   Údet_dater,   r‘   Úatt_htmlr-   r’   s                       r!   Úcrawl_one_pager×   ½  s×  € ä×Ñ XÐÓ.€Hä�xÓ �G€Dˆ!ÙÜÐ   
¨'Ð2Ô3Øä˜dÓ#€GÙÜÐ# H :¨ZÐ8Ô9Øð ò <ˆÜ�Z˜x¨¨%© z°Ð;ˆˆ%Šð<ð €EØó FˆÜ& q¨¡xÓ0Ð0ˆð ˆÚÜ! ! E¡(Ó+ˆFÙØ9?Ñ6�
˜J¨¨há&0™
°a¸±j�à$�ÙØ#Ÿy™yñ )ØDHô)ó  �Hñ ;B  	¨¨H¨:Ñ6Àx�GØÒ, 1 V¡9�ñ KRÔ0×8Ñ8Ð9[Ð]_Ó`ÐaÐawÐxyÐzñ  yAð  xBñ  Cð  ZQð  RSð  TYñ  RZð  Q[ð  X\�ÜØ%Ð'8Ø˜1˜U™8 W¨d°Gôñ Ü'¨¨%©°%¸¸5¹À4ÕHä! ! E¡(¨E°1°U±8¸TÔBØ˜‘
�Ü˜  s¨  ¨E°$°°qÐ9Ö:ô  Ø%Ð'8Ø�g‘J  %¡Ü'Ø�f‘IÜ*Ð+Ð+AÀ!ÀEÁ(ÀÐLôñ Ü'¨¨%©°!°G±*¸aÀ¹hÈÈ&É	ÕRä! ! E¡(¨A¨g©J¸¸%¹À!ÀFÁ)ÔLØ˜‘
�Ü˜ A g¡J¨s° OÐ#4Ð4IÐJÕKô Ø!Ð#4Ø�'‘
˜A˜e™HÜ#Ø�&‘	Ü&Ð'Ð'=¸aÀ¹h¸ZÐHôñ Ü# A e¡H¨a°©j¸!¸E¹(ÀAÀfÁIÕNä˜a ™h¨¨'©
°A°e±H¸aÀ¹iÔHØ�Q‰JˆEÜ�H˜Q˜w™Z¨¨˜_Ð-¨SÈÈ&Ê	°%¸!¸F¹)Ò2CÐWYÐ0ZÐ[Ô\ãØ�N‰Nœ4Ÿ:™:Ø.Ø˜7™Ø ! &¡	Ø˜e™HØ˜W™:Ü#6Ð"7°u¸Q¸u¹X¸JÐ Gñ'ð "ô#ð &*ñ*ô +ð �N‰NÖðMFðP €LrD   r$   c                 ó¾  — t        j                  t        «      }|j                  d«      j	                  «       d   }|j                  «        t        d|› d�«       t        j                  «       }d}t        ||| z   «      D ]Û  }|t        kD  rt        dt        › �«        n¾t        d|› dt        › d�d	¬
«       t        j                  j                  «        t        ||¬«      }||z  }|dkD  rt        d|› d�«       nt        d«       |dz  dk(  s||| z   dz
  k(  sŒœt        j                  «       |z
  }	|t        |	d«      z  }
t        d|› d|› d|	d›d|
d›d�	«       ŒÝ t        j                  «       |z
  }	t        dd› �«       t        dt        | t        |z
  dz   «      › d|› d�«       t        d|	d›d|	dz  d›d�«       t        d |t        |	d«      z  d›d!�«       |S )"u   å…¨é‡�/å¢žé‡�çˆ¬å�–æ‰€æœ‰é¡µz$SELECT COUNT(*) FROM eiafans_threadsr   u   ðŸ“Š å·²æœ‰è®°å½•: u
    ä¸ªå¸–å­�u   
â�¹ å·²è¾¾æœ€å¤§é¡µæ•° u
   
ðŸ“ƒ ç¬¬ re   u    é¡µ...rH   )Úend)rÐ   u     âž•+u    æ�¡u     âž– æ— æ–°å¢žéd   r$   u   
ðŸ“Š ã€�è¿›åº¦ã€‘ç¬¬u   é¡µ | ç´¯è®¡u   æ�¡ | z.0fzs | u   æ�¡/ç§’rb   ú2==================================================u   âœ… å®Œæˆ�ï¼�å…±å¤„ç�† u    é¡µï¼Œæ–°å¢ž u   â�± è€—æ—¶: u   ç§’ (é<   z.1fu   åˆ†é’Ÿ)u   âš¡ é€ŸçŽ‡: u    æ�¡/ç§’)rq   rr   rs   rt   r›   rw   r}   ÚtimeÚrangeÚTOTAL_PAGESÚsysÚstdoutrÍ   r×   ÚmaxÚmin)Úpages_to_crawlÚ
page_startrÐ   rx   ÚexistingÚ
start_timeÚ	total_newr´   rº   ÚelapsedÚrates              r!   Úcrawlrë     sð  € ä�?‰?œ:Ó&€DØ�|‰|ÐBÓC×LÑLÓNÈqÑQ€HØ‡J�J„LÜ	Ð ˜z¨Ð
4Ô5ä—‘“€JØ€Iä�j *¨~Ñ"=Ó>ò rˆØ”+ÒÜÐ-¬k¨]Ð;Ô<Ùä�˜D˜6 ¤; -¨wÐ7¸SÕAÜ�
‰
×ÑÔä˜4Ð4FÔGˆØ�Q‰ˆ	àˆqŠ5Ü�F˜1˜#˜TÐ"Õ#äÐ#Ô$ð �#‰:˜Š?˜d j°>Ñ&AÀAÑ&EÓEÜ—i‘i“k JÑ.ˆGØœs 7¨A›Ñ.ˆDÜÐ*¨4¨&°¸Y¸KÀvÈgÐVYÈ]ÐZ^Ð_cÐdgÐ^hÐhoÐpÕqð)rô, �i‰i‹k˜JÑ&€GÜ	ˆBˆvˆhˆ-ÔÜ	Ð#¤C¨¼ÀjÑ8PÐSTÑ8TÓ$UÐ#VÐVdÐenÐdoÐosÐ
tÔuÜ	ˆL˜ ˜ U¨7°2©:°cÐ*:¸'Ð
BÔCÜ	ˆL˜¤3 w¨q£>Ñ1°#Ð6°hÐ
?Ô@àÐrD   c            	      óÀ  — t        d«       t        j                  t        «      } | j	                  d«      j                  «       }| j                  «        t        dt        |«      › d�«       d}d}|D �]W  \  }t        |«      }|�r|\  }}}}	|r|nd}
|}|r#dj                  d„ |D «       «      }|r|› d|› �n|}t        j                  t        «      } | j	                  d	«       | j	                  d
|f«      j                  «       }|\  }}}|
xs |}|	xs |}| j	                  d||xs d||f«       | j	                  d|||f«       | j                  «        | j                  «        t        ||||«       |dz  }|dk  s|dz  dk(  r/t        d|› d|dd › d�«       n|dz  }|dk  rt        d|› d�«       t        j                  d«       �ŒZ t        d|› d|› �«       |S )uA   é‡�æŠ“å­˜é‡�è¯¦æƒ…é¡µ â€” ä¿®å¤�æ ‡é¢˜çœ�ç•¥å�· + æ­£æ–‡å� ä½�ç¬¦u   
ðŸ”„ é‡�æŠ“å­˜é‡�è¯¦æƒ…é¡µ...z,SELECT tid FROM eiafans_threads ORDER BY tidu   ðŸ“Š å­˜é‡�å¸–å­�: u    ä¸ªr   Nrb   c              3   ó4   K  — | ]  \  }}d |› d|› d�–— Œ y­wr¶   r·   r¸   s      r!   r¼   z#refetch_existing.<locals>.<genexpr>U  s(   è ø€ ò %Ù8<¸¸1�l 1 # R¨ s¨(Ô3ñ%ùr½   rp   z@SELECT title, url, publish_date FROM eiafans_threads WHERE tid=?zIUPDATE quality_results SET title=?, content=?, publish_date=? WHERE url=?r'   z>UPDATE eiafans_threads SET title=?, publish_date=? WHERE tid=?r$   r(   é   u     âœ… z: é-   rÀ   u	     âš ï¸� u&   : è¯¦æƒ…ä¸�å�¯ç”¨ï¼ˆä¿�ç•™å� ä½�ç¬¦ï¼‰gš™™™™™é?u   
ðŸ”„ é‡�æŠ“å®Œæˆ�: æˆ�åŠŸ u	   , å¤±è´¥ )r}   rq   rr   rs   rt   r©   rw   r7   rn   rÇ   r›   rv   r¤   rÝ   Úsleep)rx   rª   ÚokÚfailr+   rÔ   rR   rm   rf   rÕ   r,   r‘   rÖ   rœ   Ú	old_titler   Úold_dateÚ	new_titleÚnew_dates                      r!   Úrefetch_existingr÷   B  s  € ä	Ð
+Ô,Ü�?‰?œ:Ó&€DØ�<‰<Ø6óç�hƒjð 	ð 	‡J�J„LÜ	Ð¤ D£	˜{¨$Ð
/Ô0à	
€BØ€DØó $‰ˆÜ˜cÓ"ˆÚØ5;Ñ2ˆJ˜
 D¨(Ù",‘J°$ˆEØ ˆGÙØŸ9™9ñ %Ø@Dô%ó �ñ 7>˜W˜I R¨ zÑ2À8�ä—?‘?¤:Ó.ˆDØ�L‰LÐ2Ô3Ø—‘Ð_ÐbeÐagÓh×qÑqÓsˆAØ'(Ñ$ˆI�s˜HØÒ* ˆIØÒ+ 8ˆHØ�L‰LØ[Ø˜GšM r¨8°SÐ9ôð �L‰LØPØ˜H cÐ*ôð �K‰KŒMØ�J‰JŒLÜ˜#˜y¨#¨xÔ8Ø�!‰GˆBØ�QŠw˜"˜r™' Qš,Ü˜˜s˜e 2 i°° nÐ%5°SÐ9Õ:à�A‰IˆDØ�qŠyÜ˜	 # Ð&LÐMÔNÜ�
‰
�3ŽðI$ôL 
Ð(¨¨¨I°d°VÐ
<Ô=Ø€IrD   Ú__main__u   çŽ¯è¯„çˆ±å¥½è€…çˆ¬è™«)Údescriptionz--fullÚ
store_trueu   å…¨é‡�çˆ¬å�–æ‰€æœ‰2078é¡µ)ÚactionÚhelpz--pagesrI   u   çˆ¬å�–é¡µæ•° (é»˜è®¤10))ÚtypeÚdefaultrü   z--startu   èµ·å§‹é¡µæ•° (é»˜è®¤1)z--syncu!   ä»…å�Œæ­¥å·²æœ‰æ•°æ�®åˆ°æœ�åŠ¡å™¨z--list-onlyu$   çº¯åˆ—è¡¨æ¨¡å¼�ï¼ˆä¸�æŠ“è¯¦æƒ…é¡µï¼‰z	--refetchu   é‡�æŠ“å­˜é‡�è¯¦æƒ…é¡µrb   rÛ   u   ðŸš€ çŽ¯è¯„çˆ±å¥½è€…çˆ¬è™« â€” u   å…¨é‡�u   å¢žé‡�(u   é¡µ)u
     æ¨¡å¼�: u   å¢žé‡�u
     é¡µæ•°: u    (ç¬¬u   é¡µèµ·)u     è¯¦æƒ…é¡µ: u   æŠ“å�–æ­£æ–‡+é‡�å»ºæ ‡é¢˜u	   ä»…åˆ—è¡¨)rå   rÐ   u   ðŸ�� å®Œæˆ�)rî   )NT)r$   T)PÚ__doc__rà   Úosr/   rË   rq   ÚhashlibrÝ   ÚsslÚurllib.requestr   Úbase64Ú
subprocessr   Úurllib.parser   r:   r   ÚpathÚdirnameÚabspathÚ__file__ÚBASE_DIRrÇ   rs   Ú
SERVER_SSHÚ	SERVER_DBÚSERVER_SEARCH_DBr8   rÅ   rß   rÉ   rÈ   Ú_create_unverified_contextr   r   r"   rC   r`   rN   rh   rn   ry   Úqueuerˆ   ÚQueuer{   r‡   rƒ   rŒ   r“   r–   r™   r�   r¢   r¤   r¦   r²   r×   rë   r÷   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚintÚ
parse_argsr�   ÚsyncÚexitÚrefetchrñ   ÚfullÚpagesÚ	list_onlyÚfetch_detailsr}   rŠ   rè   r·   rD   r!   ú<module>r      s   ðñ÷$ Z× Y× Y× Y× YÓ YÝ Ý  Ý ð �7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨8Ó4Ó5€Ø�W‰W�\‰\˜(Ð$8Ó9€
Ø €
Ø&€	Ø$Ð à#€Ø9€	à€ð RÐ ØYÐ ð %€c×$Ñ$Ó&€ð3à7ØOØ0ñ€ó	ò1òh_%òBò0ò .ò"÷6 àˆu�{‰{‹}€ØÐ ò
!ò%òòòòòEòGòaò
:`ó|[óz&òP3ðl ˆzÓÛà$ˆX×$Ñ$Ð1HÔI€FØ
×Ñ˜¨Ð<WÐÔXØ
×Ñ˜	¨°RÐ>WÐÔXØ
×Ñ˜	¨°QÐ=UÐÔVØ
×Ñ˜¨Ð<_ÐÔ`Ø
×Ñ˜¨lÐAgÐÔhØ
×Ñ˜¨LÐ?VÐÔWà×ÑÓ€Dà‡y‚yÙÔØˆ�‰�Œá„Ià‡|‚|ÙÓˆØ�Š6ÙÔØˆ�‰�ŒàŸ9š9‰K¨$¯*©*€EØŸ™Ð&€Má	ˆBˆvˆhˆ-ÔÙ	Ð+¸¿	º	©HÈÐQVÐPWÐW[ÐG\Ð+]Ð
^Ô_Ù	ˆVˆHÔÙ	ˆJ 4§9¢9‘x°(Ð;Ð
<Ô=Ù	ˆJ�u�g˜U 4§:¡: ,¨gÐ
6Ô7Ù	ˆM¹Ñ5ÈKÐXÐ
YÔZÙ	ˆVˆHÔá�e¨¯
©
À}ÔU€Ià�1‚}ÙÔá	ˆBˆvˆhˆ-ÔÙ	ˆKÕðU rD   