2017-11-13 3 views
0

Ich versuche ein Multiprocessing-Scrape einer Website zu machen, wo ich eine Liste aller Knoten bekomme, von denen ich Informationen bekommen möchte, und dann einen Pool erzeuge, statt zu bekommen Daten eins nach dem anderen tut es parallel. Mein Code ist der folgende:Kann lokales Objekt nicht putzen, während Multiprocessing versucht wird

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' 

Bild meiner Python-Terminal mit dem Fehler

Überprüfung der Dokumentation, heißt es Listen sind auswählbare Objekte, und so sind Funktionen vor dem Haupt einer deklarierten , also verstehe ich nicht, was ich falsch mache, wenn ich MultiProcessing verwende.

+0

Uh, was ist '_createenviron. .codekey'? –

+0

Ich sehe nicht, wo Pickle aufgerufen wird. Kannst du herausfinden, wo das ist? – Acccumulation

+0

Ich habe ein Bild des Fehlers hinzugefügt. Es ist in der Zeile, wo ich die Kartenfunktion anrufe. Variable Knoten ist eine Liste von HTML-Knoten, und das ist es ziemlich viel. – puppet

Antwort

0

Von dem, was ich gelesen habe, ist das Problem, dass nodes eine Liste von Webdriver-Objekten ist, die nicht serialisierbar sind. Angesichts dessen ist der einzige mögliche Ansatz, mit dem ich kommen kann, der folgende.

1- Anstatt das ganze Tag als ein Element der Knotenliste zu bekommen, erhält man nur das, was es von dem anderen einzigartig macht. In meinem Beispiel hat jede Zeile eine Seriennummer Kennung

nodes=browser.find_elements_by_xpath(
    '//tr[contains(@align,"center")]/following-sibling::tr[.//div[contains(@class,"toolimg")]]/@id').get_attribute() 

nodes=['1232489','1242356',......] 

2- Pass es, zusammen mit dem Browser auf die Kartenfunktion

pr=partial(ResPartido,b=browser) 
p.map(pr,nodes) 

3- In der ResPartido Funktion, die einzigartige Reihe mit der finden String, der seine @id

browser.find_elements_by_xpath('//tr[contains(@id,%s)]' %s node) 

mit dieser Bypass identifiziert, die ich noch nicht getestet haben, ich glaube, ich könnte bekommen, was ich ohne Probleme bestimmt mit pickleable Objekten

Verwandte Themen