2017-11-13 8 views
0

웹 사이트의 다중 처리 스크래핑을하려고합니다. 여기서 정보를 얻고 자하는 모든 노드의 목록을 얻고 대신에 풀을 생성합니다. 데이터를 하나씩 병렬로 처리합니다. 내 코드는 다음과 같다 : 문서를 확인 오류다중 처리를 시도하는 동안 로컬 객체를 pickle 할 수 없음

내 파이썬 터미널의

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' 

이미지,이리스트는 pickable 개체 등 주요 일 이전에 선언 된 기능입니다 말한다 멀티 프로세싱을 사용할 때 내가 뭘 잘못하고 있는지 이해할 수 없습니다.

+0

어,'_createenviron은 무엇입니까? .encodekey'? –

+0

피클이 호출되는 곳을 알 수 없습니다. 그것이 어디 있는지 추적 할 수 있습니까? – Acccumulation

+0

오류 그림을 추가했습니다. 그것은 내가 map 함수라고 부르는 라인에 있습니다. 변수 노드는 html 노드의 목록이며, 꽤 많이 있습니다. – puppet

답변

0

제가 읽은 바로는, nodes은 직렬화 할 수없는 webdriver 개체의 목록입니다. 이 점을 감안할 때 내가 할 수있는 유일한 접근법은 다음과 같습니다.

1- 전체 태그를 노드 목록의 요소로 가져 오는 대신 다른 태그와 고유하게 만드는 점만 얻으십시오. 제 실시 예에서, 각 행과 그 고유 행을 찾아 ResPartido 함수의지도 기능

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

-3- 브라우저와 함께

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

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

2- 패스를, 일련 번호 ID를 가지고 나는 아직 테스트 haven't 그 바이 패스와의 @id

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

를 식별하는 문자열, 난 내가 pickleable 객체

0을 문제없이 의도 한 것을 얻을 수 있다고 생각