8899"""
1010
11+ import importlib
12+
1113import requests
12- from requests .adapters import HTTPAdapter
1314from requests .cookies import RequestsCookieJar
1415from requests .packages .urllib3 .exceptions import InsecureRequestWarning
1516
1617import feapder .setting as setting
1718import feapder .utils .tools as tools
1819from feapder .db .redisdb import RedisDB
1920from feapder .network import user_agent
21+ from feapder .network .downloader import Downloader
2022from feapder .network .proxy_pool import ProxyPool
2123from feapder .network .response import Response
2224from feapder .utils .log import log
2628requests .packages .urllib3 .disable_warnings (InsecureRequestWarning )
2729
2830
31+ def import_cls (cls_info ) -> Downloader :
32+ module , class_name = cls_info .rsplit ("." , 1 )
33+ cls = importlib .import_module (module ).__getattribute__ (class_name )
34+ return cls ()
35+
36+
2937class Request (object ):
30- session = None
3138 webdriver_pool : WebDriverPool = None
3239 user_agent_pool = user_agent
3340 proxies_pool : ProxyPool = None
@@ -36,8 +43,9 @@ class Request(object):
3643 cached_redis_key = None # 缓存response的文件文件夹 response_cached:cached_redis_key:md5
3744 cached_expire_time = 1200 # 缓存过期时间
3845
39- local_filepath = None
40- oss_handler = None
46+ # 下载器
47+ downloader = import_cls (setting .DOWNLOADER )
48+ session_downloader = import_cls (setting .SESSION_DOWNLOADER )
4149
4250 __REQUEST_ATTRS__ = {
4351 # 'method', 'url', 必须传递 不加入**kwargs中
@@ -175,20 +183,6 @@ def __setattr__(self, key, value):
175183 def __lt__ (self , other ):
176184 return self .priority < other .priority
177185
178- @property
179- def _session (self ):
180- use_session = (
181- setting .USE_SESSION if self .use_session is None else self .use_session
182- ) # self.use_session 优先级高
183- if use_session and not self .__class__ .session :
184- self .__class__ .session = requests .Session ()
185- # pool_connections – 缓存的 urllib3 连接池个数 pool_maxsize – 连接池中保存的最大连接数
186- http_adapter = HTTPAdapter (pool_connections = 1000 , pool_maxsize = 1000 )
187- # 任何使用该session会话的 HTTP 请求,只要其 URL 是以给定的前缀开头,该传输适配器就会被使用到。
188- self .__class__ .session .mount ("http" , http_adapter )
189-
190- return self .__class__ .session
191-
192186 @property
193187 def _webdriver_pool (self ):
194188 if not self .__class__ .webdriver_pool :
@@ -392,11 +386,13 @@ def get_response(self, save_cached=False):
392386 raise e
393387
394388 elif use_session :
395- response = self ._session .request (method , self .url , ** self .requests_kwargs )
396- response = Response (response )
389+ response = self .session_downloader .download (
390+ method , self .url , ** self .requests_kwargs
391+ )
397392 else :
398- response = requests .request (method , self .url , ** self .requests_kwargs )
399- response = Response (response )
393+ response = self .downloader .download (
394+ method , self .url , ** self .requests_kwargs
395+ )
400396
401397 if save_cached :
402398 self .save_cached (response , expire_time = self .__class__ .cached_expire_time )
0 commit comments