Python & Selenium с мультипроцессором работает не так, как должно быть - PullRequest
0 голосов
/ 29 января 2020

У меня есть проект, в котором я должен тщательно очистить js зависимый веб-сайт. Там вы можете найти таблицу, похожую на структуру, в которой, если вы щелкнете по каждому элементу, он перейдет к выделенному макету, где отображаются данные, которые я могу обработать. Каждый элемент имеет срок службы часов, после которого элемент исчезает. Между тем, данные динамически обновляются. Эта сеть своеобразна, так как в основной таблице вы не можете найти прямую ссылку на каждый элемент (или, по крайней мере, традиционным способом просмотра html, возможно, с помощью обратного инжиниринга), так что единственный путь к go это открытие каталога для каждого элемента, go к таблице и затем щелчок по нужному элементу. Вот мой код

def Behaver(name_of_element):
    status,driver=InitiateDriver()
    if status!='Success':return 'Error'

    Gotomaingrid() #After opening the driver, this brings it to the main table
    Searchelementandclickonit() #Clicks on element and wait for it to be loaded
    while True:
       DoSomeScraping(driver)
       st=Checkifexists(driver) #If the element is no longer active, ends the function
       if st=='End':
           try:driver.quit()
           except:pass
           return


import multiprocessing

status,driver=InitiateDriver()
if status!='Success':return 'Error'

Gotomaingrid() 
table_elements=Scrapemaingrid(driver)
elem_process=dict()
for e in table_elements:
    p=multiprocessing.Process(target=Behaver,args=(e,))
    p.start()

    elem_process[e]=p

for i in list(elem_process.keys()):
    p=elem_process[i]
    p.join()

Более или менее я открываю драйвер и go к таблице. Там я получаю название каждого элемента в таблице. После этого я запускаю мультипроцесс, где каждый процесс принадлежит элементу. Функция открывает драйвер, идет к таблице, ищет элемент, щелкает по нему и ждет, пока драйвер загрузит его, а затем очищает его для изменений в драйвере (так как сеть загружает их динамически). Когда элемент больше не активен, он закрывает драйвер и завершает процесс.

Проблемы

Я установил несколько отпечатков в функции Behaver, чтобы проверить состояние каждого процесса , Я не вижу печати ни в spyder, ни в консоли, которая открывается с каждым процессом. Я запускаю код во второй раз, и он открыл так много драйверов, что компьютер вышел из строя и должен был быть перезапущен

Возможно, я - нуб с многопроцессорностью (хотя у меня есть бот с многопоточностью, и он работает) но я не понимаю, что делается неправильно. Должен ли я порождать процессы медленнее, чтобы P C не обрабатывал sh? Почему там ничего не напечатано? Я попробовал функцию вести себя вне процесса, и она работала отлично, в то время как с многопроцессорностью все проблемы.

Спасибо!

...