
    4hCq                         d dl Z e j                            d           d dlm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 d dlmZ  G d de          Zedk    r d dlmZ  ej         e                       dS dS )	    Nz..)Spider)etree)urljoinc                       e Zd Zd ZddZd ZddZd Zd Zd	 Z	d
 Z
d ZddZd Zd Zd Zd ZddZd dZd Zd Zd Zd Zd!dZdS )"r   c                     dS )Nu   苹果视频 selfs    +   /storage/emulated/0/纯福利/PY1/香蕉.pygetNamezSpider.getName   s    ~     c                     d| _         d| _        ddddd| j         d| _        g d	| _        |                     d
| j                     d S )Nzhttps://618041.xyzzhttps://h5.xxoo168.orgzsMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36zJtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8zzh-CN,zh;q=0.9,en;q=0.8zgzip, deflatez
keep-alive)z
User-AgentAcceptzAccept-LanguagezAccept-Encoding
ConnectionReferer)1314335332529u,   苹果视频爬虫初始化完成，主站: )hostapi_hostheadersspecial_categorieslog)r
   extends     r   initzSpider.init   si    (	0 Pb8.&y
 
 #M"L"LK	KKLLLLLr   c                 f    	 t          j        |          S #  |                     d           Y dS xY w)u(   将HTML内容转换为可查询的对象u   HTML解析失败N)r   HTMLr   )r
   contents     r   htmlzSpider.html"   s:    	:g&&&	HH'(((44s    0   c                     	 t          j        ||t           j                  }|r:t          |                                          |k    r|                    |          S n#  Y nxY wdS )u   正则表达式提取字符串r   )research
IGNORECASElengroupsgroup)r
   patternstringindexmatchs        r   regStrzSpider.regStr*   sd    	Igvr}==E *U\\^^,,55{{5)))	Drs   AA A#c                     d S Nr   )r
   urls     r   isVideoFormatzSpider.isVideoFormat4       r   c                     d S r3   r   r	   s    r   manualVideoCheckzSpider.manualVideoCheck7   r6   r   c                    i }ddddddddddd	dd
ddddddddddddddddddddddddddddddddd d!dd"d#dd$d%dg}||d&<   	 |                      | j        | j        '          }|                     |j                  }|                     |d()          }||d*<   nA# t          $ r4}|                     d+t          |                      g |d*<   Y d,}~nd,}~ww xY w|S )-u   获取首页内容和分类618041.xyz_1   全部视频type_id	type_name618041.xyz_13   香蕉精品618041.xyz_22   制服诱惑618041.xyz_6   国产视频618041.xyz_8   清纯少女618041.xyz_9   辣妹大奶618041.xyz_10   女同专属618041.xyz_11   素人出演618041.xyz_12   角色扮演618041.xyz_20   人妻熟女618041.xyz_23   日韩剧情618041.xyz_21   经典伦理618041.xyz_7   成人动漫618041.xyz_14   精品二区618041.xyz_53   动漫中字618041.xyz_52   日本无码618041.xyz_33   中文字幕618041.xyz_32   国产自拍classr      limitlistu   首页获取出错: N)	fetchr   r   r$   text_get_videos	Exceptionr   str)r
   filterresultclassesrspdocvideoses           r   homeContentzSpider.homeContent:   s    '^DD'nEE'nEE&^DD&^DD&^DD'nEE'nEE'nEE'nEE'nEE'nEE&^DD'nEE'nEE'nEE'nEE'nEE%
( "w	 **TY*==C))CH%%C%%c%44F#F6NN 	  	  	 HH4CFF44555F6NNNNNN	  s   AB+ +
C)5*C$$C)c                     ddddddddddd	d
ddddddddddddddddddddddddddddddddd dd!d"dd#d$dd%d&dgiS )'u   分类定义 - 兼容性方法ra   r:   r;   r<   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   r   r	   s    r   homeVideoContentzSpider.homeVideoContent]   s     *HH+.II+.II*HH*HH*HH+.II+.II+.II+.II+.II+.II*HH+.II+.II+.II+.II+.II%
 	
