
    8hxS                        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e          Zedk    r$ e            Ze                                  ed           e                    d	
          Z ed eed                                ed eed                                ed           e                    ddd	d	          Z ed eed                                eded                      ed           e                    ddd          Z ed eed                                eded                     dS dS )    N)PyQueryz..)Spiderc                   p    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dS )r   c                     d| _         d| _        g d| _        d| j        d| _        d| _        ddd	d
d
d	ddd	ddd	ddd	d| _        d S )N   好色TV（优）https://hsex.icu/)r   zhttps://hsex1.icu/zhttps://hsex.tv/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/纯福利/PY1/好色tv.py__init__zSpider.__init__   s    '	'	 
  
  
 Py
 
  #);;"(??"'u==$*&AA%+6BB
 
    c                     | j         S N)r   r   s    r   getNamezSpider.getName%   s
    yr   r   c                 V    |                                  | _        | j        | j        d<   d S )Nr	   )get_fastest_hostr   r   )r   extends     r   initzSpider.init(   s)    ))++	"&)Yr   c                 B    sdS t          fddD                       S )NFc              3   D   K   | ]}|                                 v V  d S r   )lower).0fmturls     r   	<genexpr>z'Spider.isVideoFormat.<locals>.<genexpr>0   s0      SS#3#))++%SSSSSSr   )z.mp4z.m3u8z.flvz.avi)any)r   r)   s    `r   isVideoFormatzSpider.isVideoFormat-   s4     	5SSSS1RSSSSSSr   c                       fd}|S )Nc                                          |           sdS 	                     | j        dd          }|j        dv od|j                            dd          v S #  Y dS xY w)	NFHEAD   )r   methodr      .  videoContent-Typer   )r,   fetchr   status_codeget)r)   respr   s     r   checkz&Spider.manualVideoCheck.<locals>.check3   s{    %%c** uzz#t|FTUzVV':5i'T\EUEUVdfhEiEi:iiuus   AA A# )r   r;   s   ` r   manualVideoCheckzSpider.manualVideoCheck2   s#    	 	 	 	 	 r   c                 V    i g } fd} j         D ]B}t          j        ||f          }|                    |           |                                 C|D ]}|                                 d                                 D             }|r|d         d         n j         d         S )u*   测试候选域名，返回最快可用的c                    	 t          j                     }t          j        | j        dd          }|j        dv r t          j                     |z
  dz  }|| <   d S t          d          | <   d S #  t          d          | <   Y d S xY w)N   F)r   r   allow_redirectsr3   i-  r4   i  inf)timerequestsheadr   r8   float)r)   
start_timer:   delayresultsr   s       r   	test_hostz*Spider.get_fastest_host.<locals>.test_hostB   s    	,!Y[[
}S$,[`aaa#66!Y[[:5=E#(GCLLL#(<<GCLLL,$U||s   AA0 A0 0B)targetargsc                 B    g | ]\  }}|t          d           k    ||fS )rC   )rG   )r'   hds      r   
<listcomp>z+Spider.get_fastest_host.<locals>.<listcomp>U   s0    OOO$!QQ%,,=N=N1v=N=N=Nr   r   )r   	threadingThreadappendstartjoinitems)r   threadsrK   r   tvalid_hostsrJ   s   `     @r   r!   zSpider.get_fastest_host=   s    
	, 
	, 
	, 
	, 
	, 
	, ( 	 	D 	@@@ANN1GGIIII 	 	AFFHHHHOO'--//OOO$/L{1~a  T5I!5LLr   c                    i }g }| j                                         D ]#\  }}|                    ||d         d           $||d<   	 |                     | j        dd          j        }t          |          }g } |d          }	|	                                D ]}
	  |
d                                                                          }|s6 |
d	                              d
          pd}t          j
        d|          }|r|                    d          nd}|rG|                    d          s2| j                            d           d|                    d           } |
d                                                                          pd} |
d                              d          pd}|s"|                    d          d         }|                    d          s|dz  }|                    ||||d           s# t"          $ r}t%          d|            Y d }~d }~ww xY w||d<   n.# t"          $ r!}t%          d|            g |d<   Y d }~nd }~ww xY w|S )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   rW   rT   fetch_with_retryr   textpqstripattrresearchgroup
startswithrstriplstripsplitendswith	Exceptionprint)r   filterresultclassesr   infohtmldatavlistrW   itemtitlerd   	pic_matchrr   descrl   rp   es                      r   homeContentzSpider.homeContentX   s   ...00 	 	JD$NN!	?      "w-	 ((!Q(GGLDd88D ED233E     DJJOO--3355E  !  !DNN//88>BE "	*I5 Q QI4=Eiooa0002G Sw'9'9&'A'A S%)Y%5%5c%:%:"R"RW^^C=P=P"R"R  4,,113399;;GxD  499>>&117RD ! !ZZ__R0F!??622 )&(LL"($)#*'+	" "     !   =!==>>>HHHH #F6NN 	  	  	 ,,,---F6NNNNNN	  s]   AH= 1HH= C*H:H= <AHH= 
H4H/)H= /H44H= =
I(I##I(c                     g S r   r<   r   s    r   homeVideoContentzSpider.homeVideoContent   s    	r   c                    i }	 d }| j                                         D ]\  }}|d         |k    r|} n|sg |d<   |S |dk    r| j         d| d}	n| j         |d          d| d}	|                     |	| j        d          j        }
|
                    d	d
                              d	          }
