Ë
    ¸¬uj–  ã                   ó:  — d Z ddlZddlZddlZddlZej
                  j                  dej
                  j                  ej
                  j                  e	«      «      «       ddl
mZmZmZmZmZmZmZmZmZmZ dZdZdZdZdZd	ZdZd
„ Zd„ Zd d„Zedk(  �rddl Z  e jB                  de› �¬«      Z"e"jG                  de$d¬«       e"jG                  ddd¬«       e"jK                  «       Z&e&jN                  rW e«       Z(e(jS                  d«      jU                  «       d   Z+ e,de+› d�«       e(j[                  «         ej\                  d«        e,de› d�«        ej                  «       Z/ ee&j`                  ¬«        e,d ej                  «       e/z
  d›d�«       yy)!u  
crawl_TEMPLATE.py â€” çˆ¬è™«æ¨¡æ�¿
==========================
æŒ‰ç«™å†™çˆ¬è™«çš„ç»Ÿä¸€æ¨¡å¼�ã€‚

è§„åˆ™ï¼š
    - å�ªçˆ¬åˆ—è¡¨å‰� 5 é¡µ
    - å�ªå�–æ ‡é¢˜å�«"é¡¹ç›®" + è¿‘ 3 å¹´çš„æ•°æ�®
    - æ­£æ–‡ä¿�ç•™ HTML æ ¼å¼�
    - ç»“æžœå†™ eia.dbï¼ˆsearch_app è‡ªåŠ¨å�¯è§�ï¼‰

ç”¨æ³•:
    python3 crawl_TEMPLATE.py             # å…¨é‡�çˆ¬ï¼ˆæœ€å¤š5é¡µï¼‰
    python3 crawl_TEMPLATE.py --limit=5   # æµ‹è¯•å�ªè·‘5æ�¡
    python3 crawl_TEMPLATE.py --stats     # çœ‹ç»Ÿè®¡

ä¿®æ”¹æŒ‡å�—ï¼š
    æ”¹ä¸‹é�¢ã€Œé…�ç½®åŒºã€�çš„ 3-5 é¡¹å�³å�¯å¼€å·¥ã€‚
é    N)
Ú
fetch_pageÚ
parse_dateÚ
clean_htmlÚTHREE_YEARS_AGOÚextract_date_from_htmlÚextract_content_by_selectorÚextract_content_by_regexÚimport_to_eiaÚ
save_jsonlÚget_eia_connu   ç«™ç‚¹å��ç§°zhttp://example.com/zhttp://example.com/list/z:<a[^>]*href=["\'](/detail/\d+\.html)["\'][^>]*>([^<]+)</a>z7div.article-content, div.content, #content, .TRS_Editorz8<div[^>]*class="article-content"[^>]*>(.*?)</div>\s*<divc                 ó@  — g }t        j                  t        | «      D ]~  }|j                  d«      j	                  «       }|j                  d«      j	                  «       }|j                  d«      sddlm}  |t        |«      }|sŒh|sŒk|j                  ||dœ«       Œ€ |S )u`   ä»Žåˆ—è¡¨é¡µ HTML æ��å�–æ‰€æœ‰æ�¡ç›®
    
    è¿”å›ž: [{"title": "...", "url": "..."}, ...]
    é   é   Úhttpr   )Úurljoin)ÚtitleÚurl)
ÚreÚfinditerÚLIST_PATTERNÚgroupÚstripÚ
startswithÚurllib.parser   ÚLIST_URLÚappend)ÚhtmlÚitemsÚmÚhrefr   r   s         ú#/root/gov_crawler/crawl_TEMPLATE.pyÚget_list_itemsr"   ;   s‡   € ð
 €EÜ�[‰[œ tÓ,ò 8ˆØ�w‰w�q‹z×ÑÓ!ˆØ—‘˜“
× Ñ Ó"ˆØ�‰˜vÔ&Ý,Ùœ8 TÓ*ˆDÚ’TØ�L‰L 5°Ñ6Õ7ð8ð €Ló    c                 ó¦   — t        | «      }|sdddœS t        |t        «      }|rt        |«      dk  rt	        |t
        «      }t        |«      }||dœS )uv   è®¿é—®è¯¦æƒ…é¡µï¼Œè¿”å›žæ­£æ–‡ HTML å’Œå�‘å¸ƒæ—¶é—´
    
    è¿”å›ž: {"content": "...", "pub_date": "YYYY-MM-DD"}
    Ú )ÚcontentÚpub_dateé2   )r   r   ÚDETAIL_SELECTORÚlenr	   ÚDETAIL_PATTERNr   )r   r   r&   r'   s       r!   Ú
get_detailr,   P   s\   € ô
 �c‹?€DÙØ¨2Ñ.Ð.ô *¨$´Ó@€Gñ ”c˜'“l RÒ'Ü*¨4´Ó@ˆô & dÓ+€Hà¨HÑ5Ð5r#   c                 óØ  — t         g}t        r?t        dd«      D ]0  }|j                  t        j	                  dt        |«      «      «       Œ2 g }t        «       }|D ]ž  }t        |«      }|sŒt        |«      }g }|D ]9  }	d|	d   vrŒ|	j                  d«      r|	d   t        k  rŒ)|j                  |	«       Œ; |D �
