o
    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    | ]	}|   v 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                    sN     | sdS z j|  jddd}|jdv od|jddv W S    Y 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 ]}|  q$dd   D }|r<|d d S j d S )u*   测试候选域名，返回最快可用的c                    sp   z+t   }tj| jddd}|jdv r#t   | d }| | < W d S td | < W d S    td | < Y 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 ]}
zl|
d  }|sDW q5|
d	d
pLd}t	
d|}|rZ|dnd}|rq|dsq| jd d|d }|
d  pzd}|
ddpd}|sW q5|dd }|ds|d7 }|||||d W q5 ty } ztd|  W Y d }~q5d }~ww ||d< W |S  ty } ztd|  g |d< W Y d }~|S d }~ww )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   sb   


zSpider.homeContentc                 C   s   g S r   r   r   r   r   r   homeVideoContent   s   zSpider.homeVideoContentc                 C   s  i }z.d }| j  D ]\}}|d |kr|} nq|s#g |d< |W S |dkr1| j d| d}	n| j |d  d| d}	| j|	| jddj}
|
jd	d
dd	}
t|
}g }|d}| D ]}zl|d 	 }|soW q`|d
dpwd}td|}|r|dnd}|r|ds| jd d|d }|d 	 pd}|d
dpd}|sW q`|dd }|ds|d7 }|||||d W q` ty } ztd|  W Y d }~q`d }~ww d}z(|d}g }| D ]}| 	 }| r	|t| q|rt|}W n   d}Y ||d< ||d< ||d< t||d< d |d!< W |S  ty` } z"td"|  g |d< ||d< d|d< d#|d< d#|d!< W Y d }~|S d }~ww )$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   s\  z|r|d sdg iW S |d   }|ds|d7 }| j |d }| j|dddj}|jdd	d
d}t|}|d   pFd}d}|d	dpQd}t
d|}	|	r_|	d}|sj|d	dpid}|r{|ds{| j |d }d}
d}|d}| D ]C}|   }d|v sd| v r|dddd  }
qd|v sd| v rt
d|}|r|d}q|dddd  }q|
 d| }g }d }|d}|r|	d}|rd |v r|}td!|  |s|d"}|r|	d}|rd |v r|}td#|  |s't
d$|}|r'|d }td%|  |r|d&dd'dd(d}|dsN|d)rId*| nd+| }d,|v rk|| |d,d-}|| td.|  n.d-|v r|d-d,}|| || td/|  n|| || td0|  td1|  g }g }t|D ])\}}d,|v rd2}nd-|v rd3}nd4|d  }|| |d5|  q|sd6g}d7g}t|dkr||d  d8 ||d  ||||d9|d9|d:}d|giW S  ty- } ztd;|  dd l} |   dg iW  Y d }~S d }~ww )<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  z|  std g t|ddddW S tjj|  ddd}t|dkr-| j d}n	| j d	| d
}|dd}| j|| j|dd}|j	dvratd|j
 d|j	  g t|ddddW S |jjdddd}t| g d}	t fdd|	D }
|
rtd| d| d g t|ddddW S g } d}| D ]}zm|d   }|sW q|ddpd}td|}|r|dnd}|r|d s| jd! d!|d! }|d"   pd#}|d$d%pd}|sW q|d!d& }|d
s|d
7 }|||||d' W q ty+ } ztd(| d) W Y d }~qd }~ww d}z4 d*}g }| D ]}|   }| rM|t| q9|rVt|}td| d+| d, W n ty~ } ztd-|  d}W Y d }~nd }~ww t|| }td| d| d.t| d/|  |t||t||dW S  ty } ztd0|  g t|ddddW  Y d }~S d }~ww )1Nu   搜索关键词不能为空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   encoded_keyZ
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   z;|d }|r| ds| jd d|d }| j }|ddi | j||dd}|jdd	}d
||j	gW S  t
yX } ztd|  g dW  Y d }~S d }~ww )Nr   r   rX   Acceptz@image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
   r   r+   
image/jpegr(   u   图片代理失败: )r(   r       )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 ]N}z!| j|| j|d}|jdv r|W   S td| d|j d W n! tyJ } ztd|d  d| d	|  W Y d }~nd }~ww ||k rTt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   

*
zSpider.fetch_with_retryNGETc                 C   s   |p| j }|pi }zD| dkrtj|||d|d}n| dkr,tj|||d|d}n
tj|||d|d}d|j dd v rH|j|_|W S d	|_|W S  tyu } zt	d
| d|  t
dtfddi |dW  Y d }~S d }~ww )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,     sR   
	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    