diff --git a/DrissionPage/drission.py b/DrissionPage/drission.py index 13ab9c5..4fc3106 100644 --- a/DrissionPage/drission.py +++ b/DrissionPage/drission.py @@ -22,18 +22,20 @@ class Drission(object): """Drission类整合了WebDriver对象和HTLSession对象,可按要求创建、关闭及同步cookies""" def __init__(self, driver_options: Union[dict, Options] = None, session_options: dict = None, - driver_path: str = None, ini_path: str = None): + driver_path: str = None, ini_path: str = None, proxy: dict = None): """初始化配置信息,但不生成session和driver实例 :param driver_options: chrome设置,Options类或设置字典 :param session_options: session设置 :param driver_path: chromedriver路径,如为空,则为'chromedriver' :param ini_path: ini文件路径' + :param proxy: 代理设置 """ self._session = None self._driver = None om = OptionsManager(ini_path) self._session_options = session_options or om.get_option('session_options') self._driver_options = _chrome_options_to_dict(driver_options) or om.get_option('chrome_options') + self._proxy = proxy if driver_path: self._driver_path = driver_path @@ -43,7 +45,7 @@ class Drission(object): self._driver_path = 'chromedriver' @property - def session(self): + def session(self) -> HTMLSession: """获取HTMLSession对象""" if self._session is None: self._session = HTMLSession() @@ -52,17 +54,21 @@ class Drission(object): for i in attrs: if i in self._session_options: exec(f'self._session.{i} = self._session_options["{i}"]') + if self._proxy: + self._session.proxies = self._proxy return self._session @property - def driver(self): + def driver(self) -> WebDriver: """获取WebDriver对象,按传入配置信息初始化""" if self._driver is None: if isinstance(self._driver_options, dict): options = _dict_to_chrome_options(self._driver_options) else: raise KeyError('Driver options invalid') + if self._proxy: + options.add_argument(f'--proxy-server={self._proxy["http"]}') self._driver = webdriver.Chrome(self._driver_path, options=options) @@ -89,6 +95,25 @@ class Drission(object): def session_options(self, value: dict): self._session_options = value + @property + def proxy(self) -> Union[None, dict]: + return self._proxy + + @proxy.setter + def proxy(self, proxies: dict = None): + self._proxy = proxies + if self._session: + self._session.proxies = proxies + if self._driver: + cookies = self._driver.get_cookies() + url = self._driver.current_url + self._driver.quit() + self._driver = None + self._driver = self.driver + self._driver.get(url) + for cookie in cookies: + self._driver.add_cookie(cookie) + def cookies_to_session(self, copy_user_agent: bool = False, driver: WebDriver = None, session: Session = None) \ -> None: """把driver的cookies复制到session""" diff --git a/DrissionPage/mix_page.py b/DrissionPage/mix_page.py index fafb624..25a4348 100644 --- a/DrissionPage/mix_page.py +++ b/DrissionPage/mix_page.py @@ -45,7 +45,6 @@ class MixPage(Null, SessionPage, DriverPage): self._driver = None self._url = None self._response = None - self._proxies = None self.timeout = timeout self._url_available = None self._mode = mode @@ -111,6 +110,7 @@ class MixPage(Null, SessionPage, DriverPage): 每次访问时切换到d模式,主要用于独有函数及外部调用 :return:selenium的WebDriver对象 """ + # TODO: 改成每次获取drission的driver if self._driver is None: self._driver = self._drission.driver self.change_mode('d') diff --git a/DrissionPage/session_page.py b/DrissionPage/session_page.py index c90e63d..e24e46c 100644 --- a/DrissionPage/session_page.py +++ b/DrissionPage/session_page.py @@ -29,7 +29,6 @@ class SessionPage(object): self._url = None self._url_available = None self._response = None - self._proxies = None @property def session(self) -> HTMLSession: @@ -54,14 +53,6 @@ class SessionPage(object): """当前session的cookies""" return self.session.cookies.get_dict() - @property - def proxies(self) -> dict: - return self._proxies - - @proxies.setter - def proxies(self, value: dict): - self._proxies = value - @property def title(self) -> str: """获取网页title""" @@ -70,7 +61,6 @@ class SessionPage(object): @property def html(self) -> str: """获取元素innerHTML,如未指定元素则获取所有源代码""" - # return unescape(self.response.html.raw_html.replace(b'\x08', b'').decode()).replace('\xa0', ' ') return self.response.html.html def ele(self, loc_or_ele: Union[tuple, str, SessionElement], mode: str = None, show_errmsg: bool = False) \ @@ -217,9 +207,6 @@ class SessionPage(object): if self._url: kwargs['headers']['Referer'] = self._url - if 'proxies' not in kwargs_set and self._proxies: - kwargs['proxies'] = self.proxies - if 'timeout' not in kwargs_set: kwargs['timeout'] = self.timeout