_requests.py 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on 2022/4/10 5:57 下午
  4. ---------
  5. @summary:
  6. ---------
  7. @author: Boris
  8. @email: boris_liu@foxmail.com
  9. """
  10. import random
  11. import requests
  12. from requests.adapters import HTTPAdapter
  13. from requests.packages.urllib3.util.ssl_ import create_urllib3_context
  14. import feapder.setting as setting
  15. from feapder.network.downloader.base import Downloader
  16. from feapder.network.response import Response
  17. class RequestsDownloader(Downloader):
  18. def download(self, request) -> Response:
  19. response = requests.request(
  20. request.method, request.url, **request.requests_kwargs
  21. )
  22. response = Response(response)
  23. return response
  24. class RequestsSessionDownloader(Downloader):
  25. session = None
  26. @property
  27. def _session(self):
  28. if not self.__class__.session:
  29. self.__class__.session = requests.Session()
  30. # pool_connections – 缓存的 urllib3 连接池个数 pool_maxsize – 连接池中保存的最大连接数
  31. http_adapter = HTTPAdapter(pool_connections=1000, pool_maxsize=1000)
  32. # 任何使用该session会话的 HTTP 请求,只要其 URL 是以给定的前缀开头,该传输适配器就会被使用到。
  33. self.__class__.session.mount("http", http_adapter)
  34. return self.__class__.session
  35. def download(self, request) -> Response:
  36. response = self._session.request(
  37. request.method, request.url, **request.requests_kwargs
  38. )
  39. response = Response(response)
  40. return response
  41. class _DESAdapter(HTTPAdapter):
  42. def __init__(self, *args, **kwargs):
  43. """
  44. A TransportAdapter that re-enables 3DES support in Requests.
  45. """
  46. ciphers = ":".join(setting.SESSION_REQUEST_CIPHERS).split(":")
  47. random.shuffle(ciphers)
  48. ciphers = ":".join(ciphers)
  49. self.ciphers = ciphers + ":!aNULL:!eNULL:!MD5"
  50. super().__init__(*args, **kwargs)
  51. def init_poolmanager(self, *args, **kwargs):
  52. context = create_urllib3_context(ciphers=self.ciphers)
  53. kwargs["ssl_context"] = context
  54. return super(_DESAdapter, self).init_poolmanager(*args, **kwargs)
  55. def proxy_manager_for(self, *args, **kwargs):
  56. context = create_urllib3_context(ciphers=self.ciphers)
  57. kwargs["ssl_context"] = context
  58. return super(_DESAdapter, self).proxy_manager_for(*args, **kwargs)
  59. class RequestsJa3SessionDownloader(Downloader):
  60. session = None
  61. @property
  62. def _session(self):
  63. if not self.__class__.session:
  64. self.__class__.session = requests.Session()
  65. # pool_connections – 缓存的 urllib3 连接池个数
  66. # pool_maxsize – 连接池中保存的最大连接数
  67. des_adapter = _DESAdapter(pool_connections=1000, pool_maxsize=1000)
  68. # 任何使用该 session会话的 HTTP/HTTPS 请求,
  69. # 只要其 URL 是以给定的前缀开头,该传输适配器就会被使用到。
  70. self.__class__.session.mount("https://", des_adapter)
  71. self.__class__.session.mount("http://", des_adapter)
  72. return self.__class__.session
  73. def download(self, request) -> Response:
  74. response = self._session.request(
  75. request.method, request.url, **request.requests_kwargs
  76. )
  77. response = Response(response)
  78. return response