r   c                    	 |                     d          \  }}d| d| d}|r |dk    r|                    dd| d          }|                     d|            |                     || j                  }|                     |j                  }	|                     |	|d	
          }
d}d}|
t          |          |d	|dS # t          $ r3}|                     dt          |                      dg icY d}~S d}~ww xY w)u0   分类内容 - 修改为使用固定页数设置_https://z/index.php/vod/type/id/.html1/page/u   访问分类URL: rb   rc   )category_idre   i  iN  rf   page	pagecountre   totalu   分类内容获取出错: rf   N)splitreplacer   rg   r   r$   rh   ri   intrj   rk   )r
   tidpgrl   r   domainr=   r4   ro   rp   rq   r   r   rr   s                 r   categoryContentzSpider.categoryContentv   sM   	 !iinnOFGJVJJGJJJC ?bCiikk'+=B+=+=+=>>HH...///**S$,*77C))CH%%C%%cwb%IIF IE B&    	  	  	 HH:#a&&::;;;B<	 s   CC 
D(C<6D<Drz   c                    	 | j          dt          j                            |           d| d}|                     d|            |                     || j                  }|r|j        dk    r|                     d           dg iS |                     |j	                  }|s|                     d	           dg iS | 
                    |d
          }d}d}	|                    d          }
|
rt          |
          dk    r|	 d}|
D ].}|                    d          d         }d|j	        v sd|v r|} n/|r>t          j        d|          }|r't          |                    d                    }|d
z  }	n#  Y nxY w|t          |          |d
|	dS # t"          $ r3}|                     dt%          |                      dg icY d}~S d}~ww xY w)u   搜索功能 - 完全修复版z/index.php/vod/type/id/1/wd/r{   ry   u   搜索URL: rb      u   搜索请求失败rf   u   搜索页面解析失败rc   rd      d   z//div[@class="mypage"]/ar   N./@hrefu   尾页zpage/z/page/(\d+)\.htmlr%   r}   u   搜索出错: )r   urllibparsequoter   rg   r   status_coder$   rh   ri   xpathr*   r'   r(   r   r,   rj   rk   )r
   keyquickr   
search_urlro   rp   rq   r   r   page_elements	last_pageelemhref
page_matchrr   s                   r   searchContentzSpider.searchContent   sX   6	  Ikk6<CUCUVYCZCZkkbdkkkJHH/://000 **Z*>>C $#/S00-...|# ))CH%%C $3444|# %%c%44F IE  II&@AAM ]!3!3a!7!7 $I - " "#zz)44Q7#ty00GtOO(,I!E 5D ! 3%'Y/CY%O%O
% 3(+J,<,<Q,?,?(@(@I$-NED B&    	  	  	 HH.c!ff..///B<	 sD   BF 	4F >AF A3E8 7F 8E<:F 
G(GGGc           	         	 |d         }|                     d          rL|                    d          }t          |          dk    r#|d         }|d         }d                    |dd                   }t          j                            |          }|                     d	|            t          j                            |          }t          j        	                    |j
                  }	|	                    d
dg          d         }
|	                    ddg          d         }|	                    ddg          d         }|                     |          }d|||dddd| dgiS d|v r@t          |                    d                    dk    r|                    d          \  }}}n|                    d          \  }}d| d| d}|                     d|            |                     || j                  }|                     |j                  }|                     ||j        |          }|rd|gindg iS # t$          $ r3}|                     dt'          |                      dg icY d}~S d}~ww xY w)u0   详情页面 - 特别处理特殊分区的链接r   special_rw      r%         N)   特殊分区视频，直接使用链接: vr   bmrf   u   直接播放   第1集$)vod_idvod_namevod_picvod_remarksvod_yearvod_play_fromvod_play_urlrx   z/index.php/vod/detail/id/ry   u   访问详情URL: rb   u   详情获取出错: )
startswithr   r*   joinr   r   unquoter   urlparseparse_qsqueryget_decrypt_titlerg   r   r$   rh   _get_detailrj   rk   )r
   idsvidpartsr|   video_idencoded_urlplay_url
