Ошибка WebDriverException: Message: 'images' executable may have wrong permissions. Please see https://sites.google.com/a/chromium.org/chromedriver/h
У меня есть функция для парсинга изображений по гугл запросу, которые в дальнейшем я хочу использовать для машинного обучения, запрос реализован через Selenium. Когда я вызываю search_and_donwnload() то получаю ошибку "WebDriverException: Message: 'images' executable may have wrong permissions. Please see https://sites.google.com/a/chromium.org/chromedriver/home' Я пробовал установить chromium-chromedriver через !sudo и указать расположение в usr/lib но получал ошибку "WebDriverException: Message: 'chromium-browser' executable may have wrong permissions. Please see https://sites.google.com/a/chromium.org/chromedriver/home" Я работаю в среде Google Colab
Каким образом мне надо переписать функцию или изменить в переменной driver запрос к веб-драйверу гугла. Если в аргументе указать webdriver селениума то выводит такую же ошибку
from __future__ import division
from bs4 import BeautifulSoup
import shutil
import os.path
import selenium
import hashlib
from PIL import Image
import io, os
import requests
import time
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.utils import ChromeType
from webdriver_manager.firefox import GeckoDriverManager
!sudo apt install chromium-chromedriver
driver = webdriver.Chrome(ChromeDriverManager(chrome_type=ChromeType.CHROMIUM).install())
def fetch_image_urls(query:str, max_links_to_fetch:int, wd:driver, sleep_between_interactions:int=1):
def scroll_to_end(wd):
wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(sleep_between_interactions)
# build the google query
search_url = "https://www.google.com/search?safe=off&site=&tbm=isch&source=hp&q={q}&oq={q}&gs_l=img"
# load the page
wd.get(search_url.format(q=query))
image_urls = set()
image_count = 0
results_start = 0
while image_count < max_links_to_fetch:
scroll_to_end(wd)
# get all image thumbnail results
thumbnail_results = wd.find_elements_by_css_selector("img.Q4LuWd")
number_results = len(thumbnail_results)
print(f"Found: {number_results} search results. Extracting links from {results_start}:{number_results}")
for img in thumbnail_results[results_start:number_results]:
# try to click every thumbnail such that we can get the real image behind it
try:
img.click()
time.sleep(sleep_between_interactions)
except Exception:
continue
# extract image urls
actual_images = wd.find_elements_by_css_selector('img.n3VNCb')
for actual_image in actual_images:
if actual_image.get_attribute('src') and 'http' in actual_image.get_attribute('src'):
image_urls.add(actual_image.get_attribute('src'))
image_count = len(image_urls)
if len(image_urls) >= max_links_to_fetch:
print(f"Found: {len(image_urls)} image links, done!")
break
else:
print("Found:", len(image_urls), "image links, looking for more ...")
time.sleep(30)
return
load_more_button = wd.find_element_by_css_selector(".mye4qd")
if load_more_button:
wd.execute_script("document.querySelector('.mye4qd').click();")
# move the result startpoint further down
results_start = len(thumbnail_results)
return image_urls
Эта функция сохраняет изображение в папке и проверяет сохранилось ли оно, в ней я не использую webdriver, но думаю она может быть полезна для понимания кода.
def persist_image(folder_path:str,url:str):
try:
image_content = requests.get(url).content
except Exception as e:
print(f"ERROR - Could not download {url} - {e}")
try:
image_file = io.BytesIO(image_content)
image = Image.open(image_file).convert('RGB')
file_path = os.path.join(folder_path,hashlib.sha1(image_content).hexdigest()[:10] + '.jpg')
with open(file_path, 'wb') as f:
image.save(f, "JPEG", quality=85)
print(f"SUCCESS - saved {url} - as {file_path}")
except Exception as e:
print(f"ERROR - Could not save {url} - {e}")
def search_and_download(search_term:str,driver_path:str,target_path='./images',number_images=5):
target_folder = os.path.join(target_path,'_'.join(search_term.lower().split(' ')))
if not os.path.exists(target_folder):
os.makedirs(target_folder)
with webdriver.Chrome(executable_path=driver_path) as wd:
res = fetch_image_urls(search_term, number_images, wd=wd, sleep_between_interactions=0.5)
for elem in res:
persist_image(target_folder,elem)
search_term = 'Dragon'
search_and_download(search_term = search_term, driver_path="/content/images")
86 raise WebDriverException(
87 "'%s' executable may have wrong permissions. %s" % (
---> 88 os.path.basename(self.path), self.start_error_message)
89 )
90 else:
WebDriverException: Message: 'images' executable may have wrong permissions. Please see https://sites.google.com/a/chromium.org/chromedriver/home