Я пишу скребок для быстрой загрузки картинок из Google Image.Чтобы эта операция работала достаточно быстро с большим количеством изображений, я использовал пакет Python multiprocessing
.
Каждый член списка URL-адресов передается в функцию загрузки изображения.Все это делается в процессе Pool
с использованием apply_async
.Однако, например, при загрузке 200 изображений, пул зависает навсегда в ~ 197/200, и никогда join
с.
Вот код - проблема в строке.Я попытался написать пример как можно меньше.Функция прокрутки необходима для загрузки> 100 изображений, в противном случае скрипт работает нормально.
from selenium import webdriver
from six.moves import urllib
from multiprocessing import Pool
import tqdm
import time
import json
import sys
import os
# Config
download_img_path = "test/"
req_header = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36"
def write_img_file(img_item):
req = urllib.request.Request(img_item)
req.add_header('User-Agent', req_header)
urllib.request.urlopen(req)
return
def get_images(driver, folder_path, num):
images = driver.find_elements_by_xpath('//div[contains(@class,"rg_meta")]')
img_list = [json.loads(images[i].get_attribute('innerHTML'))["ou"] for i in range(min(len(images), num))]
pbar = tqdm.tqdm(total=len(img_list))
def update(*a):
pbar.update()
pool = Pool()
for i in range(pbar.total):
pool.apply_async(write_img_file, args=(img_list[i], ), callback=update)
pool.close()
pool.join()
del pool
def scroll(driver, num_scrolls):
for _ in range(num_scrolls):
for __ in range(10):
# scrolls to show all 400 images
driver.execute_script("window.scrollBy(0, 1000000)")
time.sleep(0.2)
# click "show more results"
time.sleep(0.5)
try:
driver.find_element_by_xpath(
"//input[@value='Plus de résultats']") .click()
time.sleep(0.5)
except Exception as e:
print(" show more results failed -> exception: " + str(e))
def search(search_txt, num):
if not os.path.exists(download_img_path):
os.makedirs(download_img_path)
url = "https://www.google.co.in/search?q=" + \
search_txt + "&source=lnms&tbm=isch"
driver = webdriver.Chrome(
executable_path=r"/usr/lib/chromium/chromedriver")
driver.get(url)
num_scrolls = int(num / 400 + 1)
scroll(driver, num_scrolls)
get_images(driver, download_img_path, num)
search("hotdog", 200)
print('DONE')
sys.exit()