
    hh_1                         d dl Z e j                            d           d dlmZ d dlZd dlZd dlZ G d de          ZdS )    Nz..)Spiderc                   f    e Z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 Zd ZdS )r   c                     dS )Nu
   快递🔞 selfs    '   /storage/emulated/0/纯福利/PY1/18.pygetNamezSpider.getName   s    |     c                 t    d| _         ddddd| j         d| _        |                     d| j                     d S )	Nzhttps://www.xjjkdfw.sbszMozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045713 Mobile 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Refereru*   快递🔞爬虫初始化完成，主站: )hostheaderslog)r   extends     r	   initzSpider.init   sS    -	 Xb8.&y
 
 	IdiIIJJJJJr   c                     dS )NFr   )r   urls     r	   isVideoFormatzSpider.isVideoFormat   s    ur   c                     dS )NTr   r   s    r	   manualVideoCheckzSpider.manualVideoCheck   s    tr   c                 F   i }|                                  }||d<   	 |                     | j        | j                  }|j        }|                     |          }||d<   nA# t          $ r4}|                     dt          |                      g |d<   Y d}~nd}~ww xY w|S )u   获取首页内容和分类classr   listu   首页获取出错: N)	_getCategoriesfetchr   r   text
_getVideos	Exceptionr   str)r   filterresultclassesrsphtmlvideoses           r	   homeContentzSpider.homeContent!   s    %%''!w	 **TY*==C8D__T**F#F6NN 	  	  	 HH4CFF44555F6NNNNNN	  s   AA   
B**BBc                 
    dg iS )u!   首页视频内容（可留空）r   r   r   s    r	   homeVideoContentzSpider.homeVideoContent0   s    |r   c                 p   	 t          |          }|dk    r| j         d| d}n| j         d| d| d}|                     d|            |                     || j                  }|j        }|                     |          }	d}
t          j        d	                    |          |          }|rt          d	 |D                       }
|	s|                     d
| d| d|            |	||
dddS # t          $ r9}|                     d| d| dt          |                      dg icY d}~S d}~ww xY w)u   分类内容   z	/vodtype/.htmlz/page/u   访问分类URL: r   i  z&<a href="/vodtype/{}/page/(\d+)\.html"c                 T    g | ]%}|                                 t          |          &S r   )isdigitint).0ps     r	   
<listcomp>z*Spider.categoryContent.<locals>.<listcomp>F   s+     K K KAqyy{{ KQ K K Kr   u   警告: 分类ID u	   , 页码 u    未找到任何视频。URL:    i?B )r   page	pagecountlimittotalu   分类内容获取出错 (tid=z, pg=): r   N)r4   r   r   r    r   r!   r"   refindallformatmaxr#   r$   )r   tidpgr%   r   pg_intr   r(   r)   r*   r:   
page_linksr+   s                r	   categoryContentzSpider.categoryContent4   s   	 WWF{{77S777EESEEEEEHH...///**S$,*77C8D__T**FI$M$T$TUX$Y$Y[_``J M K K K K KLL	 dbSbb2bb]`bbccc &    	  	  	 HHOcOOOOs1vvOOPPPB<	 s   C/C2 2
D5<.D0*D50D51c                 ^   	 | j          dt          j                            |           }|                     d|            |                     || j                  }t          j        |j	                  }g }|D ]n}|
                    dd          |
                    dd          |
                    dd          |
                    dd          d	}	|                    |	           od
|iS # t          $ r3}
|                     dt          |
                      d
g icY d}
~
S d}
~
ww xY w)u*   搜索功能（使用官方 AJAX 接口）z!/index.php/ajax/suggest?mid=1&wd=u   搜索URL: r   idr   namepicactorvod_idvod_namevod_picvod_remarksr   u   搜索出错: N)r   urllibparsequoter   r    r   jsonloadsr!   getappendr#   r$   )r   keyquickrC   
search_urlr(   datar*   itemvideor+   s              r	   searchContentzSpider.searchContentV   sO   	  IaaHZHZ[^H_H_aaJHH/://000**Z*>>C:ch''DF % %"hhtR00 $ 4 4#xxr22#'88GR#8#8	  e$$$$F## 	  	  	 HH.c!ff..///B<	 s   C,C/ /
D,9(D'!D,'D,c           	      x   	 |d         }| j          d| d}|                     d|            |                     || j                  }|j        }|                     ||          }|rd|gindg iS # t          $ r<}|                     d|d          dt          |                      dg icY d	}~S d	}~ww xY w)
u   详情页面r   z/voddetail/r1   u   详情URL: r   r   u   详情获取出错 (vid: r=   N)r   r   r    r   r!   
_getDetailr#   r$   )r   idsvid
detail_urlr(   r)   
video_infor+   s           r	   detailContentzSpider.detailContentm   s    
	 a&C I<<#<<<JHH/://000**Z*>>C8Ds33J-7IFZL))fb\I 	  	  	 HHDQDDCFFDDEEEB<	 s   A0A3 3
