1. cookies和headrs问题
使用selenium获得的cookies测试没有问题,但是获得的heards头不可以使用,经过测试比较 需要添加或者修改几项重点的heards为
{'Cipher-Text':'1704885072633_1704970047346_SlMkwPX0ZnotTaSrpOEx50xhLlPT5iMH867nxTtYuapcdPhsh2d2ooVE2F+RSm+yhIFdYwl9hYefGsuc5F9ml4mT712T3ihceocXBBzUWrwBKjSeIwOfzX1Y0nWI4lKgOeBjDz0cTMGYzs4aqGWUtTV6US8dNyW2jonhj5L/Ju+fmDbGgb7TUMGTQCZULOMktSNYXJxKaVMFCTX2XbSz0Hpmk00NwTeaKhdJSq4nbAxsitU+34sQXhNxZLkmGWVmW1Lb+uDK9MV0SX7o4bD/J0t2kGrQCP0ynKXTdfKyd/KUTXgJSlMNAXS5wyHbLTht81IJbp8/bUNLCgb+dJfxIOrbUCzgWuVRlPk4UWPDECfYXfLyqvtmB5b97AjOuYTo','Referer':'https://index.baidu.com/v2/main/index.html','Sec-Fetch-Dest':'empty','Sec-Fetch-Mode':'cors','Sec-Fetch-Site':'same-origin'}
获得新的heards后直接用代码
headers['Sec-Fetch-Mode']= en_heard['Sec-Fetch-Mode']
headers['Sec-Fetch-Site']= en_heard['Sec-Fetch-Site']
headers['Sec-Fetch-Dest']= en_heard['Sec-Fetch-Dest']
headers['Sec-Fetch-Dest']= en_heard['Sec-Fetch-Dest']
headers.update({'Referer':en_heard['Referer'],'Cipher-Text':en_heard['Cipher-Text']})
2 . 设置等待元素
设置等待时间为10秒,直到元素出现
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, “myElement”))
)
等待直到元素可点击
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, “button.myButton”))
)
4,百度指数的cookies获取
就用selenium登录后调用方法获取就行
driver.get_cookies()
然后切分cookies使得可以直接使用
cookies ={cookie['name']: cookie['value']for cookie in driver.get_cookies()}
标题5,登录百度的heards获取,
这个部分正常的selenium是获得不了的,需要用到另一个库:seleniumwire
通过这个库的方法可以获得浏览器的heards,再添加一些关键词,就可以实现获得可用的heards
for request in driver.requests:print('请求headers:')print(request.headers)
headers = request.headers
headers =dict(headers)break
这样就得到了可以直接使用的headrs
标题6,驱动获得,为什么要特意说这个呢,因为谷歌浏览器自动更新的坏习惯,所为我自己找了一个114版本的没有更新组件的浏览器,是一个绿色版的,并没有安装到系统中,所以要配置路径和驱动的路径
defget_driver():
chrome_path ="./114.0.5735.199_chrome_installer/Chrome-bin/chrome.exe"# 无更新组件版本的谷歌浏览器# 指定驱动路径
driver_path ="./chromedriver114.exe"# 设置Chrome选项
chrome_options = Options()
chrome_options.binary_location = chrome_path
# chrome_options.add_argument("--headless") # 添加无界面功能参数# 设置Chrome驱动服务
service = Service(driver_path)# 启动带有自定义选项和服务的Chrome浏览器
driver = webdriver.Chrome(service=service, options=chrome_options)return driver
同时有个重要的功能就是上面的
# chrome_options.add_argument("--headless") # 添加无界面功能参数
无界面也就是常说的无头模式的浏览器,这样的浏览器不会显示界面,比较适用于不需要和页面互动的任务或者想提升效率的任务
标题7,有些元素不好点到的问题,
在selenium中,很多报错是因为元素点击不了,有很多原因,有可能是被挡住了,有可能是有一部分被挡住了,有可能是还没有加载出来,有一个解决百分之80的办法就是使用js,没必要使用selenium自带的移动模拟鼠标和点击,直接使用js,点击元素最为方便
element = driver.find_element(By.XPATH,"//p[@id='TANGRAM__PSP_4__footerQrcodeBtn']")
driver.execute_script("arguments[0].click();", element)
通用还有好处是,js点击不会报错,常用的场景是,有一个广告,并不是每次都会出现,如果你要是点击他但是没有还会报错,用js就可以解决这个问题,js执行之后不论成功不成功,并不会报错,比较安全
js还有个常用的功能是滚动到目标元素的位置,通过这个方法可以解决那些因为元素不在界面所以无法点击的问题,常见的情况是:在一个界面中有多选框,点开之后有一部分在下面再遮挡
怎么让电脑发出蜂鸣警报声
import winsound
duration =500# millisecond持续时间
freq =500# Hz频率# winsound.Beep(freq, duration)for i inrange(5):
duration =100# millisecond持续时间
freq =500# Hz频率
winsound.Beep(freq, duration)
如果selenium等待元素最好的解决办法
selenium有时候有的元素不确定什么时候才会加载好,个人觉得好使的方法有两种,一种是等待这个元素直到他可以被点击为止:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 设置等待时间直到一个元素可以被点击
element = WebDriverWait(driver,10).until(
EC.element_to_be_clickable((By.ID,'myElement')))
第二种是,等待这个元素直到这个元素加载完成:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 设置等待时间直到页面加载完毕
element = WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.ID,'myElement')))
注意,要导入的库WebDriverWait和EC
怎么在FLask中,在两个路由和方法中保证一个开启的selenium驱动不被关闭,即使是在跳转当中
需要为创建驱动这个方法创建一个工具类:
from selenium import webdriver
classWebDriverManager:
_driver =None@classmethoddefget_driver(cls):ifnot cls._driver:
cls._driver = webdriver.Chrome()# 这里可以根据需要选择合适的浏览器return cls._driver
@classmethoddefclose_driver(cls):if cls._driver:
cls._driver.quit()
cls._driver =None
这两个方法在工具类中可以做到创建驱动和关闭驱动,在主flask文件导入这个模块的WebDriverManager之后调用get或close方法就可以使用同一个驱动了,亲测可用
导入模块
from driverget import WebDriverManager
#在需要创建驱动的地方这样创建
driver = WebDriverManager.get_driver()
selenium使用代理ip
目前使用的代理ip,接码平台,指纹浏览器,价格
配置指纹浏览器
使用selenium接管指纹浏览器
selenium窗口居中
测试端口工具
selenium急切模式
DrissionPage真的好用
可以更方便的定位元素,更加人性化的设计
DrissionPage使用none模式然后再想要的节点出现后立即停止加载
Drisspage接管已经启动的浏览器
page断开tab后重新连接
尝试多进程实现
添加多个模式,包括 本地浏览器启动
map方法中怎么给函数同时穿迭代的对象和不变的对象
方法1
# 不变的参数
constant_value ="Constant"# 可迭代参数
iterable1 =[1,2,3]
iterable2 =['a','b','c']# 使用 map 调用函数
result =map(my_function,[constant_value]*len(iterable1), iterable1, iterable2)
可以给不边的对象用列表然后长度和迭代的对齐来解决,即:[不变的变量]*len(变的对象的长度)
一直更新
批量动态变量名
1
for i inrange(1,6):globals()[f"fu{i}"]= i
# 验证创建的变量print(fu1)# 输出:1print(fu2)# 输出:2print(fu3)# 输出:3print(fu4)# 输出:4print(fu5)# 输出:5
2
# 创建一个空字典以存储动态变量
dynamic_variables ={}# 使用拼接的方法创建变量for i inrange(1,6):
dynamic_variables[f"fu{i}"]= i
# 验证创建的变量print(dynamic_variables['fu1'])# 输出:1print(dynamic_variables['fu2'])# 输出:2print(dynamic_variables['fu3'])# 输出:3print(dynamic_variables['fu4'])# 输出:4print(dynamic_variables['fu5'])# 输出:5
3
classDynamicVariables:def__init__(self):pass# 创建类的实例
dynamic_obj = DynamicVariables()# 使用 setattr 方法动态创建属性for i inrange(1,6):setattr(dynamic_obj,f"fu{i}", i)# 验证创建的属性print(dynamic_obj.fu1)# 输出:1print(dynamic_obj.fu2)# 输出:2print(dynamic_obj.fu3)# 输出:3print(dynamic_obj.fu4)# 输出:4print(dynamic_obj.fu5)# 输出:5
数学建模
y轴自动划分精度
自动设置 y 轴的刻度
ax.locator_params(axis='y', nbins=10)
在中间绘制一条虚线,用来整平均值
# 计算平均值
mean_value = df['value'].mean()# 绘制柱状图
ax = df.plot(kind='bar', x='category', y='value', rot=45)# 添加表示平均值的虚线
ax.axhline(y=mean_value, color='r', linestyle='--', linewidth=2)# 绘制红色虚线,线宽为2
设置 y 轴的取值范围和刻度
ax.set_ylim(0,100)# 设置 y 轴的取值范围
ax.set_yticks([0,25,50,75,100])# 设置 y 轴的刻度
存数据库的时候中文乱码
ALTERTABLE your_table_name
CONVERTTOCHARACTERSET utf8mb4 COLLATE utf8mb4_unicode_ci;
版权归原作者 万山y 所有, 如有侵权,请联系我们删除。