
    hM                        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Zd dl	Z	 e	j                  e	j                  j                         ej                  j                  d       d dlmZ  G d de      Zedk(  rv e       Zej'                          ej)                  i       Z eded	   D  cg c]  } | d
   	 c}          ed eed                  ed       ej1                  ddd      Z ed eed                  eed   d      D ]!  \  ZZ ee ded    ded    ded           # ed   red   d    Zej=                  ed   g      Zed   red   d    Z  ed        ede d            ede d
            ede d            ede d            ede d             ed!e d"            ed#e d$   dd%  d&        ed'e d(            ed)e d*           yyyyc c} w )+    N)BeautifulSoupz..)Spiderc                       e Zd Zd ZddZddZd Zd ZddZd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)r   c                      y)Nu   影视工厂 selfs    ,   /storage/emulated/0/lz/py/sy/影视工厂.pygetNamezSpider.getName   s        c                    d| _         d| j                   d| _        t        j                         | _        d| j                  _        | j                  j                  j                  | j                         d| _        d| _        y )Nzhttp://1.ysgc.top/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RefererF      )	hostheadersrequestsSessionsessionverifyupdateretry_counttimeout)r	   extends     r
   initzSpider.init   sh    (	 Pyy
  '')###DLL1r   Nc           
         || j                   }t        | j                        D ]S  }	 | j                  j	                  ||d      }d|_        |j                  dk(  r|c S t        d|j                          U y # t        $ rR}t        d|dz    d| j                   d	|        || j                  dz
  k  rt        j                  d       Y d }~d }~ww xY w)
NF)r   r   zutf-8   u   请求失败，状态码: u   请求失败 (   /z): )r   ranger   r   getencodingstatus_codeprint	Exceptiontimesleep)r	   urlr   iresponsees         r
   fetchzSpider.fetch$   s    ?llGt''(A
"<<++C+O$+!''3.#O6x7K7K6LMN ) 	  "qse1T-=-=,>c!EFt''!++JJqM"s   5A; A;;	CACCc                     ddddddddddd	dd
dddddg| j                         g d}| j                  | j                        }|r-|j                  dk(  r| j	                  |j
                        |d<   |S )N1u   电影)type_id	type_name2u	   连续剧3u   综艺4u   动漫41u   短剧40u   其他综合)classfilterslistr   r8   )_get_filtersr,   r   r#   _extract_videos_from_htmltext)r	   filterresultrsps       r
   homeContentzSpider.homeContent6   s      h7k:h7h7 x8 ~> ((*
 jj#3??c)!;;CHHEF6Nr   c                 d   g t        |      dddd}t        |      dkD  r| j                   d| d| dn| j                   d| d}|r'd	|v r#|d	   }|r|j                  | d| | d|       }| j                  |      }|r-|j                  d
k(  r| j                  |j                        |d<   |S )Nc      i  )r8   page	pagecountlimittotalr   z	/vodtype/-.htmlr6   r   r8   )intr   replacer,   r#   r:   r;   )	r	   tidpgr<   r   r=   r(   class_filterr>   s	            r
   categoryContentzSpider.categoryContentI   s    c"gBVZ[8;B!9SE2$e4DII;V_`c_ddiIj g'!'?LkkSE2$-L>2$1GHjjo3??c)!;;CHHEF6Nr   c                    dg i}t         j                  j                  |      }| j                   d| d}| j	                  |      }|r|j
                  dk(  rw	 t        j                  |j                        }g }	d|v r|d   }
t        dt        |
       d       |
D ]  }t        |j                  dd            }|s!|j                  d	d      }|j                  d
d      }|rg|j                  d      sV|j                  d      rd|z   }n?|j                  d      r| j                  j                  d      |z   }n| j                  |z   }|j                  dd      }|	j                  ||||d        d}t!        |      dz
  |z  }||z   }|	|| |d<   t!        |      |d<   t        |	      |z   dz
  |z  |d<   ||d<   t        |	      |d<   |S t        d|r|j
                  nd        |S # t        j"                  $ r+ t        d       t        d|j                  d d  d       Y |S t$        $ r5}t        d|        t        d|j                  d d  d       Y d }~|S d }~ww xY w)Nr8   z!/index.php/ajax/suggest?mid=1&wd=z
