U
    +m)i@k                     @   s   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 deZedkrd dlmZ ee  dS )	    Nz..)Spider)etree)urljoinc                   @   s   e Zd Zdd Zd1ddZdd Zd2d	d
Zdd Zdd Zdd Z	dd Z
dd Zd3ddZdd Zdd Zdd Zdd Zd4d!d"Zd5d#d$Zd%d& Zd'd( Zd)d* Zd+d, Zd6d/d0Zd S )7r   c                 C   s   dS )Nu   苹果视频 selfr   r   &   /storage/emulated/0/lz/py/sy/七区.pygetName   s    zSpider.getName c                 C   sZ   d| _ d| _ddddd| j d| _d	d
ddddddddddddg| _| d| j   d S )Nzhttps://618636.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RefererZ37Z43Z40Z49Z44Z41Z39Z45Z42Z38Z66Z46Z48Z47u,   苹果视频爬虫初始化完成，主站: )hostapi_hostheadersspecial_categorieslog)r   extendr   r   r   init   s    	"zSpider.initc                 C   s*   zt |W S    | d Y dS X dS )u(   将HTML内容转换为可查询的对象u   HTML解析失败N)r   HTMLr   )r   contentr   r   r   html"   s
    
zSpider.html   c                 C   sF   z4t ||t j}|r2t| |kr2||W S W n   Y nX dS )u   正则表达式提取字符串r
   )research
IGNORECASElengroupsgroup)r   patternstringindexmatchr   r   r   regStr*   s    zSpider.regStrc                 C   s   d S Nr   )r   urlr   r   r   isVideoFormat4   s    zSpider.isVideoFormatc                 C   s   d S r$   r   r   r   r   r   manualVideoCheck7   s    zSpider.manualVideoCheckc                 C   s@  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g}||d< zz| j | j| jd}|r|jd kr| d! g |d"< |W S | |j}|s| d# g |d"< |W S | j|d$d%}||d"< W n@ tk
r: } z | d&t	|  g |d"< W 5 d'}~X Y nX |S )(u   获取首页内容和分类618636.xyz_37   国产AVtype_id	type_name618636.xyz_43   探花AV618636.xyz_40   网黄UP主618636.xyz_49   绿帽淫妻618636.xyz_44   国产传媒618636.xyz_41	   福利姬618636.xyz_39   字幕618636.xyz_45	   水果派618636.xyz_42   主播直播618636.xyz_38   欧美618636.xyz_66FC2618636.xyz_46   性爱教学618636.xyz_48	   三及片618636.xyz_47   动漫classr      u   首页请求失败listu   首页HTML解析失败   limitu   首页获取出错: N)
fetchr   r   status_coder   r   text_get_videos	Exceptionstr)r   filterresultclassesrspdocvideoser   r   r   homeContent:   sD    

zSpider.homeContentc                 C   sx   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   分类定义 - 兼容性方法rG   r(   r)   r*   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   r   r   r   r   r   homeVideoContentd   s"    zSpider.homeVideoContentc              
   C   s  zV| d\}}d| d| d}|rD|dkrD|dd| d}| d|  | j|| jd}|rr|jd	kr| d
 dg iW S | |j}	|	s| d dg iW S | j|	|dd}
d}d}|		d}|rDzdd}|D ]V}d|jksd|j
 kr|	dd }td|}|rt|d}|d } q4qW n   Y nX |
t||d|dW S  tk
r } z$| dt|  dg i W Y S d}~X Y nX dS )u   分类内容 - 修复版_https://z/index.php/vod/type/id/.html1/page/u   访问分类URL: rH   rI   u   分类页面请求失败rJ   u   分类页面HTML解析失败rK   )category_idrM      d   z//ul[@class="pagination"]/li/aNu   尾last./@hrefr   z/page/(\d+)\.htmlr   rJ   page	pagecountrM   totalu   分类内容获取出错: )splitreplacer   rN   r   rO   r   rP   rQ   xpathlowerr   r   intr   rR   rS   )r   tidpgrT   r   domainr+   r%   rW   rX   rY   ri   rj   Zpage_elementsZ	last_pageelemhrefZ
page_matchrZ   r   r   r   categoryContenty   sP    




