
    6h@k                         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://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Referer)3743404944413945423866464847u,   苹果视频爬虫初始化完成，主站: )hostapi_hostheadersspecial_categorieslog)r
   extends     r   initzSpider.init   si    (	0 Pb8.&y
 
 #w"v"v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 r:   r   r	   s    r   manualVideoCheckzSpider.manualVideoCheck7   r=   r   c                 J   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<   	 |                      | j        | j                  }|r|j        d k    r|                     d!           g |d"<   |S |                     |j                  }|s|                     d#           g |d"<   |S |                     |d$%          }||d"<   nA# t          $ r4}|                     d&t          |                      g |d"<   Y d'}~nd'}~ww xY w|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es           r   homeContentzSpider.homeContent:   s    (jAA'jAA'mDD'nEE'nEE'kBB'h??'kBB'nEE'h??'e<<'nEE'kBB'h??
  "w	 **TY*==C #/S00-...!#v))CH%%C 1222!#v%%c%44F#F6NN 	  	  	 HH4CFF44555F6NNNNNN	  s%   A	C" 7C" C" "
D ,*DD c                 z    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   分类定义 - 兼容性方法r`   rA   rB   rC   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	   s    r   homeVideoContentzSpider.homeVideoContentd   s     +*EE+*EE+-HH+.II+.II++FF+(CC++FF+.II+(CC+%@@+.II++FF+(CC
 	
r   c                    	 |                     d          \  }}d| d| d}|r |dk    r|                    d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          }|r	 d}|D ]}d|j        v sd|j        
                                v r[|	                    d          d         }t          j        d|          }|r)t          |                    d                    }|dz  } n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   分类内容 - 修复版_https://z/index.php/vod/type/id/.html1/page/u   访问分类URL: ra   rb   u   分类页面请求失败rc   u   分类页面HTML解析失败rd   )category_idrf      d   z//ul[@class="pagination"]/li/aNu   尾last./@hrefr   z/page/(\d+)\.htmlr,   rc   page	pagecountrf   totalu   分类内容获取出错: )splitreplacer%   rg   r#   rh   r+   ri   rj   xpathlowerr.   r/   intr3   rk   rl   )r
   tidpgrm   r&   domainrD   r;   rp   rq   rr   r   r   page_elements	last_pageelemhref
page_matchrs   s                      r   categoryContentzSpider.categoryContenty   sd   1	 !iinnOFGJVJJGJJJC ?bCiikk'+=B+=+=+=>>HH...///**S$,*77C $#/S003444|#))CH%%C $7888|#%%cwb%IIF IE  II&FGGM  $I - & & DI--49??;L;L1L1L#'::i#8#8#;D)+3G)N)NJ) &,/
0@0@0C0C,D,D	(1B %D B&    	  	  	 HH:#a&&::;;;B<	 sC   BF+ 4F+ 3F+ BF F+ FF+ +
G(5(G#G(#G(r{   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}	|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/search/wd/r|   rz   u   搜索URL: ra   rb   u   搜索请求失败rc   u   搜索页面解析失败rd   re   r~   r   r   u   搜索出错: N)r!   urllibparsequoter%   rg   r#   rh   r+   ri   rj   r   rk   rl   )r
   keyquickr   
search_urlrp   rq   rr   r   r   rs   s              r   searchContentzSpider.searchContent   sy   	  Ihh@R@RSV@W@Whh_ahhhJHH/://000**Z*>>C $#/S00-...|#))CH%%C $3444|#%%c%44F IE B&    	  	  	 HH.c!ff..///B<	 s*   BC. 	4C. >/C. .
D+8(D& D+&D+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                  }|r|j        dk    r|                     d           dg iS |                     |j                  }|s|                     d           dg iS |                     ||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)u   详情页面 - 修复版r   special_rx      r,         N)   特殊分区视频，直接使用链接: vr   bmrc   u   直接播放   第1集$)vod_idvod_namevod_picvod_remarksvod_yearvod_play_fromvod_play_urlry   z/index.php/vod/detail/id/rz   u   访问详情URL: ra   rb   u   详情页面请求失败u   详情页面HTML解析失败u   详情获取出错: )
startswithr   r1   joinr   r   unquoter%   urlparseparse_qsqueryget_decrypt_titlerg   r#   rh   r+   ri   _get_detailrk   rl   )r
   idsvidpartsr}   video_idencoded_urlplay_url
parsed_urlquery_params	video_urlpic_urltitle_encryptedtitler   
detail_urlrp   rq   
video_infors   s                       r   detailContentzSpider.detailContent   s   ;	 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 $#/S003444|#))CH%%C $7888|#))#sx==J-7IFZL))fb\I 	  	  	 HH4CFF44555B<	 s1   E)J ,B>J +4J  &J 
K(J?9K?K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)'u   播放链接 - 修复版u   获取播放链接: flag=z, id=r   rx   r   r,   r   r   Nr   r   r   r   //https:httpu)   从特殊链接中提取到视频地址: r   playUrlr;   u*   ID 是一个完整URL，直接解析参数)r;   srcfileu(   从 URL 参数中提取到视频地址: u7   URL 中没有找到视频参数，尝试从页面提取ra   rb   u    从页面提取到视频地址: u3   无法从页面提取视频链接，返回原始URLu
   视频ID: u   , 分类ID: u9   特殊分类，尝试从详情页提取直接播放链接z/index.php/vod/play/id/rz   u&   从播放页面提取到视频地址: u-   从播放页面提取失败，尝试API方式u!   使用API方式获取视频地址u   播放链接获取出错: ry   /html/kkyd.html?m=)r%   r   r   r1   r   r   r   r   r   r   r   r   r   r!   rg   r#   rh   _extract_direct_video_urlri   countr$   _get_video_by_apirk   rl   )r
   flagidvipFlagsr   r}   r   r   r   r   r   r   r   rp   play_page_urlrs   r   play_ids                     r   playerContentzSpider.playerContent  s   b	@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-Withra   rb   u   API响应: retcoder   datahttpurl_previewr   httpurlz?300u   从API获取到视频地址: r   r   u$   API响应中没有找到视频地址u   API请求失败，状态码: u	   无响应rx   ry   r   u)   API请求失败，回退到播放页面: r,   u   API方式获取视频出错: N)r"   r%   r#   copyupdater!   rg   rh   jsonr   r   r   rk   rl   )r
   r   r   api_urlapi_headersapi_responser   r   r   r   r   rs   s               r   r   zSpider._get_video_by_apiu  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)
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.   findallr0   
isinstancetupler   r   r   r   r   rk   r%   rl   )r
   html_contentpatternsr4   matchesr7   extracted_urlrs   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          }|s|                     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)u3   获取影片列表 - 根据实际网站结构修复z5//ul[@class="thumbnail-group"]//a[@class="thumbnail"]z"//a[contains(@class, "thumbnail")]u   找到 u    个视频元素Nu   获取影片列表出错: )r   r%   r1   _extract_videoappendrk   rl   )	r
   rq   r}   rf   rr   elementsr   videors   s	            r   rj   zSpider._get_videos  s   	Fyy!XYYH K99%IJJHH>s8}}>>>???  ) )++D+>> )MM%(((%*AvA6&5&>>6A 	 	 	HH:#a&&::;;;IIIIII	s   BB 
C"&CCC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          }|s|                     d          }|s|                     d          }|s|                     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)u   提取影片信息 - 修复版r   r   r   z/html/28k.htmlz/html/ar.htmlr   r   z/([a-f0-9-]+)/[^/]+\.m3u8r,   i@B r   rx   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   提取影片信息出错: )r   r   r!   r$   r   r   r   r   r   r   r.   r/   r3   rl   hashr   r8   r%   stripr   rk   )r
   elementr}   linkis_special_linkr   r   r   video_id_matchr   final_vod_idr   
title_elemr   r   pic_elempicrs   s                     r   r   zSpider._extract_video  sg   J	==++A.Ds## (y4' /$6Q/T:QO  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[]] %7>> 7 dg!566F5V55 H#G#G#Gv#G#GL !'QRRJ X$]]+VWW
 U$]]+STT
 ;$]]>::
 ;$]]>::
 BCCC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   rk   r%   rl   )	r
   encrypted_textdecrypted_charschar
code_pointdecrypted_codedecrypted_chardecrypted_textrs   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                    	 |                      |ddg          }|                      |ddg          }|r|                    d          r
| j        |z   }|                      |ddg          }|                      |dg          }|                      |d	g          }g }	g }
g d
}g }|D ],}t          j        ||          }|                    |           -|rsg }|D ]/}t          | j        |          }|                    d|            0|r=|	                    d           |
                    d                    |                     |	sB| 	                    d           |	                    d           |
                    d|            |||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="(/html/28k\.html[^"]*)"zhref="(/html/ar\.html[^"]*)"zhref="(/html/kkyd\.html[^"]*)"r   u   默认播放源#u-   未找到播放源，使用默认播放方式r   z$$$)r   r   r   rE   r   vod_arear   	vod_actorvod_directorvod_contentr   r   u   获取详情出错: N)	_get_textr   r!   r.   r   r&   r   r   r   r%   rk   rl   )r
   rq   r   r   r   r   descactordirector	play_from	play_urlsplayer_link_patternsplayer_linksr4   r   episodesr   full_urlrs   s                      r   r   zSpider._get_detail6  s   7	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$ $ $  L/ - -*Wl;;##G,,,, 9( ; ;D&ty$77HOO$9x$9$9:::: 9$$%6777$$SXXh%7%7888 3HIII  !2333  !1C!1!1222 !!" (#!&I!6!6 %

9 5 5    	 	 	HH4CFF4455544444	s   F=G   
G:
%G55G:c                     |D ]R}	 |                     |          }|D ]0}|r,|                                r|                                c c S 1L#  Y PxY wdS )u   通用文本提取r   )r   r   )r
   rq   	selectorsselectortextsri   s         r   r  zSpider._get_textq  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   postrk   r%   rl   )r
   r;   r#   methodr   r$  responsers   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,   )r{   )NNr:   )Nr!  Nr"  )__name__
__module____qualname__r   r'   r+   r8   r<   r?   rt   rv   r   r   r   r   r   r   rj   r   r   r   r  r%   rg   r   r   r   r   r      s         M M M M         ( ( (T
 
 
*3  3  3 j           D=  =  = ~d@ d@ d@L/@ /@ /@b  8   ,L L L L\" " " 9 9 9v
 
 
+ + +     r   r   __main__)syspathr   base.spiderr   r   timeurllib.parser   r.   r&  lxmlr   r   r*  
BaseSpiderregisterr   r   r   <module>r6     s   


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