download.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import requests
  2. import urllib3
  3. from requests.models import Response
  4. from config.load import headers
  5. urllib3.disable_warnings()
  6. class Downloader:
  7. def __init__(self):
  8. self.timeout = 15
  9. self.allow_redirects = False
  10. self.max_retries = 3
  11. def prepare_params(self, **kw):
  12. request_params = {}
  13. request_params.setdefault('allow_redirects', self.allow_redirects)
  14. request_params.setdefault('timeout', self.timeout)
  15. for key, val in kw.items():
  16. if key != 'headers' and key in request_params:
  17. request_params.update({key: val})
  18. else:
  19. request_params.setdefault(key, val)
  20. request_headers = (kw.get('headers') or headers)
  21. for key, val in request_headers.items():
  22. if key in request_headers:
  23. request_headers.update({key: val})
  24. else:
  25. request_headers.setdefault(key, val)
  26. request_params.setdefault('headers', request_headers)
  27. return request_params
  28. def _requests_by_get(self, url, **kw):
  29. request_params = self.prepare_params(**kw)
  30. response = Response()
  31. response.encoding = 'utf-8'
  32. response.status_code = 10400
  33. retries = 0
  34. while retries < self.max_retries:
  35. try:
  36. response = requests.get(url, **request_params)
  37. break
  38. except requests.exceptions.SSLError as e:
  39. response.reason = e.__class__.__name__
  40. if 'verify' not in request_params:
  41. request_params.setdefault('verify', True)
  42. else:
  43. url = url.replace('https', 'http')
  44. retries += 1
  45. except requests.RequestException as e:
  46. response.reason = e.__class__.__name__
  47. retries += 1
  48. return response
  49. def get(self, url, **kw):
  50. """
  51. 网络请求
  52. :param url: 访问地址
  53. :param kw: requests.GET请求参数
  54. :return: 响应对象
  55. """
  56. return self._requests_by_get(url, **kw)