B9=1B4.B94B9c           	         	 | j          d| d}|                     d|            |                     || j                  }|j        dk    r#|                     d|j                    dd|d	S |j        }d
}t          j        ||t          j                  }|r;	 t          j
        |                    d                              dd                    }	|	                    dd                                          }
|
r|
                    d          rd|
z   }
nG|
                    d          r2|
                    d          s| j                             d          |
z   }
|                     d|
            dd|
t          j        | j                  dS n<# t$          $ r/}|                     dt'          |                      Y d}~nd}~ww xY wt          j        d|          }|r|                    d                                          }|                    d          rd|z   }nG|                    d          r2|                    d          s| j                             d          |z   }|                     d|            dd|d	S |                     d           dd|d	S # t$          $ rC}|                     d| dt'          |                      dd| j          d| dd	cY d}~S d}~ww xY w)u   播放链接解析z	/vodplay/r1   u   播放页面URL: r      u#   播放页请求失败，状态码: r0   r   )rS   playUrlr   zvar player_aaaa=({.*?});'"r   //https:/httpu   ✅ 找到视频直链: r   )rS   ri   r   headeru   解析player_aaaa失败: Nz#<iframe[^>]*src=["\']([^"\']+)["\']u   📹 找到iframe播放源: u1   ⚠️ 未找到播放源，返回原始播放页u   播放链接获取出错 (id: r=   )r   r   r    r   status_coder!   r>   searchDOTALLrU   rV   groupreplacerW   strip
startswithrstripdumpsr#   r$   )r   flagrI   vipFlagsplay_page_urlr(   r)   player_patternplayer_matchplayer_data	video_urlr+   iframe_match
iframe_urls                 r	   playerContentzSpider.playerContent{   s   6	X#y<<2<<<MHH888999**]DL*AAC#%%PsPPQQQ!"r-HHH8D 9N9^T29EEL CC"&*\-?-?-B-B-J-J3PS-T-T"U"UK +r : : @ @ B BI  $//55 J(09(<II&11#66 Jy?S?STZ?[?[ J(,	(8(8(=(=	(II!GI!G!GHHH%&')#,&*j&>&>	     ! C C CHHAQAABBBBBBBBC 9%KTRRL F)//2288::
((.. D!)J!6JJ**3// D
8M8Mf8U8U D!%!1!1#!6!6!CJD
DDEEE!"r*EEE HHIJJJ2mDDD 	X 	X 	XHHEbEESVVEEFFF26V6VR6V6V6VWWWWWWWW	XsV   A.J1 1,J1 C<F J1 
G&%GJ1 GC J1 J1 1
K>;8K93K>9K>c                    	 |                      | j        | j                  }|j        }g }d}t	          j        ||          }t                      }|D ]\\  }}|                                rC||vr?|                    |           |	                    ||                                d           ]|S # t          $ r1}	|                     dt          |	                      g cY d}	~	S d}	~	ww xY w)u   从首页提取分类r   z/<a href="/vodtype/(\d+)\.html"[^>]*>([^<]+)</a>)type_id	type_nameu   获取分类出错: N)r    r   r   r!   r>   r?   setrv   addrX   r#   r   r$   )
r   r(   r)   
categoriespatternmatchesseenrB   rJ   r+   s
             r	   r   zSpider._getCategories   s   	**TY*==C8DJHGj$//G55D$ S S	T::<< SCtOOHHSMMM%%#DJJLL&Q&QRRR 	 	 	HH4CFF44555IIIIII	s   B/B2 2
