
    <|j                        d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
Z
dZ ed	       G d
 d             Z G d d      Zy)u(   HTTP 抓取器 - 复用自 pm001-crawler    )annotationsN)	dataclass)Any)urljoinzuMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36T)slotsc                  P    e Zd ZU ded<   dZded<   dZded<   d	Zded
<   eZded<   y)FetcherConfigstrbase_urlg      $@floattimeouti  intdelay_ms   retries
user_agentN)	__name__
__module____qualname____annotations__r   r   r   DEFAULT_USER_AGENTr         /opt/daily-market/src/fetcher.pyr	   r	      s/    MGUHcGS(J(r   r	   c                  6    e Zd ZddZddZd	d
dZddZddZy)ForumFetcherc                    || _         t        j                         | _        | j                  j                  j                  |j                  ddd|j                  d       y )Nz?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8z
keep-alive)z
User-AgentAcceptzAccept-Language
ConnectionReferer)configrequestsSessionsessionheadersupdater   r   )selfr!   s     r   __init__zForumFetcher.__init__   sO    '')##$//[#<*!??	
r   c                B    t        | j                  j                  |      S N)r   r!   r   )r'   path_or_urls     r   absolute_urlzForumFetcher.absolute_url,   s    t{{++[99r   Nc                B   | j                  |      }d }t        d| j                  j                  dz         D ]u  }	 | j                  j                  ||| j                  j                        }|j                          | j                  |      }| j                          ||j                  fc S  t!        d|       |# t        j                  $ rM}|}|| j                  j                  k\  rY d }~ Ct        j                  t        d|z  d             Y d }~d }~ww xY w)N   )paramsr         u   请求失败: )r,   ranger!   r   r$   getr   raise_for_status_decode_response_sleepurlr"   RequestExceptiontimesleepminRuntimeError)	r'   r+   r/   r7   
last_errorattemptresponsetextexcs	            r   r3   zForumFetcher.get/   s   ,'+
Q 3 3a 78 	/G/<<++! KK// , 
 ))+,,X6X\\))	/" ^C512
B ,, / 
dkk111

3q'z1-..	/s   A0B>>DD2"DDc                F   |j                   }|d d j                  dd      j                         }g }d|v r|j                  ddg       nd|v r|j	                  d	       |j
                  }|j                  }|r#|j                         d
vr|j	                  |       |j                  |ddd	|g       t               }|D ]@  }|s|j                         }	|	|v r|j                  |	       	 |j                  |d      c S  |j                  S # t        t        f$ r Y `w xY w)Ni   asciiignore)errorsz
charset=gbgb18030gbkzcharset=utf-8zutf-8>   
iso-8859-1rC   )contentdecodelowerextendappendapparent_encodingencodingsetaddLookupErrorUnicodeDecodeErrorr@   )
r'   r?   rI   
ascii_head	encodingsapparentdeclaredseenrO   
normalizeds
             r   r5   zForumFetcher._decode_responseF   s3   ""Ud^**78*DJJL
&(	:%i/0
*W%--$$(0GGX&(IugxHI! 
	H!)JT!HHZ ~~hx~@@
	 }}  !34 s   ,DD D c                    | j                   j                  dkD  r-t        j                  | j                   j                  dz         y y )Nr   g     @@)r!   r   r9   r:   )r'   s    r   r6   zForumFetcher._sleepd   s4    ;;!#JJt{{++f45 $r   )r!   r	   returnNone)r+   r
   r[   r
   r*   )r+   r
   r/   zdict[str, Any] | Noner[   ztuple[str, str])r?   zrequests.Responser[   r
   )r[   r\   )r   r   r   r(   r,   r3   r5   r6   r   r   r   r   r      s    
:C.<6r   r   )__doc__
__future__r   r9   dataclassesr   typingr   urllib.parser   r"   r   r	   r   r   r   r   <module>rb      sN    . "  !    %  ) ) )H6 H6r   