U
    uhZ                     @   sh   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	 ej
d d dlmZ G dd deZdS )    N)PyQueryz..)Spiderc                   @   s   e Zd Zdd Zdd Zd%ddZdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zd&ddZdd Zdd Zd'dd Zd(d#d$Zd!S ))r   c                 C   s\   d| _ d| _dg| _d| jd| _d| _dddd	d	dd
d
dddddddd| _d S )Nu   好色TV（优）zhttps://m.ml0987.online/zsMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36)z
User-AgentRefereri  list )type_id
url_suffixZtop7topZ5minlong)u   视频u   周榜u   月榜u   5分钟+u	   10分钟+)namehostcandidate_hostsheaderstimeout	class_mapself r   &   /storage/emulated/0/lz/py/sy/好色.py__init__   s    zSpider.__init__c                 C   s   | j S N)r   r   r   r   r   getName#   s    zSpider.getNamer   c                 C   s   |   | _| j| jd< d S )Nr   )get_fastest_hostr   r   )r   extendr   r   r   init&   s    
zSpider.initc                    s    sdS t  fdddD S )NFc                 3   s   | ]}|   kV  qd S r   )lower).0fmturlr   r   	<genexpr>.   s     z'Spider.isVideoFormat.<locals>.<genexpr>)z.mp4.m3u8z.flvz.avi)any)r   r   r   r   r   isVideoFormat+   s    zSpider.isVideoFormatc                    s    fdd}|S )Nc                    sT     | sdS z2 j|  jddd}|jdko>d|jddkW S    Y dS X d S )	NFHEAD   )r   methodr      .  videoContent-Typer   )r#   fetchr   status_codeget)r   respr   r   r   check1   s    
z&Spider.manualVideoCheck.<locals>.checkr   )r   r0   r   r   r   manualVideoCheck0   s    zSpider.manualVideoCheckc                    s   i  g } fdd}j D ]&}tj||fd}|| |  q|D ]}|  qHdd   D }|rx|d d S j d S )u*   测试候选域名，返回最快可用的c                    sn   zPt   }tj| jddd}|jdkrBt   | d }| | < ntd | < W n   td | < Y nX d S )N   F)r   r   allow_redirectsr(   i-  r)   i  inf)timerequestsheadr   r-   float)r   
start_timer/   delayresultsr   r   r   	test_host@   s    

z*Spider.get_fastest_host.<locals>.test_host)targetargsc                 S   s$   g | ]\}}|t d kr||fqS )r5   )r9   )r   hdr   r   r   
<listcomp>S   s      z+Spider.get_fastest_host.<locals>.<listcomp>r   )r   	threadingThreadappendstartjoinitems)r   threadsr>   r   tZvalid_hostsr   r<   r   r   ;   s    



zSpider.get_fastest_hostc                 C   s  i }g }| j  D ]\}}|||d d q||d< z^| j| jdddj}t|}g }|d}	|	 D ]}
z|
d  }|sW ql|
d	d
pd}t	
d|}|r|dnd}|r|ds| jd d|d }|
d  pd}|
ddpd}|sW ql|dd }|ds:|d7 }|||||d W ql tk
r } ztd|  W Y qlW 5 d }~X Y qlX ql||d< W n: tk
r } ztd|  g |d< W 5 d }~X Y nX |S )Nr   )	type_namer   classr2      retryr   .row .col-xs-6.col-md-3h5.imagestyler   url\(["\']?([^"\']+)["\']?\)   http/	.duration   未知ahref.htmvod_idvod_namevod_picvod_remarksu   解析首页视频项失败: r   u   首页解析失败: )r   rI   rF   fetch_with_retryr   textpqstripattrresearchgroup
startswithrstriplstripsplitendswith	Exceptionprint)r   filterresultclassesr   infohtmldatavlistrI   itemtitlerT   	pic_matchrb   descr\   r`   er   r   r   homeContentV   sX    
zSpider.homeContentc                 C   s   g S r   r   r   r   r   r   homeVideoContent   s    zSpider.homeVideoContentc                 C   s  i }zzd }| j  D ]\}}|d |kr|} q4q|sFg |d< |W S |dkrb| j d| d}	n| j |d  d| d}	| j|	| jddj}
|
jd	d
dd	}
t|
}g }|d}| D ]&}z|d 	 }|sW q|d
dpd}td|}|r|dnd}|r@|ds@| jd d|d }|d 	 pTd}|d
dphd}|stW q|dd }|ds|d7 }|||||d W q tk
r } ztd|  W Y qW 5 d }~X Y qX qd}zR|d}g }| D ]*}| 	 }| r|t| q|r>t|}W n   d}Y nX ||d< ||d< ||d< t||d< d |d!< W nZ tk
r } z:td"|  g |d< ||d< d|d< d#|d< d#|d!< W 5 d }~X Y nX |S )$Nr   r   zlist-r^   r   z_list-   r   r   utf-8ignoreerrorsrQ   rR   rS   rT   r   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r_   u   解析分类视频项失败: .pagination1 li apage	pagecountlimiti?B totalu   分类解析失败: r   )r   rI   r   r,   r   re   encodedecoderf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rF   rq   rr   isdigitintmaxlen)r   tidpgrs   r   rt   Z	cate_infor   rv   r   rw   rx   ry   rI   rz   r{   rT   r|   rb   r}   r\   r`   r~   r   
pagination	page_numsr[   re   r   r   r   categoryContent   s    

zSpider.categoryContentc           !   
   C   st  z|r|d sdg iW S |d   }|ds8|d7 }| j |d }| j|dddj}|jdd	d