&limit=500r   u
   搜索到 u
    条结果id namepichttp//http:r   envod_idvod_namevod_picvod_remarksrB   r   rC   rD   rE   rF   u"   JSON解析失败，搜索无结果u   原始响应: ...u   搜索处理异常: u   API请求失败: 状态码 u	   无响应)urllibparsequoter   r,   r#   jsonloadsr;   r$   lenstrr!   
startswithrstripappendrI   JSONDecodeErrorr%   )r	   keyquickrL   r=   
search_keyapi_urlr>   datavideositemsitemvidtitlerS   note	page_size	start_idxend_idxr+   s                       r
   searchContentzSpider.searchContentX   s   "\\'',
 YYK@JWjj!3??c)9<zz#((+ T> LEJs5zl*=> %!$((4"45"$ !% 4 #hhub1s~~f'="~~d3&-m!$!4&*ii&6&6s&;c&A&*ii#o  $xxb1&)(-'*+/	' - !&< 	 Wq[I5	#i/!'	'!:v!$Rv'*6{Y'>'By&P{#"+w"%f+w  /3K/XYZ '' <:;sxx~&6c:;   <,QC01sxx~&6c:;; <s   E4G/ /:I),I)4*I$$I)c                 >   dg i}|d   }| j                    d| d}| j                  |      }|r|j                  dk7  r|S |j                  }| j	                  ||      \  }}|r|r|| j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      | j                  |      dj                  |      dj                  |      dg|d<   |S )Nr8   r   z/voddetail/rH   r   z$$$)rY   rZ   r[   r0   vod_yearvod_area	vod_actorvod_directorvod_contentr\   vod_play_fromvod_play_url)r   r,   r#   r;   _extract_play_info_extract_title_extract_pic_extract_category_extract_year_extract_area_extract_actor_extract_director_extract_desc_extract_remarksjoin)	r	   idsr=   rq   r(   r>   html	play_fromplay_urls	            r
   detailContentzSpider.detailContent   s   "!f;se51jjocoo,Mxx"55dC@	8 //5,,T2!33D9 ..t4 ..t4!006 $ 6 6t <#11$7#44T:!&I!6 %

8 4 F6N r   c                    dddd}d|vr|S | j                  | j                   d| d      }|r|j                  dk7  r|S t        j                  d|j
                        }|rd	|d
<   |j                  d      |d<   |S t        j                  d|j
                        }|rd	|d