parsed_urlquery_params	video_urlpic_urltitle_encryptedtitler   
detail_urlro   rp   
video_inforr   s                       r   detailContentzSpider.detailContent   s   4	 a&C ~~j)) 		#u::??"'(K$QxH"%((59"5"5K%|33K@@HHHSSSTTT "(!6!6x!@!@J#)<#8#89I#J#JL , 0 0rd ; ;A >I*..sRD99!<G&2&6&6sRD&A&A!&DO !//@@E &)(-'.+-(*-;,Ax,A,A" " !
 
 czzc#))C..11A5503		#-XX#&99S>> TFTTXTTTJHH555666**Z*>>C))CH%%C))#sx==J-7IFZL))fb\I 	  	  	 HH4CFF44555B<	 s%   E)I ,CI 
J(I>8J>Jc                  
   	 |                      d| d|            |                    d          rR|                    d          }t          |          dk    r)|d         }|d         }d                    |dd	                   }t
          j                            |          }|                      d
|            t
          j                            |          }	t
          j        	                    |	j
                  }
|
                    ddg          d         }|rc|                    d          rd|z   }n*|                    d          st          | j        |          }|                      d|            dd|dS |                    d          r|                      d           t
          j                            |          }	t
          j        	                    |	j
                  }
|
                    ddg          d         }|s|
D ]}|dv r|
|         d         } n|rt
          j                            |          }|                    d          rd|z   }n*|                    d          st          | j        |          }|                      d|            dd|dS |                      d           |                     || j                  }|rE|j        dk    r:|                     |j                  }|r|                      d|            dd|dS |                      d           dd|dS |                    d          dk    r&|                    d          }|d         }|d         }n|                    d          d         }d}|                      d| d|            || j        v r|                      d           | j         d| d }|                     || j                  }|rE|j        dk    r:|                     |j                  }|r|                      d!|            dd|dS |                      d"           |                     ||          S |                      d#           |                     ||          S # t,          $ rf}|                      d$t/          |                      d|v r!|                    d          \  }}d%| d&| }n| j         d&| }dd|dcY d	}~S d	}~ww xY w)'u0   播放链接 - 特别处理特殊分区的链接u   获取播放链接: flag=z, id=r   rw   r   r%   r   r   Nr   r   r   r   //https:httpu)   从特殊链接中提取到视频地址: r   playUrlr4   u*   ID 是一个完整URL，直接解析参数)r4   srcfileu(   从 URL 参数中提取到视频地址: u7   URL 中没有找到视频参数，尝试从页面提取rb   r   u    从页面提取到视频地址: u3   无法从页面提取视频链接，返回原始URLu
   视频ID: u   , 分类ID: u9   特殊分类，尝试从详情页提取直接播放链接z/index.php/vod/play/id/ry   u&   从播放页面提取到视频地址: u-   从播放页面提取失败，尝试API方式u!   使用API方式获取视频地址u   播放链接获取出错: rx   /html/kkyd.html?m=)r   r   r   r*   r   r   r   r   r   r   r   r   r   r   rg   r   r   _extract_direct_video_urlrh   countr   _get_video_by_apirj   rk   )r
   flagidvipFlagsr   r|   r   r   r   r   r   r   r   ro   play_page_urlrr   r   play_ids                     r   playerContentzSpider.playerContent  s   o	@HH@@@B@@AAA }}Z(( Mu::??"'(K$QxH"%((59"5"5K%|33K@@HHHSSSTTT "(!6!6x!@!@J#)<#8#89I#J#JL , 0 0rd ; ;A >I  M$//55 F(09(<II!*!5!5f!=!= F(/	9(E(EI!XY!X!XYYY)*r)LLL }}V$$ %BEFFF#\22266
%|44Z5EFF ),,S2$77:	  "+ " ""888(4S(9!(<I!E 9  B & 4 4Y ? ?I ++D11 B$,y$8		&11&99 B$+DIy$A$A	HHS	SSTTT%&2iHHHHHVWWW**R*>>C Qs#55$($B$B38$L$L	$ Q HH%S	%S%STTT-.2i#P#PPHHRSSS%&2bAAA xx}}!! 9#Ah88C==, HHE(EEEEFFF d555TUUU#'9 T TX T T T jjjEE M3?c11 $ > >sx H HI  M!U)!U!UVVV)*r)LLL HIII--b(;;; <===--b(;;; 	@ 	@ 	@HH:#a&&::;;;byy"$((3--IfIIII"i??2??2h????????	@sF   FR D)R /A7R 'R DR *R 2*R 
T'ATTTc                    	 | j          d| }|                     d|            | j                                        }|                    | j         d| j        dd           |                     ||          }|r|j        dk    r|                                }|                     d|            |	                    d	          d
k    r+|	                    di           	                    dd          }n*|	                    di           	                    dd          }|r4|
                    dd          }|                     d|            dd|dS |                     d           n!|                     d|r|j        nd            d|v r!|                    d          \  }}	d| d|	 }
