当前位置: 首页 > news >正文

一个专做里番的网站网站推广是什么岗位

一个专做里番的网站,网站推广是什么岗位,学网站开发的总结,小程序平台下载文章目录 示例一:常见装饰器编写重试机制示例二:使用类实现装饰器示例三:使用函数装饰器并返回闭包示例四:使用 wrapt 模块 示例一:常见装饰器编写重试机制 示例代码 import time import traceback import logging from typing import Call…

文章目录

  • 示例一:常见装饰器编写重试机制
  • 示例二:使用类实现装饰器
  • 示例三:使用函数装饰器并返回闭包
  • 示例四:使用 `wrapt` 模块

示例一:常见装饰器编写重试机制

示例代码

import time
import traceback
import logging
from typing import Callable
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, WebDriverException, TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 设置日志配置
logging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)# 假设 DOME 是一个配置字典,用于控制 DEBUG 模式
DOME = {'DEBUG': False,'debug': False
}def exr_func(*args, **kwargs):# 在每次重试前执行的操作,可以在此添加刷新页面等逻辑driver = kwargs.get('driver')if driver:driver.refresh()time.sleep(2)  # 等待页面刷新完成def dec_retry(num=1, exr: Callable = lambda *_, **__: None, catch=Exception, exclude=Exception, out_error=True):"""装饰器,重复执行func并忽略异常,超过次数抛出异常或返回空,此函数默认输出异常信息"""def decorator(func):def dec(*args, **kwargs):for i in range(1, num + 1):try:return func(*args, **kwargs)except exclude as err:raise errexcept catch as err:logger.error(f'第 {i} 次执行失败')if out_error:logger.error(err, traceback.format_exc(), sep='\n')if DOME.get('DEBUG') or DOME.get('debug'):logger.error('已开启 DEBUG 模式,直接抛出异常')raise errif i >= num:logger.error(f'已执行 {num} 次,抛出异常')raise errlogger.error('开始重试')exr(*args, **kwargs)return decreturn decorator@dec_retry(num=3, exr=exr_func, catch=(NoSuchElementException, WebDriverException, TimeoutException))
def login(driver, username, password):# 访问登录页面driver.get("https://example.com/login")# 等待页面加载完成WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username")))# 输入用户名username_field = driver.find_element(By.ID, "username")username_field.send_keys(username)# 输入密码password_field = driver.find_element(By.ID, "password")password_field.send_keys(password)# 点击登录按钮login_button = driver.find_element(By.ID, "loginButton")login_button.click()# 等待页面加载完成并检查是否登录成功WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "logoutButton")))print("登录成功")return Truedef main():# 设置WebDriverdriver = webdriver.Chrome()username = "your_username"password = "your_password"try:login(driver, username, password, driver=driver)except Exception as e:logger.error(f"最终登录失败,异常: {e}")driver.quit()if __name__ == "__main__":main()

代码解释

  1. 日志配置: 设置日志记录配置,用于输出错误信息。
  2. exr_func 函数: 定义了在每次重试前执行的操作,例如刷新页面。
  3. dec_retry 装饰器: 实现了重试机制,捕获指定异常,在重试次数用尽前会执行 exr_func 函数。
  4. login 函数: 实现具体的登录操作,并被 dec_retry 装饰器装饰。
  5. main 函数: 设置 WebDriver,尝试登录,并在失败时输出日志信息。

示例二:使用类实现装饰器

类装饰器可以更灵活地管理状态,并且可以更好地组织复杂的逻辑。

import time
import traceback
import logging
from typing import Callable
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, WebDriverException, TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 设置日志配置
logging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)# 假设 DOME 是一个配置字典,用于控制 DEBUG 模式
DOME = {'DEBUG': False,'debug': False
}def exr_func(*args, **kwargs):driver = kwargs.get('driver')if driver:driver.refresh()time.sleep(2)  # 等待页面刷新完成class RetryDecorator:def __init__(self, num=1, exr: Callable = lambda *_, **__: None, catch=Exception, exclude=Exception, out_error=True):self.num = numself.exr = exrself.catch = catchself.exclude = excludeself.out_error = out_errordef __call__(self, func):def wrapped_func(*args, **kwargs):for i in range(1, self.num + 1):try:return func(*args, **kwargs)except self.exclude as err:raise errexcept self.catch as err:logger.error(f'第 {i} 次执行失败')if self.out_error:logger.error(err, traceback.format_exc(), sep='\n')if DOME.get('DEBUG') or DOME.get('debug'):logger.error('已开启 DEBUG 模式,直接抛出异常')raise errif i >= self.num:logger.error(f'已执行 {self.num} 次,抛出异常')raise errlogger.error('开始重试')self.exr(*args, **kwargs)return wrapped_func@RetryDecorator(num=3, exr=exr_func, catch=(NoSuchElementException, WebDriverException, TimeoutException))
def login(driver, username, password):driver.get("https://example.com/login")WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username")))username_field = driver.find_element(By.ID, "username")username_field.send_keys(username)password_field = driver.find_element(By.ID, "password")password_field.send_keys(password)login_button = driver.find_element(By.ID, "loginButton")login_button.click()WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "logoutButton")))print("登录成功")return Truedef main():driver = webdriver.Chrome()username = "your_username"password = "your_password"try:login(driver, username, password, driver=driver)except Exception as e:logger.error(f"最终登录失败,异常: {e}")driver.quit()if __name__ == "__main__":main()

示例三:使用函数装饰器并返回闭包

