Использование concurrent.futures в Python с селеном зависает непосредственно перед выходом на Windows - PullRequest
0 голосов
/ 27 апреля 2020

Итак, у меня есть проблема, которую я не могу понять, я новичок ie в программировании и даже больше в параллелизме. У меня есть этот код, который открывает несколько веб-драйверов селена (без головы chrome или хром), чтобы выполнить поиск в изображениях Google и захватывать только ссылки на изображения. Я использовал многопроцессорность, потому что это было проще для меня, но теперь я пробую с потоками, и это быстрее, чем ожидалось для задач, связанных с вводом / выводом. Однако, когда я запускаю этот код на своем компьютере Windows (современный, быстрый, с тоннами памяти), он зависает примерно на 5 секунд перед выходом, если я не использую os._exit(0). Он зависает после печати всех результатов, записи всех файлов и выполнения всего, что мне нужно, я пытался запустить веб-драйверы без опции «без головы», чтобы увидеть, что что-то занимает слишком много времени, чтобы закрыть, но нет. И что меня больше озадачивает, так это мой raspberry pi4 с raspbian, запускающий скрипт без каких-либо зависаний и без использования os._exit(0)

Это мой полный код: (не совместим с pep8 или чем-то еще, но я над этим поработаю позже)


from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import re
import csv
import concurrent.futures
import sys
import itertools
import os

def get_new_search_terms(file_name):
    """gets the new items to search"""
    try:
        fh = open(file_name, "r")
    except:
        print("File {} not found, execute again with the correct source file".format(file_name))
        exit()
    lines = csv.reader(fh)
    newsearch = []
    for row in lines:
        newsearch.append(row[0])
    fh.close
    return newsearch

def write_csv(list):
    csv_f = open("withlinks.csv", "w", newline="")
    writer = csv.writer(csv_f)
    writer.writerows(list)
    csv_f.close


def get_links(search_string,extra_keyword):
    """get the links using selenium"""
    chrome_options = Options()  
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--log-level=3")
    chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])

    # replace the spaces with +
    modified_search_string = search_string.replace(' ', '+')  

    # Assigning the browser variable with chromedriver of Chrome. 
    # options is to go headless and no-verbose
    browser = webdriver.Chrome("D:/imageTest/chromedriver.exe", options=chrome_options)
    url = "https://www.google.com/search?tbm=isch&q="+extra_keyword+"+"+modified_search_string+"&tbs=isz%3Al"
    retries = 0
    output = [url]
    while True:
        try:
            browser.get(url)
            print("Fetching: {}".format(search_string))
            source = browser.page_source
            browser.close()
            links = re.findall(r'\[\"(http.?://.*\.[JjPp][PpNn][Ee]?[Gg])', source)
            if len(links) > 10:
                limit = 10
            else:
                limit = len(links)

            for i in range(limit):
                output.append(links[i])
            return [search_string] + output
            #write_csv(search_string, output)
            #break
        except:
            print("retrying")
            retries += 1
            if retries > 3:
                break
            continue


if __name__ == '__main__':
    #extra_keyword = ""
    if len(sys.argv) > 1:
        file_name = sys.argv[1]
        extra_keyword = sys.argv[2]
    else:
        file_name = input("Enter the source file name: ")
        extra_keyword = input("Enter the extra keyword if any: ")
    search_terms = get_new_search_terms(file_name)
    final_output = []


    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        futures = {executor.submit(get_links, term, extra_keyword): term for term in search_terms}
        for future in concurrent.futures.as_completed(futures):
            final_output.append(future.result())


    print(final_output)
    #write_csv(final_output)
    #os._exit(0)

Это проблема с моим кодом? какая-то проблема Windows?

...