
    uh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	 ej                  j                  d       d dlmZ  G d de      Zy)    N)PyQueryz..)Spiderc                   n    e Zd Zd Zd ZddZd Zd Zd Zd Z	d Z
d	 Zd
 ZddZd Zd ZddZddZy)r   c                     d| _         d| _        dg| _        d| j                  d| _        d| _        dddd	d	dd
d
dddddddd| _        y )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_suffixtop7top5minlong)u   视频u   周榜u   月榜u   5分钟+u	   10分钟+)namehostcandidate_hostsheaderstimeout	class_mapselfs    &   /storage/emulated/0/lz/py/sy/好色.py__init__zSpider.__init__   so    '	.	& 
 Pyy
  #);"(?"'u=$*&A%+6B
    c                     | j                   S N)r   r   s    r   getNamezSpider.getName#   s    yyr   c                 `    | j                         | _        | j                  | j                  d<   y )Nr   )get_fastest_hostr   r   )r   extends     r   initzSpider.init&   s$    ))+	"&))Yr   c                 2    syt        fddD              S )NFc              3   B   K   | ]  }|j                         v   y wr   )lower).0fmturls     r   	<genexpr>z'Spider.isVideoFormat.<locals>.<genexpr>.   s     S1R#3#))+%1Rs   )z.mp4.m3u8z.flvz.avi)any)r   r'   s    `r   isVideoFormatzSpider.isVideoFormat+   s    S1RSSSr   c                       fd}|S )Nc                     j                  |       sy	 j                  | j                  dd      }|j                  dv xr d|j                  j	                  dd      v S #  Y yxY w)	NFHEAD   )r   methodr      .  videoContent-Typer	   )r+   fetchr   status_codeget)r'   respr   s     r   checkz&Spider.manualVideoCheck.<locals>.check1   sl    %%c*zz#t||FTUzV'':5i'T\\EUEUVdfhEi:iis   AA" "A& )r   r:   s   ` r   manualVideoCheckzSpider.manualVideoCheck0   s    	 r   c                     i g } fd} j                   D ];  }t        j                  ||f      }|j                  |       |j	                          = |D ]  }|j                           j                         D cg c]  \  }}|t        d      k7  s||f }}}|r|d   d   S  j                   d   S c c}}w )u*   测试候选域名，返回最快可用的c                    	 t        j                          }t        j                  | j                  dd      }|j                  dv r t        j                          |z
  dz  }|| <   y t        d      | <   y #  t        d      | <   Y y xY w)N   F)r   r   allow_redirectsr2   i-  r3   i  inf)timerequestsheadr   r7   float)r'   
start_timer9   delayresultsr   s       r   	test_hostz*Spider.get_fastest_host.<locals>.test_host@   sy    	,!YY[
}}S$,,[`a##6!YY[:5=E#(GCL#(<GCL,$U|s   A$A7 (A7 7B	)targetargsrB   r   )r   	threadingThreadappendstartjoinitemsrF   )	r   threadsrJ   r   thdvalid_hostsrI   s	   `       @r   r   zSpider.get_fastest_host;   s    
	, ((D  	@ANN1GGI ) AFFH  +2--/O/$!QQ%,=N1v/O$/{1~a LT5I5I!5LL Ps   B:B:c                 H   i }g }| j                   j                         D ]  \  }}|j                  ||d   d        ||d<   	 | j                  | j                  dd      j
                  }t        |      }g } |d      }	|	j                         D ]9  }
	  |
d      j                         j                         }|s, |
d	      j                  d
      xs d}t        j                  d|      }|r|j                  d      nd}|r@|j                  d      s/| j                  j                  d       d|j                  d       } |
d      j                         j                         xs d} |
d      j                  d      xs d}|s|j                  d      d   }|j!                  d      s|dz  }|j                  ||||d       < ||d<   |S # t"        $ r}t%        d|        Y d }~ad }~ww xY w# t"        $ r}t%        d|        g |d<   Y d }~|S d }~ww xY w)Nr
   )	type_namer
   classr?      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   rR   rO   fetch_with_retryr   textpqstripattrresearchgroup
