python爬虫,报错ValueError: Pool not running

我刚接触python爬虫,所以有些地方不是很懂。
我最近写了一个python爬虫,作用是从一个动漫网站上爬图片。
由于一张一张下载太慢,我用了并发的方法Pool。

p = Pool(10)
for key in dd.keys():
    createDirs(key)//创建目录
    urls = img_url(dd[key])//返回图片地址
    for index,url in enumerate(urls):
        patch = '{}/{}.jpg'.format(key,index)
        if(url in didload)://判断是否已经载过
            print(patch,'下载过了')
        else:
            url = p.apply_async(dowload_img, args=(url,patch))//下载图片
            if url:
                didload.append(url)//将已下载的地址保存
    p.close()
    p.join()

下载图片的代码如下:

def dowload_img(url,name):
    content2 = str()
    driver = webdriver.PhantomJS()
    driver.get(url)
    time.sleep(3)
    pageSource = driver.page_source
    bsobj = BeautifulSoup(pageSource,"html5lib")
    driver.close()
    nameList = bsobj.findAll('img',{'id':re.compile('img(0-9)*')})
    imgurl = nameList[0]['src']
    print(time.strftime( '%Y-%m-%d %X', time.localtime() ),':正在下载',name)
    try:
        content2 = urlopen(imgurl).read()
        print(time.strftime( '%Y-%m-%d %X', time.localtime() ),name,'下载完成')
        # return  (content2)
    except:
        '''记录出错的url'''
        print(time.strftime( '%Y-%m-%d %X', time.localtime() ),name,'下载出错')
        with open('errorurl.txt','w') as ff:
            ff.write(imgurl)
        # return  None
    finally:
        with open(name,'wb') as pp:
            pp.write(content2)
            '''记录已下载url'''
            print('记录',name)
            return (url)

现在遇到两个问题:
1、如果运行代码的时候,刚好碰到已下载的,就不会再下载。一般连续两个目录也就是差不错70张左右不用下载的时候,程序就崩溃了。报ValueError: Pool not running错误。
2、我用KeyboardInterrupt捕捉中断,但是用了Pool以后就不起作用了

    except KeyboardInterrupt:
        print('运行中断ctrl+c')
        with open('didload.txt','w') as ff:
            ff.write(','.join(didload))

可以捕捉到KeyboardInterrupt,但是后面的代码没有运行,程序也不会完全中断。

请高手指点一下,谢谢~~

阅读 6.8k
1 个回答
p.close()
p.join()

不该写在最外层么?为什么写在 for key in dd.keys(): 里面?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题