d}t|}|d   pd}d}|d	dpd}t
d|}	|	r|	d}|s|d	dpd}|r|ds| j |d }d}
d}|d}| D ]}|   }d|ks6d| krP|dddd  }
nNd|kshd| krt
d|}|r|d}n|dddd  }q|
 d| }g }d }|d}|r|	d}|rd |kr|}td!|  |s2|d"}|r2|	d}|r2d |kr2|}td#|  |s`t
d$|}|r`|d }td%|  |rD|d&dd'dd(d}|ds|d)rd*| nd+| }d,|kr|| |d,d-}|| td.|  n\d-|kr"|d-d,}|| || td/|  n"|| || td0|  td1|  g }g }t|D ]R\}}d,|krzd2}nd-|krd3}nd4|d  }|| |d5|  qb|sd6g}d7g}t|dkr||d  d8 ||d  ||||d9|d9|d:}d|giW S  tk
rn } z.td;|  dd l} |   dg i W Y S d }~X Y nX d S )<Nr   r   r^   rX   r2   r   rO   r   r   r   z.panel-title, .video-title, h1u   未知标题r   z.vjs-posterrT   rU   rV   z/.video-pic img, .vjs-poster img, .thumbnail imgsrcrW   rZ   z6.panel-body .col-md-3, .video-info .info-item, .info pu   时长durationu	   时长：u   观看viewsu   (\d+\.?\d*[kK]?)次观看u	   观看：z | zvideo#video-play_html5_apir!   u   从video标签找到链接: zsource#video-sourceu   从source标签找到链接: z!https?://[^\s"\']+\.m3u8[^\s"\']*u   通过正则找到链接: z\/z\u002Fz\"z//zhttps:https://zhdcdn.onlinezhsex.tvu   生成主线路: u   生成HD线路: u   复制备用线路: u   最终播放线路: u   HD线路u	   主线路u   线路u   正片$u   好色TVu   正片$暂无播放地址u   -备用z$$$)r`   ra   rb   rc   vod_play_fromvod_play_urlu   详情解析失败: )rg   rp   r   rn   rd   re   r   r   rf   rh   ri   rj   rk   rl   rI   r   replacerr   findallrF   	enumerater   rH   rq   	traceback	print_exc)!r   idsr`   r   rw   rx   r{   rb   Zposter_styler|   r   r   Z
info_itemsrz   re   Zviews_matchremarksZ
video_urlsZ	found_urlZvideo_elementZ	video_srcZsource_elementZ
source_srcZm3u8_matchesZ
second_url	play_fromplay_urli	video_url	line_namevodr~   r   r   r   r   detailContent   s    




 










zSpider.detailContentrV   c                    s  zj|  s*td g t|ddddW S tjj|  ddd}t|dkrZ| j d}n| j d	| d
}|dd}| j|| j|dd}|j	dkrtd|j
 d|j	  g t|ddddW S |jjdddd}t| ddddg}	t fdd|	D }
|
r4td| d| d g t|ddddW S g } d}| D ]4}z|d   }|slW qH|dd p~d!}td"|}|r|dnd!}|r|d#s| jd$ d$|d$ }|d%   pd&}|d'd(pd!}|sW qH|d$d) }|d
s&|d
7 }|||||d* W n> tk
rz } ztd+| d, W Y qHW 5 d }~X Y nX qHd}zh d-}g }| D ]*}|   }| r|t| q|rt|}td| d.| d/ W n6 tk
r" } ztd0|  d}W 5 d }~X Y nX t|| }td| d| d1t| d2|  |t||t||dW S  tk
r } z*td3|  g t|dddd W Y S d }~X Y nX d S )4Nu   搜索关键词不能为空rV   r   )r   r   r   r   r   r   r   )encodingr   z
search.htmzsearch-r^   new)rj   sortr   )r   r   paramsr   r'   u!   搜索页面请求失败，URL：u   ，状态码：r   r   u   没有找到相关视频u   无搜索结果zNo results foundu   未找到匹配内容c                 3   s(   | ] } d | d| d  V  qdS )zdiv:contains("z"), p:contains("z")N)re   )r   re   rx   r   r   r      s     z'Spider.searchContent.<locals>.<genexpr>u   搜索关键词「u   」第u   页无结果rQ   rR   rS   rT   r   rU   zhttp://r   rX   rY   u   未知时长r[   r\   r]   r_   u!   解析单条搜索结果失败：u   （跳过该条）r   u   」分页解析完成，共u   页u'   解析分页失败（默认单页）：u   页处理完成，结果u   条，总页数u   搜索功能整体异常：)rg   rr   r   urllibparsequoter   r,   r   r-   r   re   r   r   rf   r"   rI   rh   ri   rj   rk   rl   rm   rn   ro   rp   rF   rq   r   r   r   )r   keyquickr   Zencoded_key
search_urlr   r/   rw   Zno_result_textsZ	no_resultry   rI   rz   r{   rT   r|   rb   r}   r\   r`   r~   r   r   r   r[   re   r   r   r   r   searchContentx  s    
 
$zSpider.searchContentc                 C   s@   | j  }|| j| jdtj| jjd d||ddS )NrX   )r   OriginHostrV   T)r   r   headerdouble)	r   copyupdater   rm   r   r   urlparsenetloc)r   flagidvipFlagsr   r   r   r   playerContent  s    

