From 18951def81a3c0ffed220a90999372265036300e Mon Sep 17 00:00:00 2001 From: g1879 Date: Mon, 20 Nov 2023 22:35:42 +0800 Subject: [PATCH] =?UTF-8?q?s=E6=A8=A1=E5=BC=8F=E8=BF=94=E5=9B=9E=E7=A9=BA?= =?UTF-8?q?=E6=97=B6=E9=87=8D=E8=AF=95=EF=BC=9B=E9=BB=98=E8=AE=A4=E4=B8=8D?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E4=B8=8B=E8=BD=BD=E7=AE=A1=E7=90=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=9BSessionOptions=E7=9A=84set=5Fpaths()=E6=94=B9?= =?UTF-8?q?=E6=88=90set=5Fdownload=5Fpath()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/_base/base.py | 3 +-- DrissionPage/_configs/chromium_options.py | 4 +-- DrissionPage/_configs/session_options.py | 22 ++++++++++++----- DrissionPage/_configs/session_options.pyi | 2 +- DrissionPage/_pages/chromium_base.py | 9 +++---- DrissionPage/_pages/chromium_base.pyi | 2 +- DrissionPage/_pages/chromium_page.py | 4 +-- DrissionPage/_pages/session_page.py | 6 +++-- DrissionPage/_units/download_manager.py | 30 ++++++++++++++++------- DrissionPage/_units/download_manager.pyi | 9 +++++-- DrissionPage/_units/setter.py | 6 +++-- 11 files changed, 62 insertions(+), 35 deletions(-) diff --git a/DrissionPage/_base/base.py b/DrissionPage/_base/base.py index 993699e..7735145 100644 --- a/DrissionPage/_base/base.py +++ b/DrissionPage/_base/base.py @@ -4,7 +4,6 @@ @Contact : g1879@qq.com """ from abc import abstractmethod -from pathlib import Path from re import sub from urllib.parse import quote @@ -378,7 +377,7 @@ class BasePage(BaseParser): self.retry_times = 3 self.retry_interval = 2 self._DownloadKit = None - self._download_path = str(Path('.').absolute()) + self._download_path = None @property def title(self): diff --git a/DrissionPage/_configs/chromium_options.py b/DrissionPage/_configs/chromium_options.py index 5993f7b..3f1e962 100644 --- a/DrissionPage/_configs/chromium_options.py +++ b/DrissionPage/_configs/chromium_options.py @@ -30,7 +30,7 @@ class ChromiumOptions(object): self.ini_path = om.ini_path options = om.chrome_options - self._download_path = om.paths.get('download_path', '') + self._download_path = om.paths.get('download_path', None) or None self._arguments = options.get('arguments', []) self._browser_path = options.get('browser_path', '') self._extensions = options.get('extensions', []) @@ -68,7 +68,7 @@ class ChromiumOptions(object): self.ini_path = None self._browser_path = "chrome" self._arguments = [] - self._download_path = '' + self._download_path = None self._extensions = [] self._prefs = {} self._flags = {} diff --git a/DrissionPage/_configs/session_options.py b/DrissionPage/_configs/session_options.py index ed8f808..4e7f422 100644 --- a/DrissionPage/_configs/session_options.py +++ b/DrissionPage/_configs/session_options.py @@ -21,7 +21,7 @@ class SessionOptions(object): :param ini_path: ini文件路径 """ self.ini_path = None - self._download_path = '' + self._download_path = None self._timeout = 10 self._del_set = set() # 记录要从ini文件删除的参数 @@ -75,7 +75,7 @@ class SessionOptions(object): self.set_proxies(om.proxies.get('http', None), om.proxies.get('https', None)) self._timeout = om.timeouts.get('implicit', 10) - self._download_path = om.paths.get('download_path', '') + self._download_path = om.paths.get('download_path', None) or None # ===========须独立处理的项开始============ @property @@ -83,13 +83,12 @@ class SessionOptions(object): """返回默认下载路径属性信息""" return self._download_path - def set_paths(self, download_path=None): + def set_download_path(self, path=None): """设置默认下载路径 - :param download_path: 下载路径 + :param path: 下载路径 :return: 返回当前对象 """ - if download_path is not None: - self._download_path = str(download_path) + self._download_path = str(path) return self @property @@ -418,6 +417,17 @@ class SessionOptions(object): self._max_redirects = session.max_redirects return self + # --------------即将废弃--------------- + + def set_paths(self, download_path=None): + """设置默认下载路径 + :param download_path: 下载路径 + :return: 返回当前对象 + """ + if download_path is not None: + self._download_path = str(download_path) + return self + def session_options_to_dict(options): """把session配置对象转换为字典 diff --git a/DrissionPage/_configs/session_options.pyi b/DrissionPage/_configs/session_options.pyi index 9caf336..ed3acf8 100644 --- a/DrissionPage/_configs/session_options.pyi +++ b/DrissionPage/_configs/session_options.pyi @@ -34,7 +34,7 @@ class SessionOptions(object): @property def download_path(self) -> str: ... - def set_paths(self, download_path: Union[str, Path]) -> SessionOptions: ... + def set_download_path(self, path: Union[str, Path]) -> SessionOptions: ... @property def timeout(self) -> float: ... diff --git a/DrissionPage/_pages/chromium_base.py b/DrissionPage/_pages/chromium_base.py index 34b6ac9..58bf6ab 100644 --- a/DrissionPage/_pages/chromium_base.py +++ b/DrissionPage/_pages/chromium_base.py @@ -5,7 +5,6 @@ """ from json import loads, JSONDecodeError from os.path import sep -from pathlib import Path from re import findall from threading import Thread from time import perf_counter, sleep @@ -55,22 +54,20 @@ class ChromiumBase(BasePage): self._scroll = None self._upload_list = None self._doc_got = False # 用于在LoadEventFired和FrameStoppedLoading间标记是否已获取doc - - self._download_path = str(Path('.').absolute()) + self._download_path = None if isinstance(address, int) or (isinstance(address, str) and address.isdigit()): address = f'127.0.0.1:{address}' - self._d_set_start_options(address, None) + self._d_set_start_options(address) self._d_set_runtime_settings() self._connect_browser(tab_id) if timeout is not None: self.timeout = timeout - def _d_set_start_options(self, address, none): + def _d_set_start_options(self, address): """设置浏览器启动属性 :param address: 'ip:port' - :param none: 用于后代继承 :return: None """ self.address = address.replace('localhost', '127.0.0.1').lstrip('http://').lstrip('https://') diff --git a/DrissionPage/_pages/chromium_base.pyi b/DrissionPage/_pages/chromium_base.pyi index 772d54b..df43bbd 100644 --- a/DrissionPage/_pages/chromium_base.pyi +++ b/DrissionPage/_pages/chromium_base.pyi @@ -83,7 +83,7 @@ class ChromiumBase(BasePage): def _wait_to_stop(self): ... - def _d_set_start_options(self, address, none) -> None: ... + def _d_set_start_options(self, address) -> None: ... def _d_set_runtime_settings(self) -> None: ... diff --git a/DrissionPage/_pages/chromium_page.py b/DrissionPage/_pages/chromium_page.py index 6a8b60c..54e2be6 100644 --- a/DrissionPage/_pages/chromium_page.py +++ b/DrissionPage/_pages/chromium_page.py @@ -87,11 +87,11 @@ class ChromiumPage(ChromiumBase): if self._driver_options.timeouts['implicit'] is not None: self._timeout = self._driver_options.timeouts['implicit'] self._load_mode = self._driver_options.load_mode - self._download_path = str(Path(self._driver_options.download_path).absolute()) + self._download_path = None if self._driver_options.download_path is None \ + else str(Path(self._driver_options.download_path).absolute()) def _page_init(self): """浏览器相关设置""" - self._rect = None self._browser.connect_to_page() # ----------挂件---------- diff --git a/DrissionPage/_pages/session_page.py b/DrissionPage/_pages/session_page.py index bd595d0..b39637c 100644 --- a/DrissionPage/_pages/session_page.py +++ b/DrissionPage/_pages/session_page.py @@ -3,6 +3,7 @@ @Author : g1879 @Contact : g1879@qq.com """ +from pathlib import Path from re import search from time import sleep from urllib.parse import urlparse @@ -51,7 +52,8 @@ class SessionPage(BasePage): def _s_set_runtime_settings(self): """设置运行时用到的属性""" self._timeout = self._session_options.timeout - self._download_path = self._session_options.download_path + self._download_path = None if self._session_options.download_path is None \ + else str(Path(self._session_options.download_path).absolute()) def _create_session(self): """创建内建Session对象""" @@ -277,7 +279,7 @@ class SessionPage(BasePage): elif mode == 'post': r = self.session.post(url, data=data, **kwargs) - if r: + if r and r.content: return set_charset(r), 'Success' except Exception as e: diff --git a/DrissionPage/_units/download_manager.py b/DrissionPage/_units/download_manager.py index 6a6a9c4..a81df80 100644 --- a/DrissionPage/_units/download_manager.py +++ b/DrissionPage/_units/download_manager.py @@ -27,10 +27,17 @@ class DownloadManager(object): self._tab_missions = {} # {tab_id: DownloadMission} self._flags = {} # {tab_id: [bool, DownloadMission]} - self._browser.driver.set_callback('Browser.downloadProgress', self._onDownloadProgress) - self._browser.driver.set_callback('Browser.downloadWillBegin', self._onDownloadWillBegin) - self._browser.run_cdp('Browser.setDownloadBehavior', downloadPath=self._page.download_path, - behavior='allowAndName', eventsEnabled=True) + if self._page.download_path: + self._browser.driver.set_callback('Browser.downloadProgress', self._onDownloadProgress) + self._browser.driver.set_callback('Browser.downloadWillBegin', self._onDownloadWillBegin) + r = self._browser.run_cdp('Browser.setDownloadBehavior', downloadPath=self._page.download_path, + behavior='allowAndName', eventsEnabled=True) + if 'error' in r: + print('浏览器版本太低无法使用下载管理功能。') + self._running = True + + else: + self._running = False @property def missions(self): @@ -40,13 +47,18 @@ class DownloadManager(object): def set_path(self, tab_id, path): """设置某个tab的下载路径 :param tab_id: tab id - :param path: 下载路径 + :param path: 下载路径(绝对路径str) :return: None """ - TabDownloadSettings(tab_id).path = str(Path(path).absolute()) - if tab_id == self._page.tab_id: - self._browser.run_cdp('Browser.setDownloadBehavior', downloadPath=str(Path(path).absolute()), - behavior='allowAndName', eventsEnabled=True) + TabDownloadSettings(tab_id).path = path + if tab_id == self._page.tab_id or not self._running: + self._browser.driver.set_callback('Browser.downloadProgress', self._onDownloadProgress) + self._browser.driver.set_callback('Browser.downloadWillBegin', self._onDownloadWillBegin) + r = self._browser.run_cdp('Browser.setDownloadBehavior', downloadPath=path, + behavior='allowAndName', eventsEnabled=True) + if 'error' in r: + print('浏览器版本太低无法使用下载管理功能。') + self._running = True def set_rename(self, tab_id, rename=None, suffix=None): """设置某个tab的重命名文件名 diff --git a/DrissionPage/_units/download_manager.pyi b/DrissionPage/_units/download_manager.pyi index 466270b..1617d56 100644 --- a/DrissionPage/_units/download_manager.pyi +++ b/DrissionPage/_units/download_manager.pyi @@ -1,4 +1,8 @@ -from pathlib import Path +# -*- coding:utf-8 -*- +""" +@Author : g1879 +@Contact : g1879@qq.com +""" from typing import Dict, Optional, Union, Literal from .._base.browser import Browser @@ -11,13 +15,14 @@ class DownloadManager(object): _missions: Dict[str, DownloadMission] = ... _tab_missions: dict = ... _flags: dict = ... + _running: bool = ... def __init__(self, browser: Browser): ... @property def missions(self) -> Dict[str, DownloadMission]: ... - def set_path(self, tab_id: str, path: Union[Path, str]) -> None: ... + def set_path(self, tab_id: str, path: str) -> None: ... def set_rename(self, tab_id: str, rename: str = None, suffix: str = None) -> None: ... diff --git a/DrissionPage/_units/setter.py b/DrissionPage/_units/setter.py index af58a07..644492c 100644 --- a/DrissionPage/_units/setter.py +++ b/DrissionPage/_units/setter.py @@ -139,7 +139,8 @@ class TabSetter(ChromiumBaseSetter): :param path: 下载路径 :return: None """ - self._page._download_path = str(Path(path).absolute()) + path = str(Path(path).absolute()) + self._page._download_path = path self._page.browser._dl_mgr.set_path(self._page.tab_id, path) if self._page._DownloadKit: self._page._DownloadKit.set.goal_path(path) @@ -209,7 +210,8 @@ class SessionPageSetter(object): :param path: 下载路径 :return: None """ - self._page._download_path = str(Path(path).absolute()) + path = str(Path(path).absolute()) + self._page._download_path = path if self._page._DownloadKit: self._page._DownloadKit.set.goal_path(path)