cg c]  }
|
d   |vsŒ|
‘Œ }}
|D ]  }
|j                  |
d   «       Œ |j                  |«       Œ  t        dt        |«      › d	�«       | r|d
|  }t        «       }d\  }}t!        |d«      D ]‰  \  }
}t#        |d   «      }t$        |d   |d   |d   |d   t$        dœ}t'        |«       t)        ||«      r|dz  }n|dz  }|
dz  dk(  s|
t        |«      k(  sŒjt        d|
› dt        |«      › d|› d|› �«       Œ‹ |j+                  «        t        d|› d|› �«       ||fS c c}
w )u2   å…¨é‡�çˆ¬å�–ï¼ˆæœ€å¤š5é¡µï¼Œè¿‘3å¹´ï¼Œå�«é¡¹ç›®ï¼‰r   é   z{n}u   é¡¹ç›®r   r'   r   u     åˆ—è¡¨é¡µ: æ��å�– u    æ�¡N)r   r   r   r&   )Ú	site_namer   r   r&   r'   Útagsé   r   z  [ú/u   ] âœ…u    â�Œu     âœ… å®Œæˆ�: æ–°å¢žu   , è·³è¿‡)r   ÚPAGE_URL_PATTERNÚranger   ÚreplaceÚstrÚsetr   r"   Úgetr   ÚaddÚextendÚprintr*   r   Ú	enumerater,   Ú	SITE_NAMEr   r
   Úclose)Ú	max_itemsÚurlsÚnÚ	all_itemsÚ	seen_urlsÚpage_urlr   r   ÚfilteredÚitÚiÚ	new_itemsÚconnÚokÚfailÚitemÚdetailÚentrys                     r!   ÚcrawlrO   n   s0  € äˆ:€DÝÜ�q˜!“ò 	AˆAØ�K‰KÔ(×0Ñ0°¼¸A»Ó?Õ@ð	Að €IÜ“€IØò $ˆÜ˜(Ó#ˆÙØÜ˜tÓ$ˆàˆØò 	 ˆBØ˜r '™{Ñ*ØØ�v‰v�jÔ! b¨¡n´Ò&FØØ�O‰O˜BÕð	 ð !)ÖF˜1¨A¨e©H¸IÒ,E’QÐFˆ	ÐFØò 	$ˆAØ�M‰M˜!˜E™(Õ#ð	$à×Ñ˜Õ#ð!$ô$ 
Ð ¤ Y£Ð 0°Ð
5Ô6áØ˜j˜yÐ)ˆ	ô ‹>€DØ�H€BˆÜ˜Y¨Ó*ò A‰ˆˆ4Ü˜D ™KÓ(ˆä"Ø˜'‘]Ø˜‘;Ø˜iÑ(Ø˜zÑ*Üñ
ˆô 	�5ÔÜ˜ Ô%Ø�!‰G‰Bà�A‰IˆDØˆq‰5�AŠ:˜œc )›nÓ,Ü�C˜�s˜!œC 	›NÐ+¨5°°°D¸¸Ð?Õ@ð!Að$ 	‡J�J„LÜ	Ð    H¨T¨FÐ
3Ô4Øˆtˆ8€OùòC Gs   Â;G'ÃG'Ú__main__u   çˆ¬è™«: )Údescriptionz--limitu   æµ‹è¯•ï¼šå�ªè·‘ N æ�¡)ÚtypeÚhelpz--statsÚ
store_trueu   æŸ¥çœ‹ eia.db ç»Ÿè®¡)ÚactionrS   zSELECT COUNT(*) FROM projectsu   ðŸ“Š eia.db: u
    æ�¡é¡¹ç›®u   
ðŸ“¡ [u1   ] å¼€å§‹çˆ¬å�– (æœ€å¤š5é¡µ, è¿‘3å¹´, å�«"é¡¹ç›®"))r?   u   â�± è€—æ—¶: z.1fzs
)N)1Ú__doc__r   ÚsysÚosÚtimeÚpathÚinsertÚdirnameÚabspathÚ__file__Úcrawler_libr   r   r   r   r   r   r	   r
   r   r   r=   ÚBASE_URLr   r   r)   r+   r3   r"   r,   rO   Ú__name__ÚargparseÚArgumentParserÚparserÚadd_argumentÚintÚ
parse_argsÚargsÚstatsrI   ÚexecuteÚfetchoneÚtotalr;   r>   ÚexitÚt0Úlimit© r#   r!   ú<module>rq      s’  ðñ÷( × ð ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >÷÷ ÷ ð €	Ø!€Ø&€ð M€ð L€ð M€ð
 Ð òò*6ó<7ðt ˆzÓÛØ$ˆX×$Ñ$°8¸I¸;Ð1GÔH€FØ
×Ñ˜	¨Ð2IÐÔJØ
×Ñ˜	¨,Ð=SÐÔTØ×ÑÓ€Dà‡z‚zÙ‹~ˆØ—‘Ð<Ó=×FÑFÓHÈÑKˆÙ�˜e˜W JÐ/Ô0Ø�
‰
ŒØˆ�‰�Œá	ˆH�Y�KÐRÐ
SÔTØ	ˆ�‰‹€BÙ	�D—J‘JÕÙ	ˆL˜˜Ÿ™› R™¨Ð,¨CÐ
0Õ1ð# r#   