zSpider.categoryContentr`   c              
   C   s   z| j  dtj| d| d}| d|  | j|| jd}|rP|jdkrd| d dg iW S | |j	}|s| d	 dg iW S | j
|d
d}d}d}	|t||d
|	dW S  tk
r }
 z$| dt|
  dg i W Y S d}
~
X Y nX dS )u   搜索功能 - 修复版z/index.php/vod/search/wd/ra   r_   u   搜索URL: rH   rI   u   搜索请求失败rJ   u   搜索页面解析失败rK   rL   rc   rd   rg   u   搜索出错: N)r   urllibparsequoter   rN   r   rO   r   rP   rQ   ro   rR   rS   )r   keyquickrq   Z
search_urlrW   rX   rY   ri   rj   rZ   r   r   r   searchContent   s.     



zSpider.searchContentc              
   C   s  z|d }| dr|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W S d|krt|ddkr|d\}}}n|d\}}d| d| d}| d|  | j|| jd}|rh|jdkr|| d dg iW S | |j}|s| d dg iW S | ||j|}|rd|gindg iW S  tk
r } z$| dt|  dg i W Y S d}~X Y nX dS )u   详情页面 - 修复版r   special_r]      r         N)   特殊分区视频，直接使用链接: vr
   bmrJ   u   直接播放   第1集$)vod_idvod_namevod_picvod_remarksvod_yearvod_play_fromvod_play_urlr^   z/index.php/vod/detail/id/r_   u   访问详情URL: rH   rI   u   详情页面请求失败u   详情页面HTML解析失败u   详情获取出错: )
startswithrk   r   joinrv   rw   unquoter   urlparseparse_qsqueryget_decrypt_titlerN   r   rO   r   rP   _get_detailrR   rS   )r   idsvidpartsrb   video_idencoded_urlplay_url
parsed_urlquery_params	video_urlZpic_urltitle_encryptedtitlerr   Z
detail_urlrW   rX   Z
video_inforZ   r   r   r   detailContent   sX    






zSpider.detailContentc              
   C   s  z0|  d| d|  |dr|d}t|dkr|d }|d }d|dd	 }tj|}|  d
|  tj|}	tj	|	j
}
|
ddgd }|r|drd| }n|dst| j|}|  d|  dd|dW S |dr2|  d tj|}	tj	|	j
}
|
ddgd }|s`|
D ]"}|dkr<|
| d } q`q<|rtj|}|drd| }n|dst| j|}|  d|  dd|dW S |  d | j|| jd}|r|jdkr| |j}|r|  d|  dd|dW S |  d dd|dW S |ddkr^|d}|d }|d }n|dd }d}|  d| d|  || jkr|  d | j d| d }| j|| jd}|r |jdkr | |j}|r |  d!|  dd|dW S |  d" | ||W S |  d# | ||W S W n tk
r } zb|  d$t|  d|kr|d\}}d%| d&| }n| j d&| }dd|d W Y S d	}~X Y nX d	S )'u   播放链接 - 修复版u   获取播放链接: flag=z, id=r|   r]   r}   r   r~   r   Nr   r   r
   r   //https:httpu)   从特殊链接中提取到视频地址: rw   playUrlr%   u*   ID 是一个完整URL，直接解析参数)r%   srcfileu(   从 URL 参数中提取到视频地址: u7   URL 中没有找到视频参数，尝试从页面提取rH   rI   u    从页面提取到视频地址: u3   无法从页面提取视频链接，返回原始URLu
   视频ID: u   , 分类ID: u9   特殊分类，尝试从详情页提取直接播放链接z/index.php/vod/play/id/r_   u&   从播放页面提取到视频地址: u-   从播放页面提取失败，尝试API方式u!   使用API方式获取视频地址u   播放链接获取出错: r^   /html/kkyd.html?m=)r   r   rk   r   r   rv   rw   r   r   r   r   r   r   r   rN   r   rO   _extract_direct_video_urlrP   countr   _get_video_by_apirR   rS   )r   flagidvipFlagsr   rb   r   r   r   r   r   r   ry   rW   Zplay_page_urlrZ   rr   play_idr   r   r   playerContent  s    
















zSpider.playerContentc              
   C   s  z`| j  d| }| d|  | j }|| j d| jdd | j||d}|r|jdkr| }| d|  |	d	d
kr|	di 	dd}n|	di 	dd}|r|
dd}| d|  dd|dW S | d n| d|r|jnd  d|kr6|d\}}	d| d|	 }
n| j d| }
| d|
  dd|
dW S  tk
r } zb| dt|  d|kr|d\}}	d| d|	 }
n| j d| }
dd|
d W Y S d}~X Y nX dS )u   通过API获取视频地址z/api/v2/vod/reqplay/u   请求API获取视频地址: /ZXMLHttpRequest)r   ZOriginzX-Requested-WithrH   rI   u   API响应: retcoder   dataZhttpurl_previewr
   Zhttpurlz?300u   从API获取到视频地址: r   r   u$   API响应中没有找到视频地址u   API请求失败，状态码: u	   无响应r]   r^   r   u)   API请求失败，回退到播放页面: r   u   API方式获取视频出错: N)r   r   r   copyupdater   rN   rO   jsonr   rl   rk   rR   rS   )r   r   r   Zapi_urlZapi_headersZapi_responser   r   rr   r   r   rZ   r   r   r   r   u  sF    



zSpider._get_video_by_apic              
   C   s   zddddg}|D ]t}t ||t j}|D ]Z}t|tr@|d }|dd}tj|}|	drld	| }q*|	d
r*|    W S q*qW dS  t
k
r } z| dt|  W Y dS d}~X Y nX dS )u(   从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tuplerl   rv   rw   r   r   rR   r   rS   )r   html_contentpatternsr   matchesr"   Zextracted_urlrZ   r   r   r   r     s*    



