使用selenium python下载图像
我想从浏览器中获取验证码图像。我已经得到了这张图片的url,但是这张图片每次更新都会改变(url是恒定的) 是否有从浏览器获取图片的解决方案(如“将图片另存为”按钮) 另一方面,我认为这应该是一项工作:使用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
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)