如何实现更改存储路径并点击保存

from selenium import webdriver

import time

import win32clipboard

import win32api

import win32con

from selenium.webdriver.common.action_chains import ActionChains


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)


VK_CODE={'enter':0x0D,'down_arrow':0x28}


url2='https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&step_word=&hs=0&pn=1&spn=0&di=49500&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=2&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs=1680238894%2C752784316&os=1456076808%2C2964036578&simid=4162351635%2C532680339&adpicid=0&lpn=0&ln=1219&fr=&fmq=1462357247335_R&fm=&ic=0&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=&height=&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201709%2F07%2F20170907142921_VEUnJ.thumb.700_0.jpeg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fn2_z%26e3Bxtvt_z%26e3BgjpAzdH3FtvijAzdH3F14w-mccdmmc_z%26e3Bip4s&gsm=1&rpstart=0&rpnum=0&islist=&querylist=&force=undefined'


browser= webdriver.Chrome(executable_path=r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')

browser.maximize_window()

browser.get(url2)


time.sleep(2)


path='E:\\'

win32clipboard.OpenClipboard()


win32clipboard.EmptyClipboard()


win32clipboard.SetClipboardText(path)


win32clipboard.CloseClipboard()


img=browser.find_element_by_xpath('//*[@id="currentImg"]')


action = ActionChains(browser).move_to_element(img)


action.context_click(img).perform()


time.sleep(1)


win32api.keybd_event(86,0,0,0)


time.sleep(1)


win32api.keybd_event(0x11, 0, 0, 0)

win32api.keybd_event(0x56, 0, 0, 0)

win32api.keybd_event(0x56, 0, win32con.KEYEVENTF_KEYUP, 0)

win32api.keybd_event(0x11, 0, win32con.KEYEVENTF_KEYUP, 0)


win32api.keybd_event(0x0D,0,0,0)


win32api.keybd_event(0x12, 0, 0, 0)

win32api.keybd_event(0x53, 0, 0, 0)

win32api.keybd_event(0x53, 0, win32con.KEYEVENTF_KEYUP, 0)

win32api.keybd_event(0x12, 0, win32con.KEYEVENTF_KEYUP, 0)


keyDown('enter')


keyUp('enter')


time.sleep(1)


print('over')

直接用现成的不想吗...
https://www.jianshu.com/p/ade4c6fc9c55
代码有些错误,改了一下

import requests
import re
import time
import os
import urllib.parse
from lxml import html
import json
page_num=30
photo_dir=r"F:\Documents\Python"    # 设置目录



etree = html.etree
def getDetailImage(word):
    num=0
    url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord={0}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=&hd=&latest=&copyright=&word={0}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn={1}&rn="+str(page_num)+"&gsm=1e&1552975216767="
    while num<50:


        page_url=url.format(urllib.parse.quote(word),num*page_num)
        print(page_url)
        response=requests.get(page_url)
       
        regex = re.compile(r'\\(?![/u"])')
        json_data=json.loads(regex.sub(r"\\\\", response.text))#问题在于编码中是\xa0之类的,当遇到有些 不用转义的\http之类的,则会出现以上错误
        for item in json_data['data']:
            params={
                "word":word,
                "di":item['di'],
                "tn":"baiduimagedetail",
                "cs":item['cs'],
                "os":item['os'],
            }
            detail_url="http://image.baidu.com/search/detail"
            response=requests.get(detail_url,params=params)
            selector = etree.HTML(response.text)
            pic_url=selector.xpath("//img[@id='hdFirstImgObj']/@src")[0]
            print(pic_url)
            name=pic_url.split('/')[-1]
            headers={
                "Referer":page_url,
            }
        
            html=requests.get(pic_url,headers=headers)
            with open(os.path.join(word_dir,name[-8:]),'wb')as f:
                f.write(html.content)
            
        num=num+1
        


if __name__ == "__main__":
    word = input("请输入搜索关键词(可以是人名,地名等): ")
    word_dir=os.path.join(photo_dir,word)
    if not os.path.exists(word_dir):
        os.mkdir(word_dir)
    getDetailImage(word)
你写得太复杂了吧...模拟点击...
你参考一下下面这个问题吧
你不要求换文件夹就可以解决...
https://biwen.csdn.net/question/4761

你好,麻烦你用最简单的方式重写这个程序

这段程序是我写的吧?

我这里测试正常,文件保存在了E盘。改个路径也测试正常

你现在那边还有什么问题?保存的路径不对吗?


确定 没有使用鼠标干扰吧?我这里保存窗口一闪而过。

确定

非得使用右键菜单保存吗?上次的单击自动下载到某一个目录不行吗?

你这个截图是弹出保存窗口 脚本就停止了吗?

@Angel OvO 他的需求是希望使用右键菜单 来实现保存 保存的时候 可以自定义保存路径。。

浴火_凤凰你好,如果有其他方法存储图片也可以

据angel提供的东西跑了一下,出现如下:SyntaxError: unexpected EOF while parsing


不要求右键 只是保存的话 方法就多了

浴火_凤凰你好,麻烦你选一个最简单的 写一下

下面的代码量是最少的 也支持配置保存的目录位置


#导入webdriver
from selenium import webdriver


options = webdriver.ChromeOptions()
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': 'E:\\'}
options.add_experimental_option('prefs', prefs)
browser = webdriver.Chrome(executable_path=r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe',chrome_options=options)

#最大化浏览器窗口
browser.maximize_window()
#打开目标网站
url2='https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&step_word=&hs=0&pn=1&spn=0&di=49500&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=2&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs=1680238894%2C752784316&os=1456076808%2C2964036578&simid=4162351635%2C532680339&adpicid=0&lpn=0&ln=1219&fr=&fmq=1462357247335_R&fm=&ic=0&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=&height=&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201709%2F07%2F20170907142921_VEUnJ.thumb.700_0.jpeg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fn2_z%26e3Bxtvt_z%26e3BgjpAzdH3FtvijAzdH3F14w-mccdmmc_z%26e3Bip4s&gsm=1&rpstart=0&rpnum=0&islist=&querylist=&force=undefined'
browser.get(url2)
browser.find_element_by_css_selector("#toolbar > span.bar-btn.btn-download").click()

'download.default_directory': 'E:\\' #修改这里改保存目录位置

浴火凤凰你好,CSS选择这里括号里的内容的写法你能不能详细注释一下,我是个新手,不懂这个,我要举一反三,应该是修改这里吧,

要是这行用xpath写可以吗

可以 既然你熟悉XPath 就给你一个XPath写法:


browser.find_element_by_xpath('//*[@id="toolbar"]/span[7]').click()

toolar在哪,找半天没找到

网页底部的工具栏就是toolbar

括号里的内容是粘贴进去的还是手动写

看起来比我想象的难

你说说原理吧,实在是蒙了

我的建议是:

使用浏览器自带的功能获取,然后自己再修改

因为获取的有时候 不是很准确。

具体操作看下面的截图

你找一下find_element_by_xpath 是什么函数 不就明白了吗

浴火凤凰 你好,有的网站并没有‘下载‘这个钮,我想应该要换个方式吧

你也没说要脚本 通用。。

等会儿 我再换个方法

我现在说一下:要求脚本通用

#导入webdriver
from selenium import webdriver
import requests


browser = webdriver.Chrome(executable_path=r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')

#最大化浏览器窗口
browser.maximize_window()
#打开目标网站
url2='https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&step_word=&hs=0&pn=1&spn=0&di=49500&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=2&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs=1680238894%2C752784316&os=1456076808%2C2964036578&simid=4162351635%2C532680339&adpicid=0&lpn=0&ln=1219&fr=&fmq=1462357247335_R&fm=&ic=0&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=&height=&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201709%2F07%2F20170907142921_VEUnJ.thumb.700_0.jpeg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fn2_z%26e3Bxtvt_z%26e3BgjpAzdH3FtvijAzdH3F14w-mccdmmc_z%26e3Bip4s&gsm=1&rpstart=0&rpnum=0&islist=&querylist=&force=undefined'
browser.get(url2)
# browser.find_element_by_css_selector("#toolbar > span.bar-btn.btn-download").click()
src=browser.find_element_by_xpath('//*[@id="currentImg"]').get_attribute("src")
name=src.split('/')[-1]
response = requests.get(src)
path1="E:\\"+name
with open(path1, 'wb')as f:
    f.write(response.content)
    print("文件保存成功!")
# browser.quit()

上面 如果想保存什么图片 改 '//*[@id="currentImg"]'这部分内容


下面附上 无需打开浏览器就能保存图片的版本

from bs4 import BeautifulSoup
import requests

url2='https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E9%AB%98%E6%B8%85%E5%8A%A8%E6%BC%AB&step_word=&hs=0&pn=1&spn=0&di=49500&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=2&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs=1680238894%2C752784316&os=1456076808%2C2964036578&simid=4162351635%2C532680339&adpicid=0&lpn=0&ln=1219&fr=&fmq=1462357247335_R&fm=&ic=0&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=&height=&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201709%2F07%2F20170907142921_VEUnJ.thumb.700_0.jpeg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fn2_z%26e3Bxtvt_z%26e3BgjpAzdH3FtvijAzdH3F14w-mccdmmc_z%26e3Bip4s&gsm=1&rpstart=0&rpnum=0&islist=&querylist=&force=undefined'
response = requests.get(url2)
soup=BeautifulSoup(response.text,"html.parser")
src=soup.find(id= "currentImg").attrs["src"]
name=src.split('/')[-1]
response = requests.get(src)
path1="E:\\"+name
with open(path1, 'wb')as f:
    f.write(response.content)
    print("文件保存成功!")

上面 如果想保存什么图片 改 id= "currentImg"这部分内容


13.jpg是什么

哪个网址的 哪个图片 发出来看看


哪个网址的 哪个图片 

我在我这里试试

?还在试验吗?

大哥?还有什么问题?

我给了3套方案 ,不会都有问题吧?

有问题就说,没问题,等着结贴呢。。。

哥们,第一套方案就有问题,我已经说过了,实在不想说第二遍,

第二 第三套 方案呢?

全不行

我也是醉了。。。我给了三个方案 我这全都可以,你那全都不行。

也算是奇迹了。

有时间发这些消息不如想想怎么解决问题

你这个东西不想老想着自己能不能用


我说三个都能用 你说都不能用

最公平的方法就是找个第三方来评判一下吧。。。

咱俩在这扯半天也没用。。