<   |d	   |d<   |S | j                   d| d|d<   |S )Nr   rQ   )r_   playUrlr(   rG   	/vodplay/rH   r   z)["\'](https?://[^"\']+\.m3u8[^"\']*)["\']r   r_   r(   z(https?://[^"\']+\.m3u8[^"\']*))r,   r   r#   researchr;   groupfindall)r	   flagrP   vipFlagsr=   r>   
m3u8_match
js_matchess           r
   playerContentzSpider.playerContent   s    B7b=MjjDII;it59:coo,M YYKSXXV
F7O&,,Q/F5M  $FQJ"#w *1u  $(99+Yrd% @ur   c                 8   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 g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 gdddddd,d-dd.d/dd0d1dd2d3dd4d5dgd gdddddd6d7dd8ddd9d:dd;d<dgd gd=S )>Nr6   u   类型u   全部rQ   )nvu	   动作片6u	   喜剧片7u	   爱情片8u	   科幻片9u	   恐怖片11u	   剧情片10u	   战争片12u	   纪录片21u	   悬疑片32u	   动画片33u	   犯罪片34u	   奇幻片35u	   其他片60)ri   rR   valueu	   国产剧13u	   港台剧14u   日剧15u   韩剧u	   欧美剧16u	   海外剧17u   内地综艺27u   港台综艺28u   日本综艺29u   韩国综艺36u   欧美综艺30u   国产动漫31u   日本动漫u   欧美动漫42u   其他动漫43)r.   r1   r2   r3   r   r   s    r
   r9   zSpider._get_filters   s]   !8R(#*Fk`cHd!,Kc.JR]dhLi!-[t/LT_fjNk!-[t/LT_fjNk!-[t/L?   "8R($*G{aeIfT*(,Fk`dHe!-?  
 "8R(T*JR`gkLl$40T2RZhosTt?   "8R(T*JR`gkLl$40T2R?  #
 	
r   c                    g }t        |d      }|j                  d      }|s|j                  d      }|D ]  }|j                  d      }|s|j                  dd      }t	        j
                  d|      }|sC|j                  d      }	d}
|j                  d	      }|r|j                  d
      }
d}|j                  d      }|r9|j                  d      xs |j                  d      xs d}| j                  |      }d}|j                  d      }|r|j                  d
      }|j                  |	|
||d        |S )Nhtml.parserzV.module-item, .module-card-item, .module-items .module-item, .module-list .module-itemz_.module-blocklist .module-blocklist-item, .module-list .module-item, .module-items .module-itemzca[href*="/vodplay/"], a[href*="/voddetail/"], .module-item-pic a, .module-item-titlebox a, .title ahrefrQ   z%/vod(?:play|detail)/(\d+)(?:-|\d|\.)*r   zp.module-item-title, .video-name, .title, .module-item-style.video-name, .module-item-titlebox .module-item-titleTstripz,img, .module-item-pic img, .lazy, .cover imgdata-srcsrczH.module-item-text, .video-remarks, .remarks, .module-item-caption, .noterX   )
r   select
select_oner!   r   r   r   get_text_fix_urlrg   )r	   r   rn   soupmodule_itemsrp   linkr   	vid_matchrq   rr   
title_elemrS   img_elemrs   	note_elems                   r
   r:   z Spider._extract_videos_from_html   sd   T=1 {{#{| ;;  (I  JL D??  $I  JD88FB'D		"JDQI//!$C E  *\  ]J"++$+7 C'UVHll:.K(,,u2EKmmC( D(rsI )))5MM!#	 E !R r   c                    g g }}t        |d      }|j                  d      }|s|j                  d      }|s|}|j                  d      }|r |D cg c]  }|j                  d       c}ndg}	|r|j                  d      ng }
|	rg }|
D ]  }|j	                  d	d
      }d| |v s|j                  d      }|r|j                  d      }n&|j                  d      xs dt        |      dz    d}|j                  d      d   j                  dd
      }|j                  | d|         |r|	}dj                  |      g}||fS c c}w )Nr   z).module-blocklist.scroll-box.scroll-box-yz5.player-side-playlist, .player-box-side, .player-infoz(.module-tab-name span, .module-tab-valueTr   u   腾讯za[href*="/vodplay/"]r   rQ   r   spanu   第r   u   集r   rH   $#)
r   r   r   r   r!   rc   splitrJ   rg   r   )r	   r   rq   r   r   r   playlist_containersource_tabstabsource_namesepisode_linksepisodesr   r   r   ep_nameep_ids                    r
   r   zSpider._extract_play_info$  s    "8	T=1 "__-XY "!%1h!i "!% kk"LMLWKHKS40KH^f]g N`*112HIeg H%xx+se$,??62D"&--d-";"&--d-";"YS]ST_DUUX?Y !JJsOB/77DE OOwiq$89 &" (	HHX./(""; Is   E	c                     t        |d      }|j                  d      }|r9|j                  d      }t        j                  d|      d   j                         S y)Nr   zItitle, .video-info-title, .module-heading h1, .page-title, h1.video-titleTr   z[-|_]r   u   未知标题)r   r   r   r   r   r   )r	   r   r   r   rr   s        r
   r   zSpider._extract_titleU  sU    T=1__%pq
''d'3E88He,Q/5577r   c                     t        |d      }|j                  d      }|r9|j                  d      xs |j                  d      xs d}| j                  |      S y)Nr   zW.module-item-pic img, .video-cover img, .detail-pic img, .lazy, img[data-src], img[src]r   r   rQ   )r   r   r!   r   )r	   r   r   r   rS   s        r
   r   zSpider._extract_pic^  sS    T=1??#|},,z*Ghll5.AGRC==%%r   c                 f    t        |d      }|j                  d      }|r|j                  d      S y)Nr   zP.video-info-class, .video-category, .category, .module-item-caption .video-classTr   rQ   r   r   r   )r	   r   r   category_elems       r
   r   zSpider._extract_categoryf  s7    T=1(z{ )))55r   c                    t        |d      }|j                  d      }|D ]h  }|j                         }t        j                  d|      }|r|j                  d      c S t        j                  d|      }|sW|j                  d      c S  y)Nr   ;.video-info-items, .video-info, .info, .module-item-captionu   年份[：:]\s*(\d{4})r   z\b(19|20)\d{2}\br   rQ   r   r   r   r   r   r   )r	   r   r   
