многопроцессорность - процесс Pool зависает при соединении - PullRequest
0 голосов
/ 25 сентября 2019

Я пишу скребок для быстрой загрузки картинок из 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()

...