n| j         d| }
|                     d|
            dd|
dS # t          $ rf}|                     dt          |                      d|v r!|                    d          \  }}	d| d|	 }
n| j         d| }
dd|
dcY d}~S d}~ww xY w)u   通过API获取视频地址z/api/v2/vod/reqplay/u   请求API获取视频地址: /XMLHttpRequest)r   OriginzX-Requested-Withrb   r   u   API响应: retcoder   datahttpurl_previewr   httpurlz?300u   从API获取到视频地址: r   r   u$   API响应中没有找到视频地址u   API请求失败，状态码: u	   无响应rw   rx   r   u)   API请求失败，回退到播放页面: r%   u   API方式获取视频出错: N)r   r   r   copyupdater   rg   r   jsonr   r   r   rj   rk   )r
   r   r   api_urlapi_headersapi_responser   r   r   r   r   rr   s               r   r   zSpider._get_video_by_apiw  s   -	@FFHFFGHH>W>>???,++--K"i???)$4        ::g{:CCL v 8C ? ?#((**-t--...88I&&!++ $ 4 4 8 89JB O OII $ 4 4 8 8B G GI E ) 1 1&" = =IHHHYHHIII%&2iHHHHHCDDDDtUa9r9Q9Qgrttuuubyy"$((3--IfIIII"i??2??HHKKKLLL2h??? 	@ 	@ 	@HH=SVV==>>>byy"$((3--IfIIII"i??2??2h????????	@s&   EG BG 
I)AI
I
Ic                    	 g d}|D ]}t          j        ||t           j                  }|D ]}t          |t                    r|d         }|                    dd          }t          j                            |          }|	                    d          rd|z   }o|	                    d          r|c c S dS # t          $ r0}|                     d	t          |                      Y d}~dS d}~ww xY w)
u4   从HTML内容中提取直接播放链接 (优化版))zv=([^&]+\.(?:m3u8|mp4))z-"url"\s*:\s*["\']([^"\']+\.(?:mp4|m3u8))["\']z+src\s*=\s*["\']([^"\']+\.(?:mp4|m3u8))["\']zhttp[^\s<>"\'?]+\.(?:mp4|m3u8)r   \r   r   r   r   Nu   提取直接播放URL出错: )r'   findallr)   
isinstancetupler   r   r   r   r   rj   r   rk   )r
   html_contentpatternsr-   matchesr0   extracted_urlrr   s           r   r   z Spider._extract_direct_video_url  s8   	  H $ - -*WlBMJJ$ 	- 	-E!%// ) %a$)MM$$;$;M$*L$8$8$G$GM$//55 -(0=(@&11&99 -,,,,,,-	- 4 	 	 	HH=SVV==>>>44444	s   B3B: 6B: :
