download.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. @staticmethod
  8. def _requests_by_get(url, max_retries=3, **kw):
  9. request_params = {}
  10. request_params.setdefault('allow_redirects', False)
  11. request_params.setdefault('timeout', 15)
  12. request_params.setdefault('headers', headers)
  13. for key, val in kw.items():
  14. if key == 'headers':
  15. for k, v in val.items():
  16. if str(k).lower() == 'user-agent':
  17. del headers['User-Agent']
  18. headers.update(val)
  19. request_params.update({'headers': headers})
  20. elif key in request_params:
  21. request_params.update({key: val})
  22. else:
  23. request_params.setdefault(key, val)
  24. retries = 0
  25. response = Response()
  26. response.encoding = 'utf-8'
  27. setattr(response, 'loop_times', 1) # 异常通信频次默认值1
  28. while retries < max_retries:
  29. try:
  30. response = requests.get(url, **request_params)
  31. setattr(response, 'loop_times', 0) # 正常通信频次默认值0
  32. break
  33. except requests.exceptions.SSLError as e:
  34. response.status_code = e.response.status_code
  35. response.reason = e.__class__.__name__
  36. if 'verify' not in request_params:
  37. request_params.setdefault('verify', True)
  38. retries += 1
  39. except requests.RequestException as e:
  40. if e.response is not None:
  41. response.status_code = e.response.status_code
  42. else:
  43. response.status_code = 10400
  44. response.reason = e.__class__.__name__
  45. retries += 1
  46. return response
  47. def get(self, url, **kw):
  48. """
  49. 网络请求
  50. :param url: 访问地址
  51. :param kw: 额外请求参数
  52. :return: 响应对象
  53. """
  54. return self._requests_by_get(url, **kw)
  55. # if __name__ == '__main__':
  56. # r = Downloader().get('http://httpbin.org/status/401')
  57. # print(r, r.loop_times)