为确保自动化脚本(如 Selenium)或浏览器自动控制程序运行稳定,必须保持 Chrome 浏览器版本与 ChromeDriver 版本一致或兼容。
📌 为什么版本要一致?
ChromeDriver 是专门与特定版本的 Chrome 浏览器配套的。如果两者版本不兼容,启动时可能会出现如下错误:
session not created: This version of ChromeDriver only supports Chrome version xx
为确保自动化脚本(如 Selenium)或浏览器自动控制程序运行稳定,必须保持 Chrome 浏览器版本与 ChromeDriver 版本一致或兼容。
ChromeDriver 是专门与特定版本的 Chrome 浏览器配套的。如果两者版本不兼容,启动时可能会出现如下错误:
session not created: This version of ChromeDriver only supports Chrome version xx
本页汇总使用 vQQPx
过程中常见的问题及解决方案,如有其他问题欢迎 关注公众号了解
现象:
执行 vQQPx init
时长时间无响应,或报错退出。
解决方案:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2025-07-02 14:58
# @Author : Jack
# @File : BocExchangeHelper
"""
BocExchangeHelper
"""
import requests
from bs4 import BeautifulSoup
def get_exchange_rate():
"""
获取中国银行的汇率
:return:
"""
response = requests.get("https://www.bankofchina.com/sourcedb/whpj/index.html", headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
})
response.encoding = "utf-8"
if response.status_code != 200:
print(f"请求失败,状态码: {response.status_code}")
return []
soup = BeautifulSoup(response.text, "html.parser")
table = next((t for t in soup.find_all("table") if len(t.find_all("tr")) > 2), [])
rows = table.find_all("tr")
# 遍历每一行
data = []
for row in rows:
cols = row.find_all("td")
if len(cols) > 0:
currencyCHName = cols[0].get_text(strip=True)
if currencyCHName not in ['港币', '美元']:
continue
foreignBuy = cols[1].get_text(strip=True)
cashBuy = cols[2].get_text(strip=True)
foreignSell = cols[3].get_text(strip=True)
cashSell = cols[4].get_text(strip=True)
referenceRate = cols[5].get_text(strip=True)
publishDate = cols[6].get_text(strip=True)
# 货币名称 现汇买入价 现钞买入价 现汇卖出价 现钞卖出价 中行折算价 发布日期 发布时间
data.append([currencyCHName, foreignBuy, cashBuy, foreignSell, cashSell, referenceRate, publishDate])
return data
if __name__ == '__main__':
for o in get_exchange_rate():
print(o)
app.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2025-07-01 11:24
# @Author : Jack
# @File : app
"""
app
"""
from fastapi import FastAPI
app = FastAPI()
def init_app():
"""
初始化app
:return:
"""
pass
def init_scheduler():
"""
初始化定时任务
:return:
"""
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
from schedules import NewsSchedule, ExchangeSchedule, OnlinesimMonitorSchedual
scheduler = BackgroundScheduler()
scheduler.add_job(ExchangeSchedule.task, CronTrigger(hour='8,11,19', minute='20'))
scheduler.add_job(OnlinesimMonitorSchedual.task, 'interval', hours=4)
scheduler.start()
init_app()
init_scheduler()
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8888)
Python的Websockets服务端
NStudyPy~=0.0.17
NStudyPy 工具包 , 一个有用的工具包,可以简化开发流程,详细介绍可以参考 NStudyPy
本教程使用python 3.10.13
作为开发环境 , 原则上适用于python 3.9+
本教程开发环境为windows 10
,原则上其他系统应该也可以 , 但请注意需要安装对应环境的 poppler, 同时需注意配置环境变量
, 环境变量配置请参阅本站其他文档
all()
函数是 Python 内置的一个函数,用于判断一个可迭代对象中的所有元素是否都为True
。如果所有元素都为True
,则返回True
,否则返回False
。当可迭代对象为空时,all()
返回True
。这是因为没有元素违反条件,所以默认返回True
。
all()
函数的语法
any()
函数是 Python 中的一个内置函数,用于判断一个可迭代对象中的任意一个元素是否为True
。如果有任意一个元素为True
,则返回True
,否则返回False
。当可迭代对象为空时,any()
返回False
。
any()
函数的语法any(iterable)
enumerate()
是 Python 的一个内置函数,用于将可迭代对象(如列表、元组或字符串)组合为一个索引序列,通常在 for 循环中用来获取元素的索引和值。下面是enumerate()
的详细用法和示例。
enumerate()
的基本语法是:
enumerate(iterable, start=0)
Python 的
filter()
函数用于过滤可迭代对象中的元素。它接收两个参数:一个函数和一个可迭代对象,并返回一个迭代器,该迭代器只包含函数返回值为True
的元素。以下是filter()
函数的详细用法和示例。
def is_even(n):
return n % 2 == 0
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(is_even, numbers)
print(list(even_numbers)) # Output: [2, 4, 6]
Python的
map()
函数是一个非常有用的工具,可以用来对可迭代对象(如列表、元组等)中的每个元素应用一个指定的函数。以下是map()
函数的各种用法:
map(function, iterable)
会将 function
应用于 iterable
中的每一个元素,并返回一个迭代器。
def square(x):
return x ** 2
numbers = [1, 2, 3, 4, 5]
squared_numbers = map(square, numbers)
print(list(squared_numbers)) # Output: [1, 4, 9, 16, 25]