Python动态执行类中的某个方法
最近在学习django的DRF框架,在看源码的时候发现内部的dispatch
方法是通过请求方式字符串映射执行某个方法。
忽然想起自己毕设的后端代码也有类似的需求,大概就是判断是哪个平台的url,然后执行对应的爬虫,我原来是通过if
实现的。
spider_obj = Spider(request.POST.get('url').strip())
if spider_obj.check(): # 判断 url是否合法
domain = spider_obj.domain
if domain == '京东':
data = spider_obj.jd()
elif domain == '苏宁':
data = spider_obj.sn()
elif domain == '唯品会':
data = spider_obj.vip()
elif domain == '网易严选':
data = spider_obj.wy()
else:
return JsonResponse({'status': False, 'error': '不支持此链接'})
这样写也没问题,看到dispatch
的实现方法我也改了下我的代码。
主要是getattr
函数。基本使用方法:getattr(object, name[, default])
- object:检索对象。
- name:字符串,检索的属性名或方法名。
- default:可选参数,指定的属性不存在,返回这个值。
实现代码:
class Spider():
def __init__(self, url):
self.url = url
self.domain = None
def check(self):
domain_rules = {
'jd': r'^https:\/\/item\.jd\.com\/\d+\.html',
'sn': r'^https:\/\/product\.suning\.com\/\d+\/\d+\.html',
'vip': r'^https:\/\/detail\.vip\.com\/detail-\d+-\d+\.html',
'wy': r'^https:\/\/you\.163\.com\/item\/detail\?id=\d+'
}
for domain, rule in domain_rules.items():
if re.match(rule, self.url):
self.domain = domain
return True
return False
def jd(self):
...
def su(self):
...
def vip(self):
...
def wy(self):
...
def spider_api(request):
spider_obj = Spider(request.POST.get('url').strip())
if spider_obj.check(): # 判断 url是否合法
domain = spider_obj.domain
data = getattr(spider_obj, domain, None) # 根据域名执行对应的爬虫方法
if data:
data = data()
else:
return JsonResponse({'status': False, 'error': '不支持的链接'})
data = getattr(spider_obj, domain, None)
,主要是这行代码。
- 把Spider类的实例化对象spider_obj作为检索对象。
- domain需要执行的方法名。
- None如果方法名不存在则为None。
还要注意下这行代码data = data()
因为getattr
只是帮我们找到这个方法,并没有执行,所以还需要加括号执行检索到的这个方法。
如果文章对你有帮助!可点击按钮打赏哦 ~
Allen
1 #