Multiprocessing, selenium. Не могу закрыть ненужные браузеры после завершения цикла
Не могу закрыть ненужные браузеры после завершения цикла!
os.system("taskkill /pid chromedriver.exe /f") - решает проблему, но, когда цикл идет по второму кругу, он выдает ошибки типа [WinError 10054], [WinError 10061] и просто останавливает процесс.
Как видите, тестил много чего, но того, чего хотел не нашел. Надо, чтобы после окончания цикла заметались все следы и запускались новые процессы.
def main():
while True:
get_item()
get_url_json()
get_url_post()
p = Pool(processes=4)
p.map(multi_work,users_urls)
time.sleep(2)
p.terminate()
p.close()
p.join()
# os.system("taskkill /im chromedriver.exe /f")
# os.system("taskkill /im chrome.exe /f")
# os.system("taskkill /pid chromedriver.exe /f")
# os.system("taskkill /pid chrome.exe /f")
if __name__ == '__main__':
main()
Если есть вариант как лучше поступить, подскажите, возможно я пытаюсь сделать то, что не возможно
def multi_work(url):
driver_head.get(url=url)
id = re.search('/(\d+)-', driver_head.current_url).group(1)
driver_head.get(f"https://example.com/api/v2/users/{id}?localize=false")
Ответы (2 шт):
Если вы хотите закрывать браузер после каждой итерации, то это автоматически означает, что в начале итерации вам нужно его открывать, т.е. заново драйвер создавать. Вы, судя по всему, это делаете один раз, до цикла. Потому код и падает, если добавить закрытие.
Правильно будет открыват браузер в начале multi_work и закрывать в конце:
from selenium import webdriver
def multi_work(url):
with webdriver.Chrome() as driver:
driver.get(url=url)
id = re.search('/(\d+)-', driver.current_url).group(1)
...
На месте webdriver.Chrome можете сделать нужную вам инициализацию, как/если вы сейчас это делаете до цикла.
Первая функция. Создал отдельный драйвер в функции
def get_item():
hhd = webdriver.Chrome(
executable_path=r"C:\Users\...\chromedriver.exe",
seleniumwire_options=proxy_options,
chrome_options=chrome_options)
with hhd as d_head:
Вторая Функция. Создал отдельный драйвер в функции
def multi_work(url):
ddh = webdriver.Chrome(
executable_path=r"C:\Users\...\chromedriver.exe",
seleniumwire_options=proxy_options,
chrome_options=chrome_options)
with ddh as driver_h:
Мейн. Просто подставил киллер процессов(taskkill) между первой и последующими функциями. Таким образом где-то между процессами завершаются процессы chrome и chromedriver, при этом цикл всей функции def main(): не обрывается.
def main():
while True:
get_item()
time.sleep(1)
os.system("taskkill /im chromedriver.exe /f")
time.sleep(1)
os.system('taskkill /im chrome.exe /f')
time.sleep(1)
get_url_json()
get_url_post()
p = Pool(processes=4)
p.map(multi_work, users_urls)
time.sleep(100)