使用闭包使代码更简洁。

import time
import traceback
import logging
from typing import Callable
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, WebDriverException, TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EClogging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)DOME = {'DEBUG': False,'debug': False
}def exr_func(*args, **kwargs):driver = kwargs.get('driver')if driver:driver.refresh()time.sleep(2)def dec_retry(num=1, exr: Callable = lambda *_, **__: None, catch=Exception, exclude=Exception, out_error=True):def decorator(func):def wrapped_func(*args, **kwargs):for i in range(1, num + 1):try:return func(*args, **kwargs)except exclude as err:raise errexcept catch as err:logger.error(f'第 {i} 次执行失败')if out_error:logger.error(err, traceback.format_exc(), sep='\n')if DOME.get('DEBUG') or DOME.get('debug'):logger.error('已开启 DEBUG 模式,直接抛出异常')raise errif i >= num:logger.error(f'已执行 {num} 次,抛出异常')raise errlogger.error('开始重试')exr(*args, **kwargs)return wrapped_funcreturn decorator@dec_retry(num=3, exr=exr_func, catch=(NoSuchElementException, WebDriverException, TimeoutException))
def login(driver, username, password):driver.get("https://example.com/login")WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username")))username_field = driver.find_element(By.ID, "username")username_field.send_keys(username)password_field = driver.find_element(By.ID, "password")password_field.send_keys(password)login_button = driver.find_element(By.ID, "loginButton")login_button.click()WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "logoutButton")))print("登录成功")return Truedef main():driver = webdriver.Chrome()username = "your_username"password = "your_password"try:login(driver, username, password, driver=driver)except Exception as e:logger.error(f"最终登录失败,异常: {e}")driver.quit()if __name__ == "__main__":main()

示例四:使用 wrapt 模块

wrapt 是一个强大的装饰器库,可以更轻松地编写装饰器,特别是处理复杂逻辑时。

import time
import traceback
import logging
import wrapt
from typing import Callable
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, WebDriverException, TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EClogging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)DOME = {'DEBUG': False,'debug': False
}def exr_func(*args, **kwargs):driver = kwargs.get('driver')if driver:driver.refresh()time.sleep(2)def dec_retry(num=1, exr: Callable = lambda *_, **__: None, catch=Exception, exclude=Exception, out_error=True):@wrapt.decoratordef wrapper(wrapped, instance, args, kwargs):for i in range(1, num + 1):try:return wrapped(*args, **kwargs)except exclude as err:raise errexcept catch as err:logger.error(f'第 {i} 次执行失败')if out_error:logger.error(err, traceback.format_exc(), sep='\n')if DOME.get('DEBUG') or DOME.get('debug'):logger.error('已开启 DEBUG 模式,直接抛出异常')raise errif i >= num:logger.error(f'已执行 {num} 次,抛出异常')raise errlogger.error('开始重试')exr(*args, **kwargs)return wrapper@dec_retry(num=3, exr=exr_func, catch=(NoSuchElementException, WebDriverException, TimeoutException))
def login(driver, username, password):driver.get("https://example.com/login")WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "username")))username_field = driver.find_element(By.ID, "username")username_field.send_keys(username)password_field = driver.find_element(By.ID, "password")password_field.send_keys(password)login_button = driver.find_element(By.ID, "loginButton")login_button.click()WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "logoutButton")))print("登录成功")return Truedef main():driver = webdriver.Chrome()username = "your_username"password = "your_password"try:login(driver, username, password, driver=driver)except Exception as e:logger.error(f"最终登录失败,异常: {e}")driver.quit()if __name__ == "__main__":main()
http://www.yayakq.cn/news/265952/

相关文章:

  • 外卖网站建设的策划书网站收录少的原因
  • 集团网站建设 中企动力郑州平台类网站
  • 什么类型的网站容易做广州网站设计开发招聘
  • 花都网站建设策划徐州网站建设优化
  • 阳春网站开发公司网站建设需求表
  • 丰台石家庄网站建设wordpress 后台 修改
  • 网站如何做seo推广云搜索app官网
  • 文交所网站开发cgi--网站开发技术的雏形
  • 自己的网站首页背景怎么做大神自己做的下载音乐的网站
  • 商城网站怎么做优化团队建设 深度好文分享的网站
  • 大恒建设集团有限公司网站做面膜的网站
  • 有做网站动态效果软件做网站分销违法吗
  • 徐州做网站软件wordpress内核源码分析
  • 浙江省建设厅官方网站信用平台pageadmin自助建站
  • 做网站技术方法有福州做网站的公司电话
  • 王璞网站开发实战软文推广什么意思
  • 网站优化 秦皇岛wordpress 禁用版本
  • 河北网站建设费用抖音代运营报价明细表清单
  • 网站推广的优势电子商务与网站建设课程
  • 泉州握旗公司网站建设昆明pc网站建设
  • 武宁县建设工程招标公告门户网站免费做公众号的网站
  • 静态手机网站基础如何制作橡皮泥 简单
  • 深圳网站设计公司在哪里网站建设有什么工作
  • 企业网站优化关键词实时网站推广的最终目的是
  • 上海有制作网站的电话吗西部数码域名注册查询
  • 口碑好的邯郸网站建设厦门市建设工程交易中心网站
  • 广州做网站专业公司建造师二级报名入口
  • 望城警务督察网站建设快速建站费用
  • 造作网站模版黄骅贴吧海鲜城
  • 网站源码建设模板移动互联网应用软件开发