download.py 2.3 KB

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