parent
01be9d0f10
commit
54b48e4ffb
@ -0,0 +1,184 @@
|
||||
import sys
|
||||
import json
|
||||
import re
|
||||
sys.path.append('..')
|
||||
from base.spider import Spider
|
||||
class Spider(Spider):
|
||||
def __init__(self):
|
||||
self.name = "剧透社"
|
||||
self.host = "https://1.star2.cn"
|
||||
self.timeout = 5000
|
||||
self.limit = 20
|
||||
self.headers = {
|
||||
"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"
|
||||
}
|
||||
self.default_image = "https://images.gamedog.cn/gamedog/imgfile/20241205/05105843u5j9.png"
|
||||
|
||||
def getName(self):
|
||||
return self.name
|
||||
|
||||
def init(self, extend=""):
|
||||
print(f"============{extend}============")
|
||||
|
||||
def homeContent(self, filter):
|
||||
return {
|
||||
'class': [
|
||||
{"type_name": "国剧", "type_id": "ju"},
|
||||
{"type_name": "电影", "type_id": "mv"},
|
||||
{"type_name": "动漫", "type_id": "dm"},
|
||||
{"type_name": "短剧", "type_id": "dj"},
|
||||
{"type_name": "综艺", "type_id": "zy"},
|
||||
{"type_name": "韩日", "type_id": "rh"},
|
||||
{"type_name": "英美", "type_id": "ym"},
|
||||
{"type_name": "外剧", "type_id": "wj"}
|
||||
]
|
||||
}
|
||||
|
||||
def categoryContent(self, tid, pg, filter, extend):
|
||||
result = {}
|
||||
url = f"{self.host}/{tid}/" if pg == 1 else f"{self.host}/{tid}/?page={pg}"
|
||||
|
||||
try:
|
||||
rsp = self.fetch(url, headers=self.headers, timeout=self.timeout)
|
||||
if rsp:
|
||||
videos = self._parse_video_list(rsp.text)
|
||||
result.update({
|
||||
'list': videos,
|
||||
'page': pg,
|
||||
'pagecount': 9999,
|
||||
'limit': self.limit,
|
||||
'total': 999999
|
||||
})
|
||||
except Exception as e:
|
||||
print(f"Category parse error: {e}")
|
||||
|
||||
return result
|
||||
|
||||
def _parse_video_list(self, html_text):
|
||||
videos = []
|
||||
|
||||
def build_full_url(href):
|
||||
if href.startswith("http"):
|
||||
return href
|
||||
return f"{self.host}{href}" if href.startswith("/") else f"{self.host}/{href}"
|
||||
|
||||
try:
|
||||
pattern = r'<li[^>]*>.*?<a[^>]*href="([^"]*)"[^>]*class="main"[^>]*>(.*?)</a>.*?</li>'
|
||||
for match in re.finditer(pattern, html_text, re.S):
|
||||
href = match.group(1)
|
||||
name = match.group(2).strip()
|
||||
|
||||
if href and name and href.startswith("/"):
|
||||
cleaned_name = re.sub(r'^【[^】]*】', '', name).strip()
|
||||
final_name = cleaned_name if cleaned_name else name
|
||||
videos.append({
|
||||
"vod_id": build_full_url(href),
|
||||
"vod_name": final_name,
|
||||
"vod_pic": self.default_image,
|
||||
"vod_remarks": "",
|
||||
"vod_content": final_name
|
||||
})
|
||||
except Exception as e:
|
||||
print(f"Parse video list error: {e}")
|
||||
|
||||
return videos
|
||||
|
||||
def detailContent(self, array):
|
||||
result = {'list': []}
|
||||
if array:
|
||||
try:
|
||||
vod_id = array[0]
|
||||
detail_url = vod_id if vod_id.startswith("http") else f"{self.host}{vod_id}"
|
||||
rsp = self.fetch(detail_url, headers=self.headers, timeout=self.timeout)
|
||||
if rsp:
|
||||
vod = self._parse_detail_page(rsp.text, detail_url)
|
||||
if vod:
|
||||
result['list'] = [vod]
|
||||
except Exception as e:
|
||||
print(f"Detail parse error: {e}")
|
||||
return result
|
||||
|
||||
def _parse_detail_page(self, html_text, detail_url):
|
||||
try:
|
||||
title_match = re.search(r'<h1[^>]*>(.*?)</h1>', html_text, re.S)
|
||||
title = title_match.group(1).strip() if title_match else "未知标题"
|
||||
title = re.sub(r'^【[^】]+】', '', title).strip() or "未知标题"
|
||||
baidu_links = []
|
||||
quark_links = []
|
||||
|
||||
link_pattern = r'<a[^>]*href="([^"]*)"[^>]*>.*?</a>'
|
||||
for match in re.finditer(link_pattern, html_text, re.S):
|
||||
href = match.group(1)
|
||||
if href:
|
||||
if "pan.baidu.com" in href:
|
||||
baidu_links.append(href)
|
||||
elif "pan.quark.cn" in href:
|
||||
quark_links.append(href)
|
||||
|
||||
play_links = baidu_links + quark_links
|
||||
play_from = "剧透社" if play_links else "无资源"
|
||||
|
||||
play_url_parts = []
|
||||
for link in play_links:
|
||||
if "pan.baidu.com" in link:
|
||||
play_url_parts.append(f"百度${link}")
|
||||
else:
|
||||
play_url_parts.append(f"夸克${link}")
|
||||
|
||||
play_url = "#".join(play_url_parts) or "暂无资源$#"
|
||||
|
||||
return {
|
||||
"vod_id": detail_url,
|
||||
"vod_name": title,
|
||||
"vod_pic": self.default_image,
|
||||
"vod_content": title,
|
||||
"vod_remarks": "",
|
||||
"vod_play_from": play_from,
|
||||
"vod_play_url": play_url
|
||||
}
|
||||
except Exception as e:
|
||||
print(f"Parse detail page error: {e}")
|
||||
return {
|
||||
"vod_id": detail_url,
|
||||
"vod_name": "未知标题",
|
||||
"vod_pic": self.default_image,
|
||||
"vod_content": f"加载详情页失败:{str(e)}",
|
||||
"vod_remarks": "",
|
||||
"vod_play_from": "无资源",
|
||||
"vod_play_url": "暂无资源$#"
|
||||
}
|
||||
|
||||
def searchContent(self, key, quick, pg):
|
||||
result = {'list': []}
|
||||
try:
|
||||
url = f"{self.host}/search/?keyword={key}"
|
||||
rsp = self.fetch(url, headers=self.headers, timeout=self.timeout)
|
||||
if rsp:
|
||||
result['list'] = self._parse_video_list(rsp.text)
|
||||
except Exception as e:
|
||||
print(f"Search error: {e}")
|
||||
return result
|
||||
|
||||
def playerContent(self, flag, id, vipFlags):
|
||||
if id.startswith("push://"):
|
||||
return {"parse": 0, "playUrl": "", "url": id, "header": ""}
|
||||
return {
|
||||
"parse": 0,
|
||||
"playUrl": "",
|
||||
"url": f"push://{id}",
|
||||
"header": json.dumps(self.headers)
|
||||
}
|
||||
|
||||
def homeVideoContent(self):
|
||||
return {"list": []}
|
||||
|
||||
def isVideoFormat(self, url):
|
||||
return False
|
||||
|
||||
def localProxy(self, url, param):
|
||||
return {"parse": 0, "playUrl": "", "url": url}
|
||||
|
||||
def manualVideoCheck(self, url):
|
||||
return {"parse": 0, "playUrl": "", "url": url}
|
||||
|
||||
|
||||
Loading…
Reference in new issue