t          |
          }g } |d          }|                                D ]}	  |d                                          	                                }|s6 |d          
                    d          pd}t          j        d|          }|r|                    d          nd}|rG|                    d          s2| j                            d           d|                    d           } |d                                          	                                pd} |d          
                    d          pd}|s"|                    d          d         }|                    d          s|dz  }|                    ||||d           s# t(          $ r}t+          d|            Y d }~d }~ww xY wd}	  |d          }g }|                                D ]^}|                                	                                }|                                r"|                    t/          |                     _|rt1          |          }n	#  d}Y nxY w||d<   ||d<   ||d<   t3          |          |d<   d |d!<   nB# t(          $ r5}t+          d"|            g |d<   ||d<   d|d<   d#|d<   d#|d!<   Y d }~nd }~ww xY w|S )$Nr   r
   zlist-rn   r   z_list-   r   r   utf-8ignoreerrorsra   rb   rc   rd   r   re   rf   rg   rh   ri   rj   rk   rl   rm   ro   u   解析分类视频项失败: .pagination1 li apage	pagecountlimiti?B totalu   分类解析失败: r   )r   rW   r   r7   r   ru   encodedecoderv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   rT   r   r   isdigitintmaxlen)r   tidpgr   r"   r   	cate_infor   r   r)   r   r   r   rW   r   r   rd   r   rr   r   rl   rp   r   r   
pagination	page_numsrk   ru   s                               r   categoryContentzSpider.categoryContent   sB   R	 I"n2244  
d	?c)) $IE *  !#v f}}11111KIl$;KK2KKK ::c4<:CCHD;;wx;88??HHDd88D ED233E   DJJOO--3355E  !  DNN//88>BE "	*I5 Q QI4=Eiooa0002G Sw'9'9&'A'A S%)Y%5%5c%:%:"R"RW^^C=P=P"R"R4,,113399;;GxD499>>&117RD ! !ZZ__R0F!??622 )&(LL"($)#*'+	" "     !   =!==>>>HHHH
 I
!T"566
	#))++ 4 4A6688>>++D||~~ 4!((T333 / #II			"F6NF6N"+F;!%jjF7O$F7OO 	  	  	 ,,,---F6NF6N"#F;F7OF7OOOOOO	  sz   9M B(M '1IM C*IM AIM 
I= I82M 8I==M BL M L+M 
N+M??Nc                 N   	 |r|d         sdg iS |d                                          }|                    d          s|dz  }| j         |                    d           }|                     |dd          j        }|                    dd	
                              d          }t          |          } |d                                                                           pd}d} |d          	                    d          pd}t          j        d|          }	|	r|	                    d          }|s  |d          	                    d          pd}|r3|                    d          s| j         |                    d           }d}
d} |d          }|                                D ]}|                                                                 }d|v sd|                                v r=|                    dd                              dd                                           }
d|v sd|                                v rit          j        d|          }|r|                    d          }|                    dd                              dd                                           }|
 d| }d}t          j        d|          }|r|                    d          }|s" |d           }|	                    d          pd}|st          j        d!|          }|r|d         }|r3|                    d          s| j         |                    d           }||||d"|rd#| nd$d%}d|giS # t$          $ r }t'          d&|            dg icY d }~S d }~ww xY w)'Nr   r
   rn   rh   r@   r   r_   r   r   r   z.panel-title, .video-title, h1u   未知标题r   z.vjs-posterrd   re   rf   z/.video-pic img, .vjs-poster img, .thumbnail imgsrcrg   rj   z6.panel-body .col-md-3, .video-info .info-item, .info pu   时长durationu	   时长：u   观看viewsu   (\d+\.?\d*[kK]?)次观看u	   观看：z | z(videoUrl\s*=\s*["\']([^"\']+\.m3u8)["\']z)source[src*=".m3u8"], source[src*=".mp4"]z"(https?://[^\s"\']+\.(?:m3u8|mp4))r   u   正片$u   正片$暂无地址)rp   rq   rr   rs   vod_play_fromvod_play_urlu   详情解析失败: )rw   r   r   r~   rt   ru   r   r   rv   rx   ry   rz   r{   r|   rW   r&   replacefindallr   r   )r   idsrp   r)   r   r   r   rr   poster_styler   r   r   
info_itemsr   ru   views_matchremarks	video_url
m3u8_matchsource
js_matchesvodr   s                          r   detailContentzSpider.detailContent   s8   F	  $c!f $|#V\\^^F??6** !& Y4c 2 244C((Aq(AAFD;;wx;88??HHDd88D D9::??AAGGII[^E G4..33G<<BL	"A<PPI -#//!,, d$PQQVVW\]]cac >w11&99 >!Y=s(;(;==  HEVWWJ"((** 	\ 	\yy{{((**t##zTZZ\\'A'A#||K<<DDXrRRXXZZHH%%DJJLL)@)@"$),H$"O"OK" \ + 1 1! 4 4 $[" = = E EhPR S S Y Y [ [!--e--G I#NPTUUJ 0&,,Q//	 5IJJ"KK..4"	 .Z(MtTT
 . *1I B!5!5f!=!= B#yA)*:*:3*?*?AA	 !!"&!49B ] 5) 5 5 5H] C SE?" 	  	  	 ,,,---B<	 s#   M: M)M: :
N$NN$N$rf   c           
      >	   	 |                                 s$t          d           g t          |          ddddS t          j                            |                                 dd          }| j         d}|t          |          d	}|                     || j        |d
          }|j	        dvr4t          d|j
         d|j	                    g t          |          ddddS |j                            dd                              d          }t          |          g d}	t          fd|	D                       }
