__init__.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from os.path import realpath, dirname, splitext, join
  2. from os import listdir
  3. from imp import load_source
  4. import grequests
  5. engine_dir = dirname(realpath(__file__))
  6. engines = []
  7. for filename in listdir(engine_dir):
  8. modname = splitext(filename)[0]
  9. if filename.startswith('_') or not filename.endswith('.py'):
  10. continue
  11. filepath = join(engine_dir, filename)
  12. engine = load_source(modname, filepath)
  13. if not hasattr(engine, 'request') or not hasattr(engine, 'response'):
  14. continue
  15. engines.append(engine)
  16. def default_request_params():
  17. return {'method': 'GET', 'headers': {}, 'data': {}, 'url': ''}
  18. def make_callback(results, callback):
  19. def process_callback(response, **kwargs):
  20. results.extend(callback(response))
  21. return process_callback
  22. def search(query, request):
  23. global engines
  24. requests = []
  25. results = []
  26. user_agent = request.headers.get('User-Agent', '')
  27. for engine in engines:
  28. headers = default_request_params()
  29. headers['User-Agent'] = user_agent
  30. request_params = engine.request(query, headers)
  31. callback = make_callback(results, engine.response)
  32. if request_params['method'] == 'GET':
  33. req = grequests.get(request_params['url']
  34. ,headers=headers
  35. ,hooks=dict(response=callback)
  36. )
  37. else:
  38. req = grequests.post(request_params['url']
  39. ,data=request_params['data']
  40. ,headers=headers
  41. ,hooks=dict(response=callback)
  42. )
  43. requests.append(req)
  44. grequests.map(requests)
  45. return results