startswithrstriplstripsplitendswith	Exceptionprint)r   filterresultclassesr   infohtmldatavlistrR   itemtitlera   	pic_matchro   descri   rm   es                      r   homeContentzSpider.homeContentV   s(   ....0JD$NN!	?  1
 "w-	 ((!Q(GLLDd8D E23E JOO-335E   !N//8>BE "		*I5 QI4=iooa02Gw'9'9&'A%)YY%5%5c%:$;1W^^C=P<Q"R  ,11399;GxD  9>>&17RD !ZZ_R0F!??62&(LL"($)#*'+	" 1 &D #F6N  ! 9!=>
  	 (,-F6N	 s]   AG: &G<G: =CG
G: A GG: 	G7G2,G: 2G77G: :	H!HH!c                     g S r   r;   r   s    r   homeVideoContentzSpider.homeVideoContent   s    	r   c                 @   i }	 d }| j                   j                         D ]  \  }}|d   |k(  s|} n |sg |d<   |S |dk(  r| j                   d| d}	n| j                   |d    d| d}	| j                  |	| j                  d      j
                  }
|
j                  d	d
      j                  d	      }
t        |
      }g } |d      }|j                         D ]9  }	  |d      j                         j                         }|s, |d      j                  d      xs d}t        j                  d|      }|r|j                  d      nd}|r@|j                  d      s/| j                  j                  d       d|j!                  d       } |d      j                         j                         xs d} |d      j                  d      xs d}|s|j#                  d      d   }|j%                  d      s|dz  }|j'                  ||||d       < d}	  |d      }g }|j                         D ]K  }|j                         j                         }|j-                         s2|j'                  t/        |             M |rt1        |      }||d<   ||d<   ||d<   t3        |      |d<   d |d!<   |S # t(        $ r}t+        d|        Y d }~d }~ww xY w#  d}Y OxY w# t(        $ r2}t+        d"|        g |d<   ||d<   d|d<   d#|d<   d#|d!<   Y d }~|S d }~ww xY w)$Nr
   r   zlist-rk   r   z_list-   r   r   utf-8ignoreerrorsr^   r_   r`   ra   r	   rb   rc   rd   re   rf   rg   rh   ri   rj   rl   u   解析分类视频项失败: .pagination1 li apage	pagecountlimiti?B totalu   分类解析失败: r   )r   rR   r   r6   r   rr   encodedecoders   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   rO   r~   r   isdigitintmaxlen)r   tidpgr   r    r   	cate_infor   r   r'   r   r   r   rR   r   r   ra   r   ro   r   ri   rm   r   r   
pagination	page_numsrh   rr   s                               r   categoryContentzSpider.categoryContent   sB   R	 I"nn224
d	?c) $I 5
 !#v f}5D1Il$;#<F2$dK ::c4<<:CHHD;;wx;8??HDd8D E23E JOO-335E   N//8>BE "		*I5 QI4=iooa02Gw'9'9&'A%)YY%5%5c%:$;1W^^C=P<Q"R,11399;GxD9>>&17RD !ZZ_R0F!??62&(LL"($)#*'+	" + &@ I
!"56
	#))+A668>>+D||~!((T3 ,  #II #F6NF6N"+F;!%jF7O$F7O = ! 9!=>	  	 (,-F6NF6N"#F;F7OF7O	 s   *K" K" B"K"  &J4K" CJ4K" A J4K" AK ')K "K" 4	K=KK" KK" KK" "	L+'LLc                 0
   	 |r|d   sdg iS |d   j                         }|j                  d      s|dz  }| j                   |j                  d       }| j	                  |dd      j
                  }|j                  dd	
      j                  d      }t        |      } |d      j                         j                         xs d}d} |d      j                  d      xs d}t        j                  d|      }	|	r|	j                  d      }|s |d      j                  d      xs d}|r0|j                  d      s| j                   |j                  d       }d}
d} |d      }|j                         D ]  }|j                         j                         }d|v sd|j                         v r1|j!                  dd      j!                  dd      j                         }
hd|v sd|j                         v st        j                  d|      }|r|j                  d      }|j!                  dd      j!                  dd      j                         } |
 d| }g }d } |d      }|r'|j                  d      }|rd |v r|}t#        d!|        |s1 |d"      }|r'|j                  d      }|rd |v r|}t#        d#|        |s+t        j$                  d$|      }|r|d   }t#        d%|        |r|j!                  d&d      j!                  d'd      j!                  d(d      }|j                  d      s|j                  d)      rd*| nd+| }d,|v rC|j'                  |       |j!                  d,d-      }|j'                  |       t#        d.|        nwd-|v rC|j!                  d-d,      }|j'                  |       |j'                  |       t#        d/|        n0|j'                  |       |j'                  |       t#        d0|        t#        d1|        g }g }t)        |      D ]@  \  }}d,|v rd2}nd-|v rd3}nd4|dz    }|j'                  |       |j'                  d5|        B |sd6g}d7g}t+        |      dk(  r+|j'                  |d    d8       |j'                  |d          ||||d9j-                  |      d9j-                  |      d:}d|giS # t.        $ r0}t#        d;|        dd l} | j3                          dg icY d }~S d }~ww xY w)<Nr   r   rk   re   r?   r   r\   r   r   r   z.panel-title, .video-title, h1u   未知标题r	   z.vjs-posterra   rb   rc   z/.video-pic img, .vjs-poster img, .thumbnail imgsrcrd   rg   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$$$)rm   rn   ro   rp   vod_play_fromvod_play_urlu   详情解析失败: )rt   r}   r   r{   rq   rr   r   r   rs   ru   rv   rw   rx   ry   rR   r$   replacer   findallrO   	enumerater   rQ   r~   	traceback	print_exc)!r   idsrm   r'   r   r   r   ro   poster_styler   r   r   
info_itemsr   rr   views_matchremarks
video_urls	found_urlvideo_element	video_srcsource_element
source_srcm3u8_matches
second_url	play_fromplay_urli	video_url	line_namevodr   r   s!                                    r   detailContentzSpider.detailContent   sY   J	 c!f|#V\\^F??6*& YYKc 234C((Aq(AFFD;;wx;8??HDd8D 9:??AGGI[^E G.33G<BL		"A<PI#//!,PQVVW\]cacw11&9!YYKs(;'<=  HEVWJ"((*yy{((*t#zTZZ\'A#||K<DDXrRXXZH%DJJL)@"$)),H$"OK" + 1 1! 4 $[" = E EhPR S Y Y [ + "
#eW-G J I !!=>M)..u5	I!5 )I8DE !%&;!<!!/!4!4U!;J!g&;$.	 =i[IJ !zz*NPTU ,QI6ykBC %--eS9AA)SQYYZ_acd	 ++F38A8L8LT8R& 4ZbclbmXnI "Y.%%i0!*!2!2>9!MJ%%j1-j\:;)+!*!2!29n!MJ%%j1%%i0,ZL9: %%i0%%i00<=(56 IH )* 59!Y. *I)+ +I"(1I  +') 56 !6 'L	78 9~"  IaL>!9:, !!"&!&I!6 %

8 4C SE?" 	 (,-!B<		 s*   
S G*S 8K#S 	T%%T
TTc           
      *   	 |j                         st        d       g t        |      ddddS t        j                  j                  |j                         dd      }t        |      dk(  r| j                   d}n| j                   d	| d
}|dd}| j                  || j                  |d      }|j                  dvr6t        d|j                   d|j                          g t        |      ddddS |j                  j                  dd      j                  d      }t        |      g d}	t        fd|	D              }
|
r#t        d| d| d       g t        |      ddddS g } d      }|j!                         D ]9  }	  |d      j                         j                         }|s, |d      j#                  d      xs d}t%        j&                  d|      }|r|j)                  d      nd}|r@|j+                  d      s/| j                  j-                  d        d |j/                  d        } |d!      j                         j                         xs d"} |d#      j#                  d$      xs d}|s|j1                  d       d%   }|j3                  d
      s|d
z  }|j5                  ||||d&       < d}	  d)      }g }|j!                         D ]K  }|j                         j                         }|j9                         s2|j5                  t        |             M |rt;        |      }t        d| d*| d+       t=        |      |z  }t        d| d| d-t=        |       d.|        |t        |      |t=        |      |dS # t6        $ r}t        d'| d(       Y d }~-d }~ww xY w# t6        $ r}t        d,|        d}Y d }~d }~ww xY w# t6        $ r)}t        d/|        g t        |      ddddcY d }~S d }~ww xY w)0Nu   搜索关键词不能为空rc   r   )r   r   r   r   r   r   r   )encodingr   z
search.htmzsearch-rk   new)rw   sortr   )r'   r   paramsr   r1   u!   搜索页面请求失败，URL：u   ，状态码：r   r   )u   没有找到相关视频u   无搜索结果zNo results foundu   未找到匹配内容c              3   X   K   | ]!  } d | d| d      j                          # yw)zdiv:contains("z"), p:contains("z")N)rr   )r%   rr   r   s     r   r(   z'Spider.searchContent.<locals>.<genexpr>  s3     uet]aD>$7GvR!PQVVXets   '*u   搜索关键词「u   」第u   页无结果r^   r_   r`   ra   r	   rb   zhttp://r   re   rf   u   未知时长rh   ri   rj   rl   u!   解析单条搜索结果失败：u   （跳过该条）r   u   」分页解析完成，共u   页u'   解析分页失败（默认单页）：u   页处理完成，结果u   条，总页数u   搜索功能整体异常：)rt   r   r   urllibparsequoter   r6   r   r7   r'   rr   r   r   rs   r*   rR   ru   rv   rw   rx   ry   rz   r{   r|   r}   rO   r~   r   r   r   )r   keyquickr   encoded_key
search_urlr   r9   r   no_result_texts	no_resultr   rR   r   r   ra   r   ro   r   ri   rm   r   r   r   r   rh   rr   r   r   s                               @r   searchContentzSpider.searchContentx  s,   r	99;34 "CG!aZ[\\ !,,,,SYY[7S\,]K 2w!| $		{*5
 !%		{'"T:
 &F ::	  D z19$((?SWScScRdef "CG!aZ[\\ 99##GH#=DDWMDd8D {OuetuuI*3%vbTFG "CG!aZ[\\ E23E JOO-335E   N//8>BE "		*I5 QI4=iooa02Gw'9'9:Q'R%)YY%5%5c%:$;1W^^C=P<Q"R,11399;M~D9>>&17RD !ZZ_R0F!??62&(LL"($)#*'+	" + &@ I!"56
	#))+A668>>+D||~!((T3 ,  #II*3%/J9+UXYZ J*E&se6"5McRWj\YhirhstuB&U / ! =aS@RST   ?sCD	  	/s34B 	s   +O  CO  7A3O  +O  
&N0O  1CN>O  ?A N?O  AN: ;N: AO  	N7N2,O  2N77O  :	OOO  OO   	P)PPPc                    | j                   j                         }|j                  | j                  | j                  j	                  d      t
        j                  j                  | j                        j                  d       d||ddS )Nre   )r   OriginHostrc   T)r   r'   headerdouble)	r   copyupdater   rz   r   r   urlparsenetloc)r   flagidvipFlagsr   s        r   playerContentzSpider.playerContent  sr    ,,##%yyii&&s+LL))$))4;;
 	 	
 	