zSpider.playerContentc              
   C   s   zv|d }|r4| ds4| jd d|d }| j }|ddi | j||dd}|jdd	}d
||j	gW S  t
k
r } z td|  d
d	dg W Y S d }~X Y nX d S )Nr   r   rX   Acceptz@image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
   r   r+   z
image/jpegr(   u   图片代理失败:     )rl   r   rm   rn   r   r   r   r,   r.   contentrq   rr   )r   paramr   Zimg_headersrescontent_typer~   r   r   r   
localProxy  s    
zSpider.localProxyr2   rN   c                 C   s   t |d D ]}zB| j|| j|d}|jdkr8|W   S td| d|j d W n@ tk
r } z"td|d  d| d	|  W 5 d }~X Y nX ||k rtd
 qtdt	fdddS )NrV   r   r4   u   请求u   返回状态码u   ，重试中...u   第u	   次请求u   失败: g      ?objr   i  )re   r-   )
ranger,   r   r-   rr   rq   r6   sleeptypeobject)r   r   rP   r   r   r/   r~   r   r   r   rd     s    

0zSpider.fetch_with_retryNGETc                 C   s   |p| j }|pi }z| dkr6tj|||d|d}n6| dkrXtj|||d|d}ntj|||d|d}d|j dd kr|j|_nd	|_|W S  tk
r } z4t	d
| d|  t
dtfddi |d W Y S d }~X Y nX d S )Nr   T)r   r   r3   r   r$   Fcharsetr+   r   r   u   网络请求失败(z): r   i  )re   r-   r   r   )r   upperr7   r.   r8   r   apparent_encodingr   rq   rr   r   r   )r   r   r   r   r&   r   r/   r~   r   r   r   r,     sL    
	
zSpider.fetch)r   )rV   )r2   rN   )NrN   r   N)__name__
__module____qualname__r   r   r   r#   r1   r   r   r   r   r   r   r   r   rd   r,   r   r   r   r   r      s    
;W 
u
r   )ri   sysurllib.parser   rD   r6   r7   pyqueryr   rf   pathrF   base.spiderr   r   r   r   r   <module>   s   