C4%C//C4Nc                 ~   	 g }|                     d          }|                     dt          |           d           |D ]/}|                     ||          }|r|                    |           0|r|r
|d|         n|S # t
          $ r1}|                     dt          |                      g cY d}~S d}~ww xY w)u-   获取影片列表 - 根据实际网站结构z//a[@class="vodbox"]u   找到 u    个vodbox元素Nu   获取影片列表出错: )r   r   r*   _extract_videoappendrj   rk   )	r
   rp   r|   re   rq   elementsr   videorr   s	            r   ri   zSpider._get_videos  s    	Fyy!788HHH>s8}}>>>???  ) )++D+>> )MM%(((%*AvA6&5&>>6A 	 	 	HH:#a&&::;;;IIIIII	s   A>B 
B<&B71B<7B<c                    	 |                     d          d         }|                    d          r
| j        |z   }d|v pd|v }|r || j        v rt          j                            |          }t          j                            |j                  }|	                    ddg          d         }|rMt          j        d|          }|r|                    d	          }	n?t          t          |          d
z            }	nt          t          |          d
z            }	d| d|	 dt          j                            |           }
nF|                     d|          }|st          t          |          d
z            }d| }
|rd| d| }
|                     d          }|ss|                     d          }|s\|                     d          }|sE|                     d          }|s.|                     d          }|s|                     d           dS |d                                         }|                     |          }|                     d          }|s|                     d          }|r|d         nd}|r:|                    d          rd|z   }n|                    d          r
| j        |z   }|
||dddS # t(          $ r0}|                     dt          |                      Y d}~dS d}~ww xY w)u6   提取影片信息 - 特别处理特殊分区的链接r   r   r   z
ar-kk.htmlzar.htmlr   r   z/([a-f0-9-]+)/video\.m3u8r%   i@B r   rw   zm=(\d+)z618041.xyz_z.//p[@class="km-script"]/text()z'.//p[contains(@class, "script")]/text()z.//p/text()z.//h3/text()z.//h4/text()u'   未找到标题元素，跳过该视频Nz.//img/@data-originalz.//img/@srcr   r   )r   r   r   r   r   u   提取影片信息出错: )r   r   r   r   r   r   r   r   r   r   r'   r(   r,   rk   hashr   r1   r   stripr   rj   )r
   elementr|   linkis_special_linkr   r   r   video_id_matchr   final_vod_idr   
title_elemr   r   pic_elempicrr   s                     r   r   zSpider._extract_video  sj   M	==++A.Ds## (y4' +d2Gi46GO  H;$2I#I#I#\22488
%|44Z5EFF ),,S2$77:	 	9%'Y/KY%W%WN% =#1#7#7#:#: $'tDzzG';#<#<"4::#788H  ^+]]]]6<CUCUVZC[C[]] Z66 7 dg!566F5V55 H#G#G#Gv#G#GL !'HIIJ 
,$]]+TUU
! ,!(}!=!=J% ,%,]]>%B%B
) ,)0~)F)FJ#- , $)S T T T'+t(m1133O''88E }}%<==H 8"==77!)1(1++rC *>>$'' *"S.CC^^C(( *)c/C '!!    	 	 	HH:#a&&::;;;44444	s   HK B*K 
K<%K77K<c                 ,   	 g }|D ]:}t          |          }|dz  }t          |          }|                    |           ;d                    |          }|S # t          $ r1}|                     dt          |                      |cY d}~S d}~ww xY w)u*   解密标题 - 使用网站的解密算法   r   u   标题解密失败: N)ordchrr   r   rj   r   rk   )	r
   encrypted_textdecrypted_charschar