r   c                    	 |d   }|r@|j                  d      s/| j                  j                  d       d|j                  d       }| j                  j                         }|j                  ddi       | j                  ||d      }|j                  j                  dd	      }d
||j                  gS # t        $ r}t        d|        g dcY d }~S d }~ww xY w)Nr'   r   re   Acceptz@image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
   r   r5   
image/jpegr2   u   图片代理失败: )r2   r   r   )ry   r   rz   r{   r   r   r   r6   r8   contentr~   r   )r   paramr'   img_headersrescontent_typer   s          r   
localProxyzSpider.localProxy  s    	,,C3>>*AB))#./qC0AB,,++-K*lmn**S+r*BC;;??><HLs{{33 	,(,-++	,s   B2B5 5	C>CCCc           
      |   t        |dz         D ]j  }	 | j                  || j                  |      }|j                  dv r|c S t	        d| d|j                   d       ||k  sVt        j                  d
       l t        dt        fddd      S # t
        $ r!}t	        d|dz    d| d	|        Y d }~Wd }~ww xY w)Nrc   r   rA   u   请求u   返回状态码u   ，重试中...u   第u	   次请求u   失败: g      ?objr	   i  )rr   r7   )
ranger6   r   r7   r   r~   rC   sleeptypeobject)r   r'   r]   r   r   r9   r   s          r   rq   zSpider.fetch_with_retry  s    uqy!A<zz#t||WzM##6Kse?43C3C2DOTU 5y