C-<&C("C-(C-c                    g }d}t          j        ||t           j        t           j        z            }|D ]\  }}}}}	}
|                    d          s;|                    d          r
| j        |z   n|                    d          rd|z   n|}||                                ||	                                 d|
                                 d}|                    |           |S )u   从HTML中提取视频列表z<a\s+class="thumbnail"[^>]*href="(/vodplay/(\d+)-\d+-\d+\.html)"[^>]*>.*?data-original="([^"]+)".*?</a>.*?<a\s+href="/voddetail/\d+\.html"[^>]*>([^<]+)</a>.*?<p\s+class="vodtitle">([^<]+?)\s*-\s*<span\s+class="title">([^<]+)</span>ro   rn   rl   rm   z | rM   )r>   r?   rs   
IGNORECASErw   r   rv   rX   )r   r)   r*   r   r   full_play_linkrc   rK   titlecategorydater^   s               r	   r"   zSpider._getVideos   s     }*WdBI,EFF?F 
	! 
	!;NCeXt>>&)) r),)<)<qdi#ooTWTbTbcgThThBq(S..nq !KKMM"*.."2"2EEtzz||EE	 E MM%    r   c                 6   	 |                      d|          }|                      d|          }|rP|                    d          s;|                    d          r
| j        |z   n|                    d          rd|z   n|}|                      d|          }|r=|                                                    dd	                              d
d          }n|}d}t          j        d|          }|r'|                    d                                          }d}g }	g }
t          j        d|          }|rt          |          D ]\  }}d|dz    }g }t          j        d|          }|D ]2\  }}}|
                    |                                 d|            3|r=|	
                    |           |

                    d                    |                     |
s
dg}	d| dg}
|                      d|          }||||r|                                ndddd|||d                    |	          d                    |
          dS # t          $ rE}|                     d| dt          |                      |ddddddddd dd| ddcY d!}~S d!}~ww xY w)"u   获取详情信息z <h2\s+class="title">([^<]+)</h2>zdata-original="([^"]+)"ro   rn   rl   rm   z'<div\s+class="content">([\s\S]*?)</div>z<br>
z</br>r   z&([\u4e00-\u9fa5]{2,4})[-\s]+[A-Z0-9-]+r0   z&<ul\s+class="playlist">([\s\S]*?)</ul>u   线路z;<a\s+href="(/vodplay/(\d+-\d+-\d+)\.html)"[^>]*>([^<]+)</a>$#u	   默认源u   第1集$z-1-1z/<a\s+href="/vodtype/\d+\.html"[^>]*>([^<]+)</a>u   未知2025u   网络u   高清z$$$)rN   rO   rP   r   vod_yearvod_arearQ   	vod_actorvod_directorvod_contentvod_play_fromvod_play_urlu   获取详情失败 (vid=r=   u   加载失败u   详情加载失败N)regStrrw   r   rv   ru   r>   rr   rt   r?   	enumeraterX   joinr#   r   r$   )r   r)   rc   r   rK   descrL   actor_matchdirector	play_fromplay_url_listplaylist_matchesipl_htmlsource_nameepisodes
ep_matchesfull_urlep_idep_namer   r+   s                         r	   ra   zSpider._getDetail   sR   N	KK CTJJE ++8$??C r3>>&11 r),)<)<qdi#ooTWTbTbcgThThBq(S..nq ;;I4PPD zz||++FD99AA'2NN E)$MuUUK 5#))!,,2244 H IM!z*SUYZZ 	A"+,<"="= A AJAw"01Q3..K!H!#,jls!t!tJ4> F F0% 7==??(D(DU(D(DEEEE A!((555%,,SXXh-?-?@@@ ! 7(M	!5C!5!5!5 6 $VX\]]I !2;IY__..."$'" (#!&I!6!6 %

= 9 9    	 	 	HH@@@A@@AAA*! "3!, 43 4 4 4       	s   II	 	
J:JJJc                 p    	 t          j        ||          }|r|                    d          ndS #  Y dS xY w)u   正则提取第一个匹配组r0   r   )r>   rr   rt   )r   r   stringmatchs       r	   r   zSpider.regStr9  sA    	Igv..E%*25;;q>>>2	22s   -0 5N)r   )rG   )__name__
__module____qualname__r
   r   r   r   r,   r.   rF   r_   rf   r   r   r"   ra   r   r   r   r	   r   r   
   s          
K 
K 
K 
K                D       .     8X 8X 8Xx  &  :P P Pd    r   r   )	syspathrX   base.spiderr   rU   urllib.parserR   r>   r   r   r	   <module>r      s    


                				u u u u uV u u u u ur   