code_pointdecrypted_codedecrypted_chardecrypted_textrr   s	            r   r   zSpider._decrypt_title%  s    	" O& 7 7 YY
!+c!1!$^!4!4&&~6666WW_55N!! 	" 	" 	"HH4CFF44555!!!!!!!	"s   AA 
B"&BBBc                 2   	 |                      |ddg          }|                      |ddg          }|r|                    d          r
| j        |z   }|                      |ddg          }|                      |dg          }|                      |d	g          }g }	g }
t          j        d
          t          j        d          t          j        d          g}g }|D ],}|                    |          }|                    |           -|rsg }|D ]/}t          | j        |          }|                    d|            0|r=|	                    d           |
                    d	                    |                     |	s'| 
                    d           |||dddd|||dd| dS |||dddd|||d	                    |	          d	                    |
          dS # t          $ r0}| 
                    dt          |                      Y d}~dS d}~ww xY w)u<   获取详情信息 (优化版) - 修复播放源提取问题z//h1/text()z//title/text()z)//div[contains(@class,"dyimg")]//img/@srcz%//img[contains(@class,"poster")]/@srcr   z+//div[contains(@class,"yp_context")]/text()z.//div[contains(@class,"introduction")]//text()u=   //span[contains(text(),"主演")]/following-sibling::*/text()u=   //span[contains(text(),"导演")]/following-sibling::*/text()zhref="(.*?ar\.html.*?)"zhref="(.*?kkyd\.html.*?)"zhref="(.*?ar-kk\.html.*?)"r   u   默认播放源#u6   未找到播放源元素，无法定位播放源列表r   )r   r   r   r>   r   vod_arear   	vod_actorvod_directorvod_contentr   r   z$$$u   获取详情出错: N)	_get_textr   r   r'   compiler   r   r   r   r   r   rj   rk   )r
   rp   r   r   r   r   descactordirector	play_from	play_urlsplayer_link_patternsplayer_linksr-   r   episodesr   full_urlrr   s                      r   r   zSpider._get_detail5  s   C	NN38H(IJJE..'RT{&|}}C &s~~c** &i#o>>#(U  XH  (I  J  JDNN3)h(ijjE~~c,k+lmmHII 
566
788
899$  L/ - -!//,77##G,,,, 9( ; ;D&ty$77HOO$9x$9$9:::: 9$$%6777$$SXXh%7%7888 QRRR! %"!# " "#%!&$,#'%6$4s$4$4    !!" (#!&I!6!6 %

9 5 5    	 	 	HH4CFF4455544444	s   F$G '4G 
H&%HHc                     |D ]R}	 |                     |          }|D ]0}|r,|                                r|                                c c S 1L#  Y PxY wdS )u   通用文本提取r   )r   r   )r
   rp   	selectorsselectortextsrh   s         r   r  zSpider._get_text|  s    ! 	 	H		(++! , ,D ,

 ,#zz||+++++,rs   AAAAc                 *    t          d|            dS )u   日志输出u   [苹果视频] N)print)r
   messages     r   r   z
Spider.log  s    )))*****r   GET
   c           	      
   	 || j         }|dk    rt          j        |||d          }nt          j        ||||d          }|S # t          $ r3}|                     d| dt          |                      Y d}~dS d}~ww xY w)u   网络请求Nr!  F)r   timeoutverify)r   r   r$  r%  u   网络请求失败: u
   , 错误: )r   requestsr   postrj   r   rk   )r
   r4   r   methodr   r$  responserr   s           r   rg   zSpider.fetch  s    
	,#<WgV[\\\#=gDRYbghhhO 	 	 	HHCCCC3q66CCDDD44444	s   AA 
B(A==B)r   )r%   )rz   )NNr3   )Nr!  Nr"  )__name__
__module____qualname__r   r    r$   r1   r5   r8   rs   ru   r   r   r   r   r   r   ri   r   r   r   r  r   rg   r   r   r   r   r      s         M M M M         ! ! !F
 
 
2     88  8  8  8 t6  6  6 pq@ q@ q@f/@ /@ /@b  :   O O O Ob" " " E E EN
 
 
+ + +     r   r   __main__)syspathr   base.spiderr   r   timeurllib.parser   r'   r&  lxmlr   r   r*  
BaseSpiderregisterr   r   r   <module>r6     s   


                 				                   J
 J
 J
 J
 J
V J
 J
 J
Z z000000J!!!!! r   