mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
2.5.8 优化s模式创建连接的逻辑;ini文件添加运行弹窗参赛
This commit is contained in:
parent
0786ae6c56
commit
72c143e77d
@ -7,6 +7,7 @@
|
||||
from abc import abstractmethod
|
||||
from re import sub
|
||||
from typing import Union, Tuple, List
|
||||
from urllib.parse import quote
|
||||
|
||||
from lxml.html import HtmlElement
|
||||
from selenium.webdriver.remote.webelement import WebElement
|
||||
@ -330,6 +331,18 @@ class BasePage(BaseParser):
|
||||
"""返回当前访问的url有效性"""
|
||||
return self._url_available
|
||||
|
||||
def _before_connect(self, url: str, retry: int, interval: float) -> tuple:
|
||||
"""连接前的准备 \n
|
||||
:param url: 要访问的url
|
||||
:param retry: 重试次数
|
||||
:param interval: 重试间隔
|
||||
:return: 重试次数和间隔组成的tuple
|
||||
"""
|
||||
self._url = quote(url, safe='/:&?=%;#@+!')
|
||||
retry = retry if retry is not None else self.retry_times
|
||||
interval = interval if interval is not None else self.retry_interval
|
||||
return retry, interval
|
||||
|
||||
# ----------------以下属性或方法由后代实现----------------
|
||||
@property
|
||||
def url(self):
|
||||
|
@ -5,7 +5,7 @@ tmp_path =
|
||||
[chrome_options]
|
||||
debugger_address = 127.0.0.1:9222
|
||||
binary_location =
|
||||
arguments = ['--no-sandbox', '--disable-gpu', '--ignore-certificate-errors', '--disable-infobars']
|
||||
arguments = ['--no-sandbox', '--disable-gpu', '--ignore-certificate-errors', '--disable-infobars', '--disable-popup-blocking']
|
||||
extensions = []
|
||||
experimental_options = {'prefs': {'profile.default_content_settings.popups': 0, 'profile.default_content_setting_values': {'notifications': 2}, 'plugins.plugins_list': [{'enabled': False, 'name': 'Chrome PDF Viewer'}]}, 'useAutomationExtension': False, 'excludeSwitches': ['enable-automation']}
|
||||
timeouts = {'implicit': 10.0, 'pageLoad': 30.0, 'script': 30.0}
|
||||
|
@ -9,7 +9,6 @@ from os import sep
|
||||
from pathlib import Path
|
||||
from time import sleep, perf_counter
|
||||
from typing import Union, List, Any, Tuple
|
||||
from urllib.parse import quote
|
||||
|
||||
from selenium.common.exceptions import NoAlertPresentException
|
||||
from selenium.webdriver.chrome.webdriver import WebDriver
|
||||
@ -75,15 +74,8 @@ class DriverPage(BasePage):
|
||||
:param interval: 重试间隔(秒)
|
||||
:return: 目标url是否可用,返回None表示不确定
|
||||
"""
|
||||
to_url = quote(url, safe='/:&?=%;#@+!')
|
||||
retry = retry if retry is not None else self.retry_times
|
||||
interval = interval if interval is not None else self.retry_interval
|
||||
|
||||
if not url:
|
||||
raise ValueError('没有传入url。')
|
||||
|
||||
self._url = to_url
|
||||
self._url_available = self._try_to_connect(to_url, times=retry, interval=interval, show_errmsg=show_errmsg)
|
||||
retry, interval = self._before_connect(url, retry, interval)
|
||||
self._url_available = self._d_connect(self._url, times=retry, interval=interval, show_errmsg=show_errmsg)
|
||||
|
||||
try:
|
||||
self._driver.execute_script('Object.defineProperty(navigator,"webdriver",{get:() => undefined,});')
|
||||
@ -173,7 +165,7 @@ class DriverPage(BasePage):
|
||||
self._timeout = second
|
||||
self._wait_object = None
|
||||
|
||||
def _try_to_connect(self,
|
||||
def _d_connect(self,
|
||||
to_url: str,
|
||||
times: int = 0,
|
||||
interval: float = 1,
|
||||
|
@ -315,7 +315,7 @@ class MixPage(SessionPage, DriverPage, BasePage):
|
||||
# 使用requests访问url并判断可用性
|
||||
if by_requests:
|
||||
self.cookies_to_session()
|
||||
r = self._make_response(self.url)[0]
|
||||
r = self._make_response(self.url, retry=0)[0]
|
||||
return r.ok if r else False
|
||||
|
||||
def close_driver(self) -> None:
|
||||
|
@ -7,7 +7,7 @@
|
||||
from re import search
|
||||
from time import sleep
|
||||
from typing import Union, List, Tuple
|
||||
from urllib.parse import urlparse, quote
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from requests import Session, Response
|
||||
from requests.structures import CaseInsensitiveDict
|
||||
@ -70,7 +70,7 @@ class SessionPage(BasePage):
|
||||
:param kwargs: 连接参数
|
||||
:return: url是否可用
|
||||
"""
|
||||
return self._connect(url, 'get', None, show_errmsg, retry, interval, **kwargs)
|
||||
return self._s_connect(url, 'get', None, show_errmsg, retry, interval, **kwargs)
|
||||
|
||||
def ele(self,
|
||||
loc_or_ele: Union[Tuple[str, str], str, SessionElement],
|
||||
@ -173,9 +173,9 @@ class SessionPage(BasePage):
|
||||
:param kwargs: 连接参数
|
||||
:return: url是否可用
|
||||
"""
|
||||
return self._connect(url, 'post', data, show_errmsg, retry, interval, **kwargs)
|
||||
return self._s_connect(url, 'post', data, show_errmsg, retry, interval, **kwargs)
|
||||
|
||||
def _connect(self,
|
||||
def _s_connect(self,
|
||||
url: str,
|
||||
mode: str,
|
||||
data: Union[dict, str] = None,
|
||||
@ -193,15 +193,8 @@ class SessionPage(BasePage):
|
||||
:param kwargs: 连接参数
|
||||
:return: url是否可用
|
||||
"""
|
||||
to_url = quote(url, safe='/:&?=%;#@+!')
|
||||
retry = retry if retry is not None else self.retry_times
|
||||
interval = interval if interval is not None else self.retry_interval
|
||||
|
||||
if not url:
|
||||
raise ValueError('没有传入url。')
|
||||
|
||||
self._url = to_url
|
||||
self._response, info = self._make_response(to_url, mode, data, retry, interval, show_errmsg, **kwargs)
|
||||
retry, interval = self._before_connect(url, retry, interval)
|
||||
self._response, info = self._make_response(self._url, mode, data, retry, interval, show_errmsg, **kwargs)
|
||||
|
||||
if self._response is None:
|
||||
self._url_available = False
|
||||
@ -267,7 +260,7 @@ class SessionPage(BasePage):
|
||||
except Exception as e:
|
||||
err = e
|
||||
|
||||
# if r and (r.content != b'' or r.status_code in (403, 404)):
|
||||
# if r and r.status_code in (403, 404):
|
||||
# break
|
||||
|
||||
if i < retry:
|
||||
|
@ -7,11 +7,13 @@ selenium 缺乏对浏览器下载文件的有效管理,难以进行检测下
|
||||
# 功能
|
||||
|
||||
- 支持多线程同时下载多个文件
|
||||
- 自动管理下载列表,只要用`add()`方法添加任务,该工具会自动在多个线程中调度任务,无须等待
|
||||
- 大文件自动分块使用多线程下载
|
||||
- 自动任务调度,简易的任务添加方式
|
||||
- 支持 d 模式下用 requests 下载文件
|
||||
- 可指定下载路径,若路径不存在会自动创建文件夹
|
||||
- 重命名文件,可不填写扩展名,程序自动补充
|
||||
- 存在同名文件时,可选择重命名、覆盖、跳过等处理方式
|
||||
- 自动创建目标路径
|
||||
- 自动去除路径中的非法字符
|
||||
- 下载时支持文件重命名
|
||||
- 自动处理文件名冲突
|
||||
- 显示下载进度
|
||||
- 支持 post 方式
|
||||
- 支持自定义连接参数
|
||||
@ -19,7 +21,7 @@ selenium 缺乏对浏览器下载文件的有效管理,难以进行检测下
|
||||
|
||||
# 单线程下载方式
|
||||
|
||||
`MixPage`对象的`download`属性是一个`DownloadKit`对象,为尽量与旧版兼容,该属性可直接调用。如`page.download(url, path)`
|
||||
`MixPage`对象的`download`属性是一个`DownloadKit`对象,为尽量与旧版兼容,该属性可直接调用。如`page.download(url, save_path)`
|
||||
?> 使用这个方式时效果与旧版一致,下载一个文件时会阻塞程序,因此更加建议用后文讲述的多线程方法。
|
||||
|
||||
参数:
|
||||
@ -30,9 +32,9 @@ selenium 缺乏对浏览器下载文件的有效管理,难以进行检测下
|
||||
- file_exists:若存在同名文件,可选择`'rename'`,`'overwrite'`,`'skip'`方式处理,若选择重命名,会在文件名后面添加序号
|
||||
- post_data:post 方式的数据,这个参数不为`None`时自动转成 post 方式
|
||||
- show_msg:是否显示下载信息和进度
|
||||
- **kwargs;连接参数,与 requests 的一致
|
||||
- **kwargs:连接参数,与 requests 的一致
|
||||
|
||||
返回:下载是否成功(`bool`)和状态信息(成功时信息为文件路径)的元组,跳过时第一位返回 None
|
||||
返回:下载是否成功和状态信息的元组。
|
||||
|
||||
```python
|
||||
from DrissionPage import MixPage
|
||||
@ -77,7 +79,7 @@ url:https://www.baidu.com/img/flexible/logo/pc/result.png
|
||||
- rename:重命名文件,可不写扩展名,不输入则用网络文件原名
|
||||
- file_exists:若存在同名文件,可选择`'rename'`,`'overwrite'`,`'skip'`方式处理,若选择重命名,会在文件名后面添加序号
|
||||
- post_data:post 方式的数据,这个参数不为`None`时自动转成 post 方式
|
||||
- **kwargs;连接参数,与 requests 的一致
|
||||
- **kwargs:连接参数,与 requests 的一致
|
||||
|
||||
返回:任务对象,可通过任务对象查看任务状态和结果
|
||||
|
||||
@ -134,8 +136,6 @@ page.download.show()
|
||||
|
||||
?> **Tips:** <br> `keep`参数为`True`时,即使所有任务都已结束仍会一直打印进度,可以按`enter`结束。
|
||||
|
||||
|
||||
|
||||
## 等待任务结束
|
||||
|
||||
有时须要等待任务结束,以便获取结果,可用`wait()`方法。 当传入任务时,等待该任务结束并返回结果。不传入参数时等待所有任务结束,与`show()`方法一致。
|
||||
@ -199,7 +199,9 @@ running
|
||||
|
||||
```python
|
||||
# 设置线程数,只能在没有任务在运行的时候进行
|
||||
page.download.size = 20
|
||||
page.download.roads = 20
|
||||
|
||||
# 大文件分块大小,默认 20MB
page.downloadd.block_size = '50M'
|
||||
|
||||
# 设置保存路径,设置后每个任务会使用这个路径,也可添加任务时单独设置
|
||||
page.download.goal_path = r'D:\tmp'
|
||||
|
@ -1,3 +1,7 @@
|
||||
# 2.5.8
|
||||
|
||||
- 优化 s 模式创建连接的逻辑
|
||||
|
||||
# v2.5.7
|
||||
|
||||
- 列表元素`select()`、`deselect()`等方法添加`timeout`参数,可等待列表元素加载
|
||||
|
Loading…
x
Reference in New Issue
Block a user