|
r+t          d| d| d           g t          |          ddddS g } d          }|                                D ]}	  |d                                                                           }|s6 |d                              d          pd}t%          j        d|          }|r|                    d          nd}|rG|                    d          s2| j                            d           d|                    d           } |d                                                                           pd} |d                               d!          pd}|s"|                    d          d"         }|                    d#          s|d#z  }|                    ||||d$           s# t6          $ r}t          d%| d&           Y d }~d }~ww xY wd}	  d'          }g }|                                D ]^}|                                                                 }|                                r"|                    t          |                     _|rt;          |          }t          d| d(| d)           n+# t6          $ r}t          d*|            d}Y d }~nd }~ww xY wt=          |          |z  }t          d| d| d+t=          |           d,|            |t          |          |t=          |          |dS # t6          $ r1}t          d-|            g t          |          ddddcY d }~S d }~ww xY w).Nu   搜索关键词不能为空rf   r   )r
   r   r   r   r   r   r   )encodingr   z
search.htm)rz   r   r   )r)   r   paramsr   r2   u!   搜索页面请求失败，URL：u   ，状态码：r   r   )u   没有找到相关视频u   无搜索结果zNo results foundu   未找到匹配内容c              3   `   K   | ](} d | d| d                                           V  )dS )zdiv:contains("z"), p:contains("z")N)ru   )r'   ru   r   s     r   r*   z'Spider.searchContent.<locals>.<genexpr>X  sN      uu]aDD!P$!P!P!P!P!PQQVVXXuuuuuur   u   搜索关键词「u   」第u   页无结果ra   rb   rc   rd   r   re   zhttp://zhttps://rh   ri   u   未知时长rk   rl   rm   rn   ro   u!   解析单条搜索结果失败：u   （跳过该条）r   u   」分页解析完成，共u   页u'   解析分页失败（默认单页）：u   页处理完成，结果u   条，总页数u   搜索功能整体异常：)rw   r   r   urllibparsequoter   r7   r   r8   r)   ru   r   r   rv   r+   rW   rx   ry   rz   r{   r|   r}   r~   r   r   rT   r   r   r   r   )r   keyquickr   encoded_key
search_urlr   r:   r   no_result_texts	no_resultr   rW   r   r   rd   r   rr   r   rl   rp   r   r   r   r   rk   ru   r   r   s                               @r   searchContentzSpider.searchContent6  s   i	99;; ]3444 "CGG!aZ[\\\ !,,,SYY[[7S\,]]K !I111J%B F ::	   D z11e$(eeSWSceefff "CGG!aZ[\\\ 9##GH#==DDWMMDd88D {zzOuuuuetuuuuuI ]F3FFbFFFGGG "CGG!aZ[\\\ ED233E   DJJOO--3355E  !  DNN//88>BE "	*I5 Q QI4=Eiooa0002G Sw'9'9:Q'R'R S%)Y%5%5c%:%:"R"RW^^C=P=P"R"R4,,113399;;M~D499>>&117RD ! !ZZ__R0F!??622 )&(LL"($)#*'+	" "     !   SaSSSTTTHHHH
 I!T"566
	#))++ 4 4A6688>>++D||~~ 4!((T333 / #IIY3YY9YYYZZZZ   CCCDDD						
 JJ*Etstt"ttcRWjjttirttuuuB&U    	 	 	333444Bq	       	s   7Q! B*Q! &B	Q! 0$Q! 1LQ! C*L1Q! 3ALQ! 
L,L'!Q! 'L,,Q! 2B'O Q! 
P$O=8Q! =PAQ! !
R+&RRRc                     | j                                         }|                    | j        | j                            d          t
          j                            | j                  j        d           d||ddS )Nrh   )r	   OriginHostrf   T)r   r)   headerdouble)	r   copyupdater   r}   r   r   urlparsenetloc)r   flagidvipFlagsr   s        r   playerContentzSpider.playerContent  s    ,##%%yi&&s++L))$)44;
 
 	 	 	 	
 
 	
r   c                    	 |d         }|rG|                     d          s2| j                            d           d|                    d           }| j                                        }|                    ddi           |                     ||d          }|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   rh   Acceptz@image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
   r   r6   
image/jpegr3   u   图片代理失败: )r3   r   r   )r|   r   r}   r~   r   r   r   r7   r9   contentr   r   )r   paramr)   img_headersrescontent_typer   s          r   
localProxyzSpider.localProxy  s   	,,C C3>>*ABB C))#..BBCBB,++--K*lmnnn**S+r*BBC;??><HHLs{33 	, 	, 	,,,,---+++++++++	,s   B=C   
C*
C%C*%C*r@   r^   c           
         t          |dz             D ]}	 |                     dt          j                            |           | j        |          }|j        dv r|c S t          d| d|j         d           n2# t          $ r%}t          d|dz    d	| d
|            Y d }~nd }~ww xY w||k     rt          j
        d           t          dt          fddd          S )Nrf   .https://vpsdn.leuse.top/proxy?single=true&url=r   rB   u   请求u   返回状态码u   ，重试中...u   第u	   次请求u   失败: g      ?objr   i  )ru   r8   )ranger7   r   r   r   r   r8   r   r   rD   sleeptypeobject)r   r)   r`   r   ir:   r   s          r   rt   zSpider.fetch_with_retry  s3   uqy!! 		  		 A<zz"lSYS_SeSefiSjSj"l"luy  vB  LSz  T  T#66KKKTsTT43CTTTUUUU < < <:AaC::#::q::;;;;;;;;<5yy
