-
Notifications
You must be signed in to change notification settings - Fork 283
Expand file tree
/
Copy path_bridge.py
More file actions
134 lines (111 loc) · 3.78 KB
/
_bridge.py
File metadata and controls
134 lines (111 loc) · 3.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import importlib
import sys
import traceback
import json
import os
method_dict = {
'init': 'init',
'home': 'homeContent',
'homeVod': 'homeVideoContent',
'category': 'categoryContent',
'detail': 'detailContent',
'search': 'searchContent',
'play': 'playerContent',
'proxy': 'localProxy',
'action': 'action',
}
def import_module(module_url):
return importlib.import_module(module_url)
def load_spider(script_path):
"""动态加载指定路径的 Python 脚本并实例化 Spider 类"""
try:
script_name = os.path.basename(script_path)[:-3]
print('load_spider:', script_name)
module = import_module(script_name)
# 检查 Spider 类是否存在
if not hasattr(module, 'Spider'):
raise AttributeError(f"Script {script_path} does not contain a 'Spider' class")
# 实例化 Spider
spider = module.Spider()
return spider
except Exception as e:
# 打印详细错误信息
error_msg = {
"error": str(e),
"traceback": traceback.format_exc()
}
print(error_msg)
def t4_spider_init(spider, ext=''):
# 调用方法
spider.setExtendInfo(ext)
# 获取依赖项
depends = spider.getDependence() or []
modules = []
module_names = []
for lib in depends:
try:
module = import_module(lib).Spider()
modules.append(module)
module_names.append(lib)
except Exception as e:
print(f'装载依赖{lib}发生错误:{e}')
if len(module_names) > 0:
print(f'当前依赖列表:{module_names}')
result = spider.init(modules)
setattr(spider, '_init_ok_', True)
return spider, result
def call_spider_method(spider, method_name, args):
"""调用 Spider 实例的指定方法"""
invoke_method_name = method_dict.get(method_name) or method_name
try:
# 检查方法是否存在
if not hasattr(spider, invoke_method_name):
raise AttributeError(f"Spider has no method named '{invoke_method_name}'")
method = getattr(spider, invoke_method_name)
# 解析参数
parsed_args = []
for arg in args:
try:
# 尝试解析 JSON
parsed_args.append(json.loads(arg))
except json.JSONDecodeError:
# 保持原始字符串
parsed_args.append(arg)
print(f'parsed_args:{parsed_args}')
if method_name == 'init':
spider, result = t4_spider_init(spider, *parsed_args)
# result = spider.init(modules)
return result
else:
if not hasattr(spider, '_init_ok_'):
# spider,_ = t4_spider_init(spider,*parsed_args) # 需要传extend参数,暂时没有好办法
spider, _ = t4_spider_init(spider, *parsed_args)
method = getattr(spider, invoke_method_name)
result = method(*parsed_args)
# 返回结果
if result:
try:
return spider.json2str(result)
except Exception as e:
pass
return result
except Exception as e:
# 打印详细错误信息
error_msg = {
"error": str(e),
"traceback": traceback.format_exc()
}
print(error_msg)
def main():
if len(sys.argv) < 3:
print("Usage: python bridge.py <script_path> <method_name> [args...]")
return
script_path = sys.argv[1]
method_name = sys.argv[2]
args = sys.argv[3:]
print(f'script_path:{script_path},method_name:{method_name}')
spider = load_spider(script_path)
result = call_spider_method(spider, method_name, args)
print(result)
if __name__ == '__main__':
main()