info_elemselemr;   
year_matchs          r
   r   zSpider._extract_yearm  s    T=1[[!^_
D==?D#<dCJ!''** #6=J!''**  r   c                     t        |d      }|j                  d      }|D ]=  }|j                         }t        j                  d|      }|s,|j                  d      c S  y)Nr   r   u   地区[：:]\s*([^\s]+)r   rQ   r   )r	   r   r   r   r   r;   
area_matchs          r
   r   zSpider._extract_area}  s\    T=1[[!^_
D==?D#=tDJ!''**	 
 r   c                 ~   t        |d      }|j                  d      }|D ]  }|j                         }t        j                  d|      }|r!|j                  d      j                         c S g }|j                  d      }|D ]#  }	|j                  |	j                  d             % |sdj                  |      c S  y	)
Nr   z1.video-info-items, .video-info, .info, .video-tagu   主演[：:]\s*([^<]+)r   aTr   z / rQ   )	r   r   r   r   r   r   r   rg   r   )
r	   r   r   r   r   r;   actor_matchactorsactor_linksr   s
             r
   r   zSpider._extract_actor  s    T=1[[!TU
D==?D))$=tDK"((+1133 F++c*K#dmm$m78 $zz&))  r   c                     t        |d      }|j                  d      }|D ]K  }|j                         }t        j                  d|      }|s,|j                  d      j                         c S  y)Nr   z%.video-info-items, .video-info, .infou   导演[：:]\s*([^<]+)r   rQ   )r   r   r   r   r   r   r   )r	   r   r   r   r   r;   director_matchs          r
   r   zSpider._extract_director  se    T=1[[!HI
D==?DYY'@$GN%++A.4466	 
 r   c                 f    t        |d      }|j                  d      }|r|j                  d      S y)Nr   zY.video-info-content, .video-info-intro, .module-item-style.video-text, .desc, .video-textTr   u   暂无简介r   )r	   r   r   	desc_elems       r
   r   zSpider._extract_desc  s:    T=1OO$  A	%%D%11r   c                 f    t        |d      }|j                  d      }|r|j                  d      S y)Nr   z@.video-info-remarks, .module-item-text, .video-remarks, .remarksTr   rQ   r   )r	   r   r   remark_elems       r
   r   zSpider._extract_remarks  s7    T=1oo&hi''d'33r   c                     |sy|j                  d      rd|z   S |j                  d      r| j                  j                  d      |z   S |j                  d      s| j                  |z   S |S )NrQ   rU   rV   r   rT   )re   r   rf   )r	   r(   s     r
   r   zSpider._fix_url  sc    >>$S= >>#99##C(3..~~f%99s?"
r   )rQ   )N)r   )__name__
__module____qualname__r   r   r,   r?   rN   rw   r   r   r9   r:   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r   r      so    $&FP82
05n/#b 	&		r   r   __main__u   首页分类: r6   r0   u   首页视频数量: r8   u   
测试搜索功能：u   仙逆Fr   u   搜索结果数量: u
   . 标题: rZ   z, ID: rY   u
   , 图片: r[   u   
视频详情:u   标题: u   类型: u   年份: ry   u   地区: rz   u   演员: r{   u   导演: r|   u   简介: r}   d   r]   u   播放源: r~   u   播放列表: r   )!r   sysr&   urllib.parser^   r   bs4r   ra   urllib3disable_warnings
exceptionsInsecureRequestWarningpathrg   base.spiderr   r   spiderr   r?   home_resultr$   rc   rw   search_result	enumerater)   rp   first_videor   detail_result
video_info)cs   0r
   <module>r	     s   
 
         ++BB C   jV jZ zXF
KKM $$R(K	NK4HI4HqAkN4HIJ
KL	 [%8!9 :
;< 

#$((5!<M	 ]6%:!; <
=>]62A64:d:./vd8n5EZPTU^P_O`ab 7 V#F+A.,,k(.C-DE &v.q1JO%HZ
3456HZ4567HZ
3456HZ
3456HZ4567HZ789:HZ6t<=SABK
? ;<=>N:n#=">?@ ! #  Js   -G2
