forked from tfornik/RussiaTools
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
298 lines
10 KiB
298 lines
10 KiB
import re
|
|
import sys
|
|
import urllib.parse
|
|
from pyquery import PyQuery as pq
|
|
|
|
sys.path.append('..')
|
|
from base.spider import Spider
|
|
|
|
class Spider(Spider):
|
|
def getName(self):
|
|
return "美人吹箫"
|
|
|
|
def init(self, extend):
|
|
pass
|
|
|
|
def homeContent(self, filter):
|
|
result = {}
|
|
classes = []
|
|
try:
|
|
rsp = self.fetch("https://www.mrcx2.yachts/cn/home/web/")
|
|
if rsp and rsp.text:
|
|
doc = pq(rsp.text)
|
|
|
|
|
|
items = doc('.stui-header__menu li a')
|
|
for item in items.items():
|
|
name = item.text()
|
|
href = item.attr('href')
|
|
if name and href and name != "首页":
|
|
|
|
match = re.search(r'/type/id/(\d+)\.html', href)
|
|
if match:
|
|
classes.append({
|
|
'type_name': name,
|
|
'type_id': match.group(1)
|
|
})
|
|
|
|
|
|
if not classes:
|
|
items = doc('.dropdown.type li a')
|
|
for item in items.items():
|
|
name = item.text()
|
|
href = item.attr('href')
|
|
if name and href and name != "首页":
|
|
match = re.search(r'/type/id/(\d+)\.html', href)
|
|
if match:
|
|
classes.append({
|
|
'type_name': name,
|
|
'type_id': match.group(1)
|
|
})
|
|
|
|
|
|
seen = set()
|
|
unique_classes = []
|
|
for cls in classes:
|
|
if cls['type_id'] not in seen:
|
|
seen.add(cls['type_id'])
|
|
unique_classes.append(cls)
|
|
classes = unique_classes
|
|
|
|
except Exception as e:
|
|
print(f"homeContent error: {e}")
|
|
|
|
result['class'] = classes
|
|
return result
|
|
|
|
def homeVideoContent(self):
|
|
result = {}
|
|
try:
|
|
videos = []
|
|
url = "https://www.mrcx2.yachts/cn/home/web/"
|
|
rsp = self.fetch(url)
|
|
if rsp and rsp.text:
|
|
doc = pq(rsp.text)
|
|
items = doc('.stui-vodlist li.index')
|
|
for item in items.items():
|
|
a = item.find('.stui-vodlist__thumb')
|
|
href = a.attr('href')
|
|
title = a.attr('title') or item.find('.title a').attr('title')
|
|
img = a.attr('data-original') or a.attr('style')
|
|
|
|
|
|
if img and 'background-image:' in img:
|
|
match = re.search(r'url\(["\']?(.*?)["\']?\)', img)
|
|
if match:
|
|
img = match.group(1)
|
|
|
|
if not title or not href:
|
|
continue
|
|
|
|
|
|
play_count = item.find('.text').text() or '播放0次'
|
|
score = item.find('.score').text() or '0.0 分'
|
|
|
|
videos.append({
|
|
'vod_id': href,
|
|
'vod_name': title,
|
|
'vod_pic': img,
|
|
'vod_remarks': f"{score} | {play_count}"
|
|
})
|
|
|
|
result['list'] = videos
|
|
except Exception as e:
|
|
print(f"homeVideoContent error: {e}")
|
|
|
|
return result
|
|
|
|
def categoryContent(self, tid, pg, filter, extend):
|
|
result = {}
|
|
videos = []
|
|
try:
|
|
url = f"https://www.mrcx2.yachts/cn/home/web/index.php/vod/type/id/{tid}/page/{pg}.html"
|
|
rsp = self.fetch(url)
|
|
if rsp and rsp.text:
|
|
doc = pq(rsp.text)
|
|
items = doc('.stui-vodlist li')
|
|
for item in items.items():
|
|
a = item.find('.stui-vodlist__thumb')
|
|
href = a.attr('href')
|
|
title = a.attr('title') or item.find('.title a').attr('title')
|
|
img = a.attr('data-original') or a.attr('style')
|
|
|
|
|
|
if img and 'background-image:' in img:
|
|
match = re.search(r'url\(["\']?(.*?)["\']?\)', img)
|
|
if match:
|
|
img = match.group(1)
|
|
|
|
if not title or not href:
|
|
continue
|
|
|
|
|
|
play_count = item.find('.text').text() or '播放0次'
|
|
score = item.find('.score').text() or '0.0 分'
|
|
|
|
videos.append({
|
|
'vod_id': href,
|
|
'vod_name': title,
|
|
'vod_pic': img,
|
|
'vod_remarks': f"{score} | {play_count}"
|
|
})
|
|
except Exception as e:
|
|
print(f"categoryContent error: {e}")
|
|
|
|
result['list'] = videos
|
|
result['page'] = pg
|
|
result['pagecount'] = 9999
|
|
result['limit'] = 90
|
|
result['total'] = 999999
|
|
return result
|
|
|
|
def detailContent(self, array):
|
|
result = {}
|
|
if not array or not array[0]:
|
|
return result
|
|
|
|
try:
|
|
aid = array[0]
|
|
|
|
if aid.startswith('/'):
|
|
play_url = "https://www.mrcx2.yachts" + aid
|
|
else:
|
|
play_url = "https://www.mrcx2.yachts/cn/home/web/" + aid
|
|
|
|
rsp = self.fetch(play_url)
|
|
if not rsp or not rsp.text:
|
|
return result
|
|
|
|
html = rsp.text
|
|
doc = pq(html)
|
|
|
|
|
|
vod = {
|
|
'vod_id': aid,
|
|
'vod_name': doc('title').text() or '',
|
|
'vod_pic': '',
|
|
'vod_remarks': '',
|
|
'vod_content': '',
|
|
'vod_play_from': 'E佬通用视频',
|
|
'vod_play_url': ''
|
|
}
|
|
|
|
|
|
img = doc('.stui-vodlist__thumb').attr('data-original') or doc('.stui-vodlist__thumb').attr('style')
|
|
if img and 'background-image:' in img:
|
|
match = re.search(r'url\(["\']?(.*?)["\']?\)', img)
|
|
if match:
|
|
vod['vod_pic'] = match.group(1)
|
|
|
|
|
|
if not vod['vod_pic']:
|
|
img = doc('img').filter(lambda i, this: pq(this).attr('src') and 'cover' in pq(this).attr('src').lower()).attr('src')
|
|
if img:
|
|
vod['vod_pic'] = img
|
|
|
|
|
|
description = doc('.stui-vodlist__detail .text').text()
|
|
if description:
|
|
vod['vod_remarks'] = description
|
|
|
|
|
|
content = doc('.content').text() or doc('.detail').text() or doc('.stui-content__detail').text()
|
|
if content:
|
|
vod['vod_content'] = content
|
|
|
|
|
|
|
|
|
|
vod['vod_play_url'] = f'正片${play_url}'
|
|
|
|
result['list'] = [vod]
|
|
except Exception as e:
|
|
print(f"detailContent error: {e}")
|
|
|
|
return result
|
|
|
|
def searchContent(self, key, quick, page='1'):
|
|
result = {}
|
|
videos = []
|
|
try:
|
|
if not key:
|
|
return result
|
|
|
|
url = f"https://www.mrcx2.yachts/cn/home/web/index.php/vod/search/wd/{urllib.parse.quote(key)}/page/{page}.html"
|
|
rsp = self.fetch(url)
|
|
if rsp and rsp.text:
|
|
doc = pq(rsp.text)
|
|
items = doc('.stui-vodlist li')
|
|
for item in items.items():
|
|
a = item.find('.stui-vodlist__thumb')
|
|
href = a.attr('href')
|
|
title = a.attr('title') or item.find('.title a').attr('title')
|
|
img = a.attr('data-original') or a.attr('style')
|
|
|
|
|
|
if img and 'background-image:' in img:
|
|
match = re.search(r'url\(["\']?(.*?)["\']?\)', img)
|
|
if match:
|
|
img = match.group(1)
|
|
|
|
if not title or not href:
|
|
continue
|
|
|
|
|
|
play_count = item.find('.text').text() or '播放0次'
|
|
score = item.find('.score').text() or '0.0 分'
|
|
|
|
videos.append({
|
|
'vod_id': href,
|
|
'vod_name': title,
|
|
'vod_pic': img,
|
|
'vod_remarks': f"{score} | {play_count}"
|
|
})
|
|
except Exception as e:
|
|
print(f"searchContent error: {e}")
|
|
|
|
result['list'] = videos
|
|
return result
|
|
|
|
def playerContent(self, flag, id, vipFlags):
|
|
|
|
result = {}
|
|
try:
|
|
if not id:
|
|
return result
|
|
|
|
|
|
if id.startswith('http'):
|
|
play_url = id
|
|
else:
|
|
|
|
if id.startswith('/'):
|
|
play_url = "https://www.mrcx2.yachts" + id
|
|
else:
|
|
play_url = "https://www.mrcx2.yachts/cn/home/web/" + id
|
|
|
|
|
|
result["parse"] = 1
|
|
result["playUrl"] = ''
|
|
result["url"] = play_url
|
|
result["header"] = {
|
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
|
'Referer': 'https://www.mrcx2.yachts/'
|
|
}
|
|
|
|
except Exception as e:
|
|
print(f"playerContent error: {e}")
|
|
|
|
return result
|
|
|
|
def isVideoFormat(self, url):
|
|
return False
|
|
|
|
def manualVideoCheck(self):
|
|
return False
|
|
|
|
def localProxy(self, param):
|
|
return {} |