人生苦短,我用py
文章目录
- 人生苦短,我用py
- 关于部分网页无法找到元素的问题1
- 方案1
- 方案2
- 关于部分网页无法找到元素的问题2
- 解决方案
- 被网站检查出来我们使用了selenium了怎么办?
- 如何实现前进后退
- 当使用py删除文件时报禁止访问怎么办
- 怎么使用py实现解压文件?
- 怎么打开系统的图片应用向用户展示图片?
- 怎么去下载网络资源?
- 怎么获取当前路径?
- 怎么使用Webderive截图?
- JSON数据的天坑?
- 通用代码分享
- 如何截长图?
关于部分网页无法找到元素的问题1
问题描述
这个问题我想,大概还是基础知识不牢靠的原因
selenium中的寻找元素,只是能寻找到当前页面的一个html中的元素,如果出现嵌套的网页就无法寻找到所嵌套网站中的元素的!!对我说的就是iframe!!!这个自带黑魔法的东西
上图:
出现这种情况是找不到的!
方案1
我们需要先获取iframe中的src也就是嵌套网页的地址,然后再去请求就好了
# 寻找第一层框架入口
s = Driver.find_element(By.ID, "frame_content").get_attribute("src")
# 进入第一层框架入口
Driver.get(s)
方案2
当然我们页可以直接去对iframe执行点击操作,这样更快,更人性化
关于部分网页无法找到元素的问题2
问题描述
这种情况是出现打开新的网页的情况,当我们打开了新的页面时,但是我们WebDriver并不会自动跳转的!他还在原来的页面时,所以我们去寻找新页面中的元素就会找不到了!!
如图所示
解决方案
那怎么样让驱动也去跳转那?
那我们需要获取句柄了(我只会windows平台上的)
注意这是我们获取的时当前驱动的所有句柄,如果有两个页面的话就会有两个句柄的,于是我们取出最后也个句柄,并使用switch_to.window方法使我们的浏览器驱动跳转到我们需要的(及第二个)页面。
# 获取当前句柄,这很重要!!
url = Driver.window_handles
# 跳转到我们需要的网页
Driver.switch_to.window(url[1])
被网站检查出来我们使用了selenium了怎么办?
问题描述
现在自动化工具越来越火了,一些厂商就针对与自动化工具做了限制,如:如果加了无头模式
一些网站的js就会检测出来,使我们的操作失效
解决方法
直接看代码吧,这玩意不好解释
# 创建option对象
options = Options()
# 设置无头模式即浏览器不弹出,只在后台运行
options.add_argument("headless")
# 解决部分网站的对于Selenium的js监测机制,
# 以下2行
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
# 加载浏览器驱动
Webdriver = Service(driverfilename)
# 加载驱动和无头
driver = webdriver.Edge(service=Webdriver, options=options)
# 解决部分网站的对于Selenium的js监测机制,
# 以下1行
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",
{'source': 'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})
如何实现前进后退
前进及不用说了,直接请求即可了,但是怎么去实现后退那?
上代码,这么少?哈哈其实坑多着哩!这个后退只能实现一个,也就是说如果连续写多个back()就会失效的!所以说该用driver.current_url去获取网址时就多用,不要去懒省事的
# 回到上一个页面
Driver.back()
# 获取当前url
driver.current_url
当使用py删除文件时报禁止访问怎么办
不要慌不要慌,这种情况多出现在删除文件夹时这时我们就需要去使用shutil这个模块了,它可以保保证删除文件夹时不出错,但是用它去删除文件时却会出错的,要牢记
import shutil
if os.path.exists(name1):
shutil.rmtree(name1)
if os.path.exists(name):
os.remove(name)
怎么使用py实现解压文件?
我们使用zipfile模块,去实现首先打开文件 使用extratall()就可以实现解压了
import zipfile
# 文件解压
with zipfile.ZipFile(name) as zf:
zf.extractall()
print("解压完成")
注意:解压完成是会自动删除源文件的
怎么打开系统的图片应用向用户展示图片?
注意这里好像只支持win系统
代码
def showimg(path):
userPlatform = platform.system() # 获取操作系统
if userPlatform == 'Windows': # Mac
os.startfile(path)
else:
print("暂且不支持您的操作系统")
效果展示
怎么去下载网络资源?
下载网络资源
dow = requests.get(downloadurl, headers)
open("drive.zip", "wb").write(dow.content)
下载网页
使用的是py自带的标准库,不需要去下载第3方库
urllib.request.urlretrieve("URL路径","保存路径")
怎么获取当前路径?
一句
os.getcwd()
怎么使用Webderive截图?
Driver.save_screenshot(path)
JSON数据的天坑?
当我们去使用xhr,窃取响应时,通常会使用post请求,但是请注意,这里post 请求中的参数
1 必须是双引号
2 就算是数字也必须加上引号
3 没有值的话就加空字符串
4 布尔值必须是小写的true/false
请注意第2条,如果不加引号,js会把它按照int32类型处理但是当创出int32的范围时就会请求失败,这就是为什么int类型的数据也要加引号的 原因
1、传统表单post请求(xhr的请求)
import requests
url = “https://tests”
data = {“key”:“value”}
res = requests.post(url=url,data=data)
print(res.text)
2、json类型的post请求
import requests
url = “https://tests”
data = ‘{“key”:“value”}’
#字符串格式
res = requests.post(url=url,data=data)
print(res.text)
**
最后的一些未解决的问题
我们使用selenium获取到的cooike不全怎么办?
怎么根据快捷方式找到源文件的位置?
恳请大佬们解答**
通用代码分享
import platform
import os
import sys
import zipfile
import shutil
import requests
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
from win32com.client import Dispatch
# 初始化Drvier
def init(driverfilename, isHeadless):
print("开始浏览器初始化\n")
# 创建option对象
options = Options()
if isHeadless:
# 设置无头模式即浏览器不弹出,只在后台运行
options.add_argument("headless")
# 解决部分网站的对于Selenium的js监测机制,
# 以下2行
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
# 加载浏览器驱动
Webdriver = Service(driverfilename)
# 加载驱动和无头
driver = webdriver.Edge(service=Webdriver, options=options)
# 解决部分网站的对于Selenium的js监测机制,
# 以下1行
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",
{'source': 'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})
print("浏览器初始化完成")
return driver
# 获取当前浏览器的版本
def getversion(filename):
parser = Dispatch("Scripting.FileSystemObject")
version = parser.GetFileVersion(filename)
print("当前Edge浏览器版本为:" + version)
return version
# 获取浏览器的源路径
def getEdgePath():
while True:
print("""
请输入您的Edge浏览器的源路径(不是快捷方式的路径)
方法:
1 找到桌面上的Edge浏览器,右击鼠标选择“打开文件位置”
2 进入新打开的文件夹之后找到“msedge.exe”文件右击复制文件路径
3 将刚刚复制的路径,复制过来即可
""")
path1 = input("")
if path1 != "":
return path1
else:
print("请输入Edge浏览器的源路径")
# 打开路径中的文件
def showFile(path):
userPlatform = platform.system() # 获取操作系统
if userPlatform == 'Windows': # Mac
os.startfile(path)
else:
print("暂且不支持您的操作系统")
# 获取是否开启后台模式
def isHeadless():
while True:
isHeadless = input("是(Y)否(N)开启后台模式")
if (isHeadless == "Y" or isHeadless == "N"):
if isHeadless == "Y":
return True
else:
return False
else:
print("请输入正确指令")
# 浏览器驱动下载
def downloadandZip(downloadurl, headers, name):
try:
print("正在下载驱动")
dow = requests.get(downloadurl, headers)
open("drive.zip", "wb").write(dow.content)
print("驱动下载完成,正在解压")
# 文件解压
with zipfile.ZipFile(name) as zf:
zf.extractall()
print("解压完成")
return True
except:
print("浏览器驱动下载失败")
# 程序终止
sys.exit()
# 获取下载的浏览器驱动的路径
# 同时:
# 1 删除无关文件
# 2 检测浏览器驱动是否受损
def startDownloadandZipexc(downloadurl, headers):
name = "drive.zip"
temp1 = "Driver_Notes"
downloadandZip(downloadurl, headers, name)
# 删除无关文件
print("正在删除无关文件")
drivername = "msedgedriver.exe"
if os.path.exists(temp1):
shutil.rmtree(temp1)
if os.path.exists(name):
os.remove(name)
print("无关文件删除成功")
if os.path.exists(drivername):
return os.getcwd() + "\msedgedriver.exe"
else:
while True:
t = input("浏览器驱动受损或被删除,是(Y)否(N)重新下载")
if t == "Y" or t == "N":
if t == "Y":
# 驱动下载
downloadandZip(downloadurl, headers, name)
return os.getcwd() + "\msedgedriver.exe"
else:
print("正在退出")
return False
# 入口
if __name__ == "__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400'}
print("欢迎使用xxx系统\n")
# 获取浏览器的源路径
path1 = getEdgePath()
# 格式化路径
path2 = path1.replace("\\", "//").replace("\"", "")
# 获取浏览器版本
oldversion = getversion(path2)
# 浏览器驱动下载地址
downloadurl = "https://msedgedriver.azureedge.net/" + oldversion + "/edgedriver_win64.zip"
# 获取浏览器驱动的地址
driverfilepath = startDownloadandZipexc(downloadurl, headers)
if driverfilepath != False:
print("浏览器驱动器路径为:" + driverfilepath + "不必要,请勿删除!!!")
# 是否开启无头模式
isHeadless = isHeadless()
# 初始化Driver
Driver = init(driverfilepath, isHeadless)
如何截长图?
效果
不过请注意要实现截长图浏览器必须开启无头模式!!!!
不过请注意要实现截长图浏览器必须开启无头模式!!!!
不过请注意要实现截长图浏览器必须开启无头模式!!!!
driver.get("https://blog.csdn.net/yutu75/article/details/115524985")
# 用js获取页面的宽高,如果有其他需要用js的部分也可以用这个方法
width = driver.execute_script("return document.documentElement.scrollWidth")
height = driver.execute_script("return document.documentElement.scrollHeight")
# 获取页面宽度及其宽度
print(width, height)
# 将浏览器的宽高设置成刚刚获取的宽高
driver.set_window_size(width, height)
time.sleep(1)
# 截图并关掉浏览器
driver.get_screenshot_as_file("xx.png")
driver.quit()