我正在尝试对网站进行多处理,我在其中获取了我想从中获取信息的所有节点的列表,然后生成一个池,而不是逐个获取数据,而是并行执行。我的代码如下:
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'
我的python终端图片,错误
检查文档,它说列表是可选对象,在主要文件之前声明的函数也是如此,所以我不明白在使用MultiProcessing时我做错了什么。
答案 0 :(得分:1)
从我读过的内容来看,问题是nodes
是一个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)
有了那个我还没有测试过的旁路,我想我可以得到我想要的那些没有问题的可拾取物体