3 " EF9r#&FGG	  <AaC5	#hqc:;;<s   -BB	B;B66B;Nc           
      (   |xs | j                   }|xs i }	 |j                         dk(  rt        j                  |||d|      }nH|j                         dk(  rt        j                  |||d|      }nt        j                  |||d|      }d|j                   j                  dd      j                         v r|j                  |_        |S d	|_        |S # t        $ r2}t        d
| d|        t        dt        fddi |d      cY d }~S d }~ww xY w)NGETT)r   r   r@   r   r.   Fcharsetr5   r	   r   u   网络请求失败(z): r   i  )rr   r7   r   r'   )r   upperrD   r8   rE   r$   apparent_encodingr   r~   r   r   r   )r   r'   r   r   r0   r   r9   r   s           r   r6   zSpider.fetch  s%   )T\\2(	||~&||##$(! 6)}}##$)!  ||##$(! DLL,,^R@FFHH $ 6 6 K !(K 	'uCs34y"	+  	s$   B4C C 	D'DDD)r	   )rc   )r?   r[   )Nr[   r   N)__name__
__module____qualname__r   r   r!   r+   r<   r   r   r   r   r   r   r   r   rq   r6   r;   r   r   r   r      sW    
,,
T
	M69vUnK Zsj
,"H+r   r   )rv   sysurllib.parser   rM   rC   rD   pyqueryr   rs   pathrO   base.spiderr   r;   r   r   <module>r     s;    	 
     !   yV yr   