使用selenium实现浏览器中鼠标右键单击保存文件从而实现图片自动下载功能
使用selenium实现浏览器中鼠标右键单击保存文件 我们选择美图网作为学习的网址:美图网
文章图片
文章图片
我们可以通过模拟鼠标的右键单击然后保存图片的操作,将图片自动的保存到本地。
具体代码如下:
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
action = ActionChains(driver).move_to_element(element)#移动到该元素
action.context_click(element)#右键点击该元素
action.send_keys(Keys.ARROW_DOWN)#点击键盘向下箭头
action.send_keys('v')#键盘输入V保存图
action.perform()#执行保存
【使用selenium实现浏览器中鼠标右键单击保存文件从而实现图片自动下载功能】结果这样并没有实现。多方查找后,在这个贴子上找到了原因及解决方法:
然而,并木有用,右键是实现了,但无法按出v以及保存。原因是selenium自带的send_keys是在选中某个元素后,给该元素输入键盘上的按键,无法选中系统的弹窗,所以当右键菜单跳出来以后selenium就无能为力了。原帖
按照博主的建议:
针对该问题,目前主流的方法是安装python模拟键盘的库,例如windows的pypiwin32,linux的virtkey和PyUserInput我又重新更改了代码:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
import re
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import win32api
import win32con
VK_CODE ={'enter':0x0D, 'down_arrow':0x28}
#定义按下键盘事件
def keyDown(keyName):
win32api.keybd_event(VK_CODE[keyName], 0, 0, 0)#定义松开键盘事件
def keyUp(keyName):
win32api.keybd_event(VK_CODE[keyName], 0, win32con.KEYEVENTF_KEYUP, 0)driver = webdriver.Chrome('D:/chromedriver.exe')
driver.get("https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E7%BE%8E%E5%9B%BE%E7%BD%91&step_word=&hs=2&pn=1&spn=0&di=13200&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=113014737%2C3445157660&os=2351244306%2C2367448695&simid=3050896469%2C3730470527&adpicid=0&lpn=0&ln=362&fr=&fmq=1570618921319_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined©right=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fgss0.baidu.com%2F-vo3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fpic%2Fitem%2F0df431adcbef7609968039362cdda3cc7dd99e94.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fooo_z%26e3Bp7xt_z%26e3Bv54_z%26e3BvgAzdH3Fetjof-8nbml9nnclam-8nbml9nnclamdbdd_z%26e3Bip4s&gsm=&rpstart=0&rpnum=0&islist=&querylist=&force=undefined")
image=driver.find_element_by_xpath('//*[@id="currentImg"]')#定位图片所在的元素
action = ActionChains(driver).move_to_element(image)
# ActionChains(driver).context_click(image).perform()
action.context_click(image).perform()#在图片元素上执行右键单击操作
time.sleep(1)#防止图片未加载出来
win32api.keybd_event(86, 0, 0, 0)#调用按下键盘函数,为函数传入参数“86”,也就是“v”
win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)#松开键盘“V”
time.sleep(1)#等待一秒keyDown('enter')#按下“确认”按钮
keyUp('enter')#松开确认按钮
time.sleep(1)#等待一秒
print("图片下载完成")
演示
以上都是程序自动化完成的
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入