我刚接触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,但是后面的代码没有运行,程序也不会完全中断。
请高手指点一下,谢谢~~
不该写在最外层么?为什么写在
for key in dd.keys():
里面?