z Spider._extract_direct_video_urlNc           	   
   C   s   zpg }| d}|s| d}| dt| d |D ]}| ||}|r8|| q8|rl|rl|d| n|W S  tk
r } z | dt|  g  W Y S d}~X Y nX dS )u3   获取影片列表 - 根据实际网站结构修复z5//ul[@class="thumbnail-group"]//a[@class="thumbnail"]z"//a[contains(@class, "thumbnail")]u   找到 u    个视频元素Nu   获取影片列表出错: )rm   r   r   _extract_videoappendrR   rS   )	r   rX   rb   rM   rY   elementsrs   videorZ   r   r   r   rQ     s    

zSpider._get_videosc              
   C   s:  z| dd }|dr&| j| }d|kp4d|k}|r|| jkrtj|}tj|j}|	ddgd }|rt
d|}|r|d	}	qtt|d
 }	ntt|d
 }	d| d|	 dtj| }
n@| d|}|stt|d
 }d| }
|rd| d| }
| d}|s,| d}|s<| d}|sL| d}|s\| d}|sr| d W dS |d  }| |}| d}|s| d}|r|d nd}|r|drd| }n|dr| j| }|
||dddW S  tk
r4 } z| dt|  W Y dS d}~X Y nX dS )u   提取影片信息 - 修复版rf   r   r   z/html/28k.htmlz/html/ar.htmlr   r
   z/([a-f0-9-]+)/[^/]+\.m3u8r   i@B r|   r]   z/id/(\d+)\.htmlz618636.xyz_z(.//span[@class="title km-script"]/text()z).//span[contains(@class, "title")]/text()z&.//p[contains(@class, "title")]/text()z.//h3/text()z.//h4/text()u'   未找到标题元素，跳过该视频Nz.//img/@data-originalz.//img/@srcr   r   )r   r   r   r   r   u   提取影片信息出错: )rm   r   r   r   rv   rw   r   r   r   r   r   r   r   rS   hashrx   r#   r   stripr   rR   )r   elementrb   linkZis_special_linkr   r   r   Zvideo_id_matchr   Zfinal_vod_idr   Z
title_elemr   r   Zpic_elempicrZ   r   r   r   r     sl    

 











zSpider._extract_videoc           	   
   C   s   z@g }|D ]&}t |}|dA }t|}|| q
d|}|W S  tk
r~ } z | dt|  | W Y S d}~X Y nX dS )u   解密标题   r
   u   标题解密失败: N)ordchrr   r   rR   r   rS   )	r   encrypted_textZdecrypted_charschar
code_pointZdecrypted_codeZdecrypted_charZdecrypted_textrZ   r   r   r   r   &  s    
zSpider._decrypt_titlec                 C   s  z<|  |ddg}|  |ddg}|r<|dr<| j| }|  |ddg}|  |dg}|  |d	g}g }	g }
d
ddg}g }|D ]}t||}|| q|rg }|D ] }t| j|}|d|  q|r|	d |
d| |	s| 	d |	d |
d|  |||dddd|||d|	d|
dW S  t
k
r| } z| 	dt|  W Y dS d}~X Y nX dS )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="(/html/28k\.html[^"]*)"zhref="(/html/ar\.html[^"]*)"zhref="(/html/kkyd\.html[^"]*)"r   u   默认播放源#u-   未找到播放源，使用默认播放方式r
   z$$$)r   r   r   r,   r   vod_arear   	vod_actorvod_directorvod_contentr   r   u   获取详情出错: N)	_get_textr   r   r   r   r   r   r   r   r   rR   rS   )r   rX   r   r   r   r   descZactordirector	play_fromZ	play_urlsZplayer_link_patternsZplayer_linksr   r   episodesr   full_urlrZ   r   r   r   r   6  s\    



zSpider._get_detailc                 C   sV   |D ]L}z6| |}|D ]"}|r| r|   W   S qW q   Y qY qX qdS )u   通用文本提取r
   )rm   r   )r   rX   	selectorsselectortextsrP   r   r   r   r   q  s    
zSpider._get_textc                 C   s   t d|  dS )u   日志输出u   [苹果视频] N)print)r   messager   r   r   r   }  s    z
Spider.logGET
   c              
   C   s   zD|dkr| j }|dkr,tj|||dd}ntj||||dd}|W S  tk
r } z$| d| dt|  W Y dS d}~X Y nX dS )u   网络请求Nr   F)r   timeoutverify)r   r   r   r   u   网络请求失败: u
   , 错误: )r   requestsr   postrR   r   rS   )r   r%   r   methodr   r   responserZ   r   r   r   rN     s    zSpider.fetch)r
   )r   )r`   )NN)N)Nr   Nr   )__name__
__module____qualname__r	   r   r   r#   r&   r'   r[   r\   ru   r{   r   r   r   r   rQ   r   r   r   r   r   rN   r   r   r   r   r      s*   


*5
"?f1

N;r   __main__)syspathr   base.spiderr   r   timeurllib.parserv   r   r   lxmlr   r   r   
BaseSpiderregisterr   r   r   r   <module>   s$        