Python Can';尝试多处理时,请不要pickle本地对象
我试图对一个网站进行多处理,在那里我得到一个我想从中获取信息的所有节点的列表,然后生成一个池,这样它就不用一个接一个地获取数据,而是并行地进行。我的代码如下:Python Can';尝试多处理时,请不要pickle本地对象,python,multiprocessing,pickle,Python,Multiprocessing,Pickle,我试图对一个网站进行多处理,在那里我得到一个我想从中获取信息的所有节点的列表,然后生成一个池,这样它就不用一个接一个地获取数据,而是并行地进行。我的代码如下: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import
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'
从selenium导入webdriver
从selenium.webdriver.common.by导入
从selenium.webdriver.support.ui导入WebDriverWait
从selenium.webdriver.support将预期的_条件导入为EC
导入多处理
def响应(节点):
ft=node.find_element_by_css_选择器('.status')。text
如果ft.strip()!='FT':返回
hora=node.find_element_by_css_选择器('.time').text
名称=列表()
对于node.find_元素中的nam(
'.//td[contains(@style,“text align”)]/a[contains(@id,“team”)]:
name=nam.text
如果名称中有“(N)”:
name=name.split(‘(N)’)[0]
name.append(name)
score=node。通过“.red”选择器查找元素
return[hora,name,score.text]
如果名称=“\uuuuu main\uuuuuuuu”:
browser=webdriver.Chrome()
一些代码
节点=浏览器。通过xpath查找元素(
'//tr[contains(@align,“center”)]/以下同级::tr[.//div[contains(@class,“toolimg”)]]
p=多处理。池()
p、 映射(响应,节点)>属性错误:无法pickle本地对象“\u createenviron..encodekey”
带有错误的python终端的图像
查看文档,它说列表是可拾取的对象,在主对象之前声明的函数也是可拾取的对象,所以我不明白在使用多处理时我做错了什么。从我所阅读的内容来看,问题在于
节点
是webdriver对象的列表,这些对象是不可序列化的。考虑到这一点,我唯一可以采用的方法是以下方法
1-不要将整个标记作为节点列表的一个元素来获取,而是只获取使其与其他标记唯一的内容。在我的示例中,每行都有一个序列号标识符
nodes=browser.find_elements_by_xpath(
'//tr[contains(@align,"center")]/following-sibling::tr[.//div[contains(@class,"toolimg")]]/@id').get_attribute()
nodes=['1232489','1242356',......]
2-将其与浏览器一起传递到地图功能
pr=partial(ResPartido,b=browser)
p.map(pr,nodes)
3-在ResPartido函数中,找到具有标识其@id的字符串的唯一行
browser.find_elements_by_xpath('//tr[contains(@id,%s)]' %s node)
有了这个我还没有测试过的旁路,我想我可以在可pickle对象上毫无问题地得到我想要的东西呃,
\u createenviron..encodekey
?我不知道pickle在哪里被调用。你能找到它在哪里吗?我加了一张错误的图片。它在我调用map函数的行中。Variable nodes是一个html节点列表,基本上就是它。@accumulationpickle
get被多处理
使用。它将pickle
任何对象,并在子流程中取消pickle。注意,多处理
本质上是一个线程
接口,位于子进程
之上。共享状态为非共享状态-trivial@puppet我不熟悉selenium
,但很可能,无论节点是什么
对象,它都是不可pickle的。据我所知,它是一个围绕Java程序的Python绑定,因此,所有对象都不可pickle并不奇怪。