3EF9r#&F&FGGGs   AA< A<<
B+B&&B+NGETc           
         |p| j         }|pi }	 |                                dk    r:t          j        dt          j                            |           ||d|          }n|                                dk    r:t          j        dt          j                            |           ||d|          }n9t          j        dt          j                            |           ||d|          }d|j                             dd	                                          v r|j	        |_
        nd
|_
        |S # t          $ r;}t          d| d|            t          dt          fd	di |d          cY d }~S d }~ww xY w)Nr   r   T)r   r   rA   r   r/   Fcharsetr6   r   r   u   网络请求失败(z): r   i  )ru   r8   r   r)   )r   upperrE   r9   r   r   r   rF   r&   apparent_encodingr   r   r   r   r   )r   r)   r   r   r1   r   r:   r   s           r   r7   zSpider.fetch  s   )T\2'	||~~&&|^V\EWEWX[E\E\^^##$(!   6))}]FLDVDVWZD[D[]]##$)!    |]FLDVDVWZD[D[]]##$(!   DL,,^R@@FFHHHH $ 6 'K 	 	 	33333444y"	+ +        	s   D!D1 1
E6;0E1+E61E6)r   )rf   )r@   r^   )Nr^   r   N)__name__
__module____qualname__r   r   r#   r,   r=   r!   r   r   r   r   r   r   r   rt   r7   r<   r   r   r   r      s!       
 
 
0  , , , ,
T T T
	 	 	M M M69 9 9v  U U UnG  G  G Rj j j jX
 
 
 , , ,"H H H H* * * * * *r   r   __main__u   === 测试首页 ===r   )r   u   首页分类数：r]   u   首页视频数：r
   u(   
=== 测试视频分类（第1页） ===rf   )r   r   r   r"   u   视频分类第1页视频数：u   视频分类总页数：r   u-   
=== 测试搜索（关键词：测试） ===u   测试F)r   r   r   u   搜索结果数：u   搜索总页数：)ry   sysurllib.parser   rR   rD   rE   pyqueryr   rv   pathrT   base.spiderr   r   spiderr#   r   r   	home_datar   r   	cate_datar   search_datar<   r   r   <module>r      s@   				 



           ! ! ! ! ! !          n n n n nV n n nh zVXXF
KKMMM 
E
 !!!""""--I	E
8ss9W#566
8
8999	E
7ss9V#455
7
7888 
E
5666&&6a2&NNI	E
DCC	&0A,B,B
D
DEEE	E
=Y{%;
=
=>>> 
E
:;;;&&85Q&GGK	E
9ss;v#677
9
9:::	E
9{;7
9
9:::::+ r   