使用selenium python下载图像

使用selenium python下载图像,python,firefox,selenium,selenium-webdriver,Python,Firefox,Selenium,Selenium Webdriver,我想从浏览器中获取验证码图像。我已经得到了这张图片的url,但是这张图片每次更新都会改变(url是恒定的) 是否有从浏览器获取图片的解决方案(如“将图片另存为”按钮) 另一方面,我认为这应该是一项工作: 获取浏览器的屏幕截图 获取图片的位置 使用opencv从截图中裁剪验证码 动态capcha的链接- 通过屏幕截图解决了问题: browser.save_screenshot('screenshot.png') img = browser.find_element_by_xpath('//*[@i

我想从浏览器中获取验证码图像。我已经得到了这张图片的url,但是这张图片每次更新都会改变(url是恒定的)

是否有从浏览器获取图片的解决方案(如“将图片另存为”按钮)

另一方面,我认为这应该是一项工作:

  • 获取浏览器的屏幕截图
  • 获取图片的位置
  • 使用opencv从截图中裁剪验证码
  • 动态capcha的链接-

    通过屏幕截图解决了问题:

    browser.save_screenshot('screenshot.png')
    img = browser.find_element_by_xpath('//*[@id="cryptogram"]')
    loc = img.location
    
    image = cv.LoadImage('screenshot.png', True)
    out = cv.CreateImage((150,60), image.depth, 3)
    cv.SetImageROI(image, (loc['x'],loc['y'],150,60))
    cv.Resize(image, out)
    cv.SaveImage('out.jpg', out)
    
    谢谢

    这里有一个完整的例子(使用谷歌的recaptcha作为目标):

    更新:

    动态生成的图像的问题在于,每次请求时都会生成一个新图像。在这种情况下,您有几个选项:

    • 截图

      from selenium import webdriver
      
      driver = webdriver.Firefox()
      driver.get('https://moscowsg.megafon.ru/ps/scc/php/cryptographp.php?PHPSESSID=mfc540jkbeme81qjvh5t0v0bnjdr7oc6&ref=114&w=150')
      
      driver.save_screenshot("screenshot.png")
      
      driver.close()
      
    • 模拟右键单击+另存为。有关更多信息,请参阅


    希望对您有所帮助。

    保存整个页面的屏幕截图,然后从中剪切图像是可以的,但您也可以使用“webdriver”中的“find”方法找到要保存的图像,并编写“screenshot\u as\u png”属性,如下所示:

    from selenium import webdriver
    driver = webdriver.Firefox()
    driver.get('https://www.webpagetest.org/')
    with open('filename.png', 'wb') as file:
        file.write(driver.find_element_by_xpath('/html/body/div[1]/div[5]/div[2]/table[1]/tbody/tr/td[1]/a/div').screenshot_as_png)
    

    有时它可能会因为滚动而出错,但根据您的需要,这是获取图像的一个好方法。

    因此,为了保持相关性,这里有一个2020年解决方案,使用
    seleniumwire
    ,这是一个允许您访问在浏览器中发出的请求的包。您可以按如下方式轻松使用它:

    从seleniumwire导入webdriver
    #有时候,当使用seleniumwire时,selenium会随机崩溃,这些选项修复了这一问题。
    #可能与它如何代理一切有关。
    options.add_参数('--ignore certificate errors')
    options.add_参数('--ignoressl errors')
    driver=webdriver.Chrome(Chrome\u options=options)
    驱动程序。获取(“https://google.com")
    对于driver.requests中的请求:
    #请求路径
    #请求方法
    #request.headers
    #request.response是响应实例
    #request.response.body是以字节为单位的原始响应正文
    #如果您使用它处理大量请求,请确保清除它们:
    del driver.requests
    

    现在,你为什么需要这个?举个例子,对于ReCaptcha旁路,或者对于类似Incapsula的旁路。使用此选项的风险自负。

    使用
    保存屏幕截图的问题在于,我们无法以原始质量保存图像,也无法恢复图像中的alpha通道。因此,我提出另一个解决办法。下面是一个使用@codam\u hsmits建议的
    selenium wire
    库的完整示例。可以通过
    ChromeDriver
    下载图像

    我定义了以下函数来解析每个请求,并在必要时将请求主体保存到文件中

    从seleniumwire导入webdriver#从seleniumwire导入
    从urllib.parse导入urlparse
    导入操作系统
    从mimetypes导入guess\u扩展
    导入时间
    导入日期时间
    def下载资源(请求、,
    asset_dir=“temp”,
    默认值\u fname=“未命名”,
    跳过_域=[“facebook”、“谷歌”、“雅虎”、“agkn”、“2mdn”],
    exts=[“.png”、“.jpeg”、“.jpg”、“.svg”、“.gif”、“.pdf”、“.bmp”、“.webp”、“.ico”],
    附加(ext=False):
    资产清单={}
    对于req_idx,枚举中的请求(请求):
    #request.headers
    #request.response.body是以字节为单位的原始响应正文
    如果request为None或request.response为None或request.response.headers为None或request.response.headers中没有“内容类型”:
    持续
    ext=guess_扩展名(request.response.headers['Content-Type'].split(';')[0].strip())
    如果ext为None或ext==“”或ext不在exts中:
    #不知道文件扩展名,或者不在白名单中
    持续
    parsed_url=urlparse(request.url)
    跳过=错误
    对于跳过域中的d:
    如果在解析的_url.netloc中进行了d:
    跳过=真
    打破
    如果跳过:
    持续
    frelpath=parsed_url.path.strip()
    如果frelpath==“”:
    timestamp=str(datetime.datetime.now().replace(微秒=0.isoformat())
    frelpath=f“{default_fname}{req_idx}{timestamp}{ext}”
    elif frelpath.endswith(\\”)或frelpath.endswith(“/”):
    timestamp=str(datetime.datetime.now().replace(微秒=0.isoformat())
    frelpath=frelpath+f“{default_fname}{req_idx}{timestamp}{ext}”
    elif append_ext而不是frelpath.endswith(ext):
    frelpath=frelpath+f“{default_fname}{ext}”#缺少文件扩展名,但可能不是问题
    如果frelpath.startswith(“\\”)或frelpath.startswith(“/”):
    frelpath=frelpath[1:]
    fpath=os.path.join(asset\u dir,parsed\u url.netloc,frelpath)
    如果os.path.isfile(fpath):
    持续
    os.makedirs(os.path.dirname(fpath),exist\u ok=True)
    打印(f“下载{request.url}到{fpath}”)
    资产列表[fpath]=request.url
    尝试:
    打开(fpath,“wb”)作为文件:
    file.write(request.response.body)
    除:
    打印(f“无法将{request.url}下载到{fpath}”)
    归还资产清单
    
    让我们从谷歌主页下载一些图片到
    temp
    文件夹

    #创建Chrome/Firefox驱动程序的新实例
    driver=webdriver.Chrome()
    #转到谷歌主页
    司机,上车https://www.google.com')
    #将内容下载到临时文件夹
    资产目录=“临时”
    尽管如此:
    #请浏览互联网,它将每秒收集图像
    时间。睡眠(1)
    下载资源(driver.requests,asset\u dir=asset\u dir)
    驱动程序关闭()
    
    请注意,它无法决定哪些图像可以在页面上看到,而不是隐藏在背景中,因此用户应主动单击按钮或lin
    from selenium import webdriver
    driver = webdriver.Firefox()
    driver.get('https://www.webpagetest.org/')
    with open('filename.png', 'wb') as file:
        file.write(driver.find_element_by_xpath('/html/body/div[1]/div[5]/div[2]/table[1]/tbody/tr/td[1]/a/div').screenshot_as_png)
    
    from bs4 import BeautifulSoup
    from selenium import webdriver
     
    import os
    from urllib.parse import urlparse
     
    url = 'https://image.rakuten.co.jp/azu-kobe/cabinet/hair1/hb-30-pp1.jpg'
     
    filename = os.path.basename(urlparse(url).path)
    filename_png = os.path.splitext(filename)[0] + '.png'  # change file extension to .png
     
    opts = webdriver.ChromeOptions()
    opts.headless = True
    driver = webdriver.Chrome(options=opts)
     
    driver.get(url)
     
    # Get the width and height of the image
    soup = BeautifulSoup(driver.page_source, 'lxml')
    width = soup.find('img')['width']
    height = soup.find('img')['height']
     
    driver.set_window_size(width, height) # driver.set_window_size(int(width), int(height))
    driver.save_screenshot(filename_png)