Итак, у меня есть проблема, которую я не могу понять, я новичок 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?