2.5.8 优化s模式创建连接的逻辑;ini文件添加运行弹窗参赛

This commit is contained in:
g1879 2022-04-15 15:02:03 +08:00
parent 0786ae6c56
commit 72c143e77d
7 changed files with 259 additions and 255 deletions

View File

@ -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):

View File

@ -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}

View File

@ -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,

View File

@ -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:

View File

@ -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:

View File

@ -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_datapost 方式的数据,这个参数不为`None`时自动转成 post 方式
- show_msg是否显示下载信息和进度
- **kwargs连接参数,与 requests 的一致
- **kwargs连接参数,与 requests 的一致
返回:下载是否成功`bool`)和状态信息(成功时信息为文件路径)的元组,跳过时第一位返回 None
返回:下载是否成功和状态信息的元组。
```python
from DrissionPage import MixPage
@ -77,7 +79,7 @@ urlhttps://www.baidu.com/img/flexible/logo/pc/result.png
- rename重命名文件可不写扩展名不输入则用网络文件原名
- file_exists若存在同名文件可选择`'rename'`,`'overwrite'`,`'skip'`方式处理,若选择重命名,会在文件名后面添加序号
- post_datapost 方式的数据,这个参数不为`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'

View File

@ -1,3 +1,7 @@
# 2.5.8
- 优化 s 模式创建连接的逻辑
# v2.5.7
- 列表元素`select()``deselect()`等方法添加`timeout`参数,可等待列表元素加载