Tengo un script que scrapea de la web una tabla de datos, de manera que cada nodo representa una fila, y dentro del tag se encuentra información que quiero obtener. El código en secuencia lineal funciona bien, pero he decidido intentar a ejecutarlo de manera asíncrona con multiprocessing. Este es el código
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import multiprocessing def ResPartido(node): ft=node.find_element_by_css_selector('.status').text if ft.strip()!='FT': return hora=node.find_element_by_css_selector('.time').text names=list() for nam in node.find_elements_by_xpath( './/td[contains(@style,"text-align")]/a[contains(@id,"team")]'): name=nam.text if '(N)' in name: name=name.split('(N)')[0] names.append(name) score=node.find_element_by_css_selector('.red') return [hora,name,score.text] if __name__ == "__main__": browser=webdriver.Chrome() SOME CODE nodes=browser.find_elements_by_xpath( '//tr[contains(@align,"center")]/following-sibling::tr[.//div[contains(@class,"toolimg")]]') p = multiprocessing.Pool() p.map(ResPartido,nodes) <---Here is the error ....... >>AttributeError: Can't pickle local object '_createenviron.<locals>.encodekey'
Como veis, nodes es una lista de todos los tr a scrapear. Si no lo he entendido mal, multiprocessing genera un pool con los node dentro de nodes, y los pasa de manera simultánea a la función ResPartido para que se ejecute su código.
Se supone que las listas si son objetos pickleables, no obstante, me da error en p.map(ResPartido,nodes)
Adjunto captura con el error completo por si fuera de ayuda