前言:
若是读者学过爬虫工具Selenium,对pyautogui必能快速上手,只需要不断实践复习即可熟练掌握。若是没学过当然没关系,我会以初学者的角度尽可能详细地向你解读新手遇到的许多问题。
请注意:在本文章中,我会import pyautogui as auto
在本内容中,我会使用最为常用的属性、方法,若是有其他的功能想要实现,请询问GPT或文心一言,在AI那里会得到详细的回答,我只是作为一个初学者把某些晦涩难懂的概念以一个更为通俗易懂的角度说明白。
若是认为本文章有可以改进的地方,希望能够给我留个言,我希望借此机会提升我的编写能力,将来我也会通过发布文章的方式来进行学习,非常感谢!
提醒事项
由于涉及到鼠标的控制,用户可能会因为程序设计错误对鼠标拾取控制,造成程序失控甚至无法使用鼠标结束程序,最后可能需要使用下列方式结束程序:
1、Windows: Ctrl + Alt + Del MacOS: Command + Shift + Option + Q
2、在设计程序的时候,每次启用pyautogui的方法之后设定暂停3秒再继续下一步
pyautogui.PAUSE = 3
3、直接按下Ctrl + C ,让程序产生KeyboardInterrupt异常从而终止(建议使用)
预备知识:屏幕坐标
对鼠标而言,屏幕坐标的原点在屏幕左上角(0,0),即平面直角坐标系的第四象限。根据自己屏幕的像素不同,右下角对应的x和y的值也不同
import pyautogui as auto
width, height = auto.size()
print(width, height)
通过以上代码,可以获得屏幕的像素规格。
鼠标的相关操作
import pyautogui as auto
import time
# 获得当前的x和y坐标
xaxis, yaxis = auto.position()
print(f"你最初的鼠标位置是:{xaxis},{yaxis}")
# 以绝对位置移动鼠标到指定位置 duration:持续时间
auto.moveTo(x=10, y=0, duration=0.5)
auto.moveTo(900, 600, 1)
auto.moveTo(900, 0, 0.5)
auto.moveTo(0, 600, 1)
# 以相对位置移动鼠标 moveRel中的Rel代表的是relative:相对的
auto.moveRel(xOffset=300, yOffset=0, duration=0.5)
auto.moveRel(600,200,0.5)
# 鼠标点击操作,参数为1、x坐标 2、y坐标 3、所选按键 4、移动到目标坐标所用时间
# 5、点击次数 6、鼠标点击之间的间隔
auto.click(x=2900, y=1950, button="left", duration=0.5, clicks=2, interval=1)
auto.moveTo(2100,1950,duration=0.2)
#
auto.mouseDown(button='left') # 使用mousedown来实现鼠标按住操作
time.sleep(1) # 保持鼠标左键按住不动1秒
auto.mouseUp() # 松开鼠标,此处我把鼠标放在图标上,却没有打开菜单,不知道为什么
time.sleep(5) # 给我个时间打开系统自带的画图软件以便展示拖拽
auto.moveTo(1000,1000)
auto.dragTo(1500,1500) # 按住鼠标左键拖拽到目标坐标
time.sleep(5) # 在5秒内自行打开浏览器查看效果
auto.scroll(-200) # 执行这一条之后我用浏览器测试却只向下滚动了接近450像素点
以上代码的坐标是基于我电脑的坐标,我的电脑的分辨率是3200*2000 ,请读者根据自身电脑设置坐标
注意事项:
1、在执行一条会让鼠标移动到屏幕的四个顶点的时候,程序会自动终止。这是为了防止程序出现错误从而导致用户无法关闭程序而设置的安全防护,所以请不要碰到屏幕的四个顶点。若一定要碰,请百度查询解决方案。
2、不建议使用moveRel这类相对移动方法,因为我们可以自行用微信截图来获取屏幕上任何一个位置的具体坐标。
3、通过一个click() 方法我们可以实现鼠标双击或多击的操作,也可以实现右键、中键的操作
通过调整button = '?' 来实现 可选left middle right 默认是left
4、mouseDown() 方法可以配合time.sleep(n)来实现长按几秒
5、moveTo() 方法会自动将鼠标抬起然后移动到其他的位置,所以不可以用mouseDown和moveTo两个方法来实现拖拽的功能,只能依靠dragTo。
6、滚动功能scroll中的参数为正时表示鼠标滚轮向上滚动,为负即为向下滚动。但是目前我不清楚这个参数代表什么,设置为2000在我这里只能滚动差不多450像素点的内容。
键盘的相关操作
import pyautogui as auto
import time
# 获得当前的x和y坐标
xaxis, yaxis = auto.position()
print(f"你最初的鼠标位置是:{xaxis},{yaxis}")
print(("请在5秒内打开记事本以让程序模拟键盘输入"))
time.sleep(5)
# 传入一段文字,设置每0.1秒传入一个字符
auto.typewrite(message='hello', interval=0.1)
# 传入列表、元组也可以,因为传入是按照一个一个字符进行的
auto.typewrite(['w','o','r','l','d'], 0.1)
auto.keyDown('h') # 按下h键不动
# 虽然按住h键保持1秒,但是也只能输出一个字符,因为此方法只能用来模拟键盘操作,不能用来传入字符串
time.sleep(1)
auto.keyUp('h') # 按下了h键,使用结束自然要放开按键
# 表达特殊按键
auto.typewrite(['M','n','g','left','left','i'],0.1)
auto.keyDown('shift')
auto.press('8') # 按下8键后松开
auto.keyUp('shift')
注意事项:
1、typewrite() 用来输入文本 keyDown()和keyUp() 都只是用来操作按键,不能用来输入文本 press()用来点按一次按键
2、键盘中有一些键如del键,若要按下del键,则要写为auto.keyDown("delete")才可以,按一下左方向键要用auto.keyDown("left")才可以,每一个此类特殊键位都有相对应的表达方式。
热键(快捷键)
import pyautogui as auto
# hotkey:热键 按照顺序按下所有按键,从右往左释放按键,两次按键之间间隔0.1秒
auto.hotkey('ctrl','shift','right',interval=0.1)
auto.keyDown('ctrl')
auto.keyDown('shift')
auto.keyDown('right')
auto.keyUp('ctrl')
auto.keyUp('shift')
auto.keyUp('right')
不知道为什么我的这两种方式调用我网易云的全局快捷键都无效,若有人知道且愿意告诉我,我感激不尽!