Python Multiprocessing / Pool с Selenium - создание нескольких копий веб-драйвера - PullRequest
0 голосов
/ 28 февраля 2019

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

from multiprocessing import Process, current_process, Pool
from selenium import webdriver
import os
from functools import partial

def pool_function(url, browser):
    name = current_process().name
    print('Process name: %s') % (name)
    print(url)
    print('')
    browser.get(url)



if __name__ == '__main__':

    list_of_urls = ['http://www.linkedin.com', 'http://www.amazon.com', 'http://www.uber.com', 'http://www.facebook.com']
    p = Pool(processes=2)
    browser = webdriver.Chrome()
    test = partial(pool_function, browser)
    results = p.map(test, list_of_urls)

    p.close()
    p.join()

    print('all done')

Это дает мне ошибку, что объект browser не может быть засечен.

Traceback (most recent call last):
  File "/Users/morganallen/Desktop/multi_processing.py", line 43, in <module>
    results = p.map(test, list_of_urls)
  File "/anaconda2/lib/python2.7/multiprocessing/pool.py", line 253, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/anaconda2/lib/python2.7/multiprocessing/pool.py", line 572, in get
    raise self._value
cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

Что будет, если создать экземпляр browser, а затем всплыть версии в отдельных процессах, на которые я могу направлять URL-адреса?

Обновление:

Попытка сделать это с помощью pool.apply_async, но все равно не удается выбрать объект браузера.

def browser():
    browser = webdriver.Chrome()
    return browser

# print('all done')
if __name__ == '__main__':

    list_of_urls = ['http://www.linkedin.com', 'http://www.amazon.com', 'http://www.uber.com', 'http://www.facebook.com']

    p = Pool(processes=2)
    y = browser()
    results = [p.apply_async(cube, args=(url, y)) for url in list_of_urls]
    print(results)
    output = [p.get() for p in results]
...