爬虫卡死问题 带图片保存的urlretrieve 和urlopen
之前做个小爬虫爬点文字混合图片的东西,数据量小还可以处理,数据一大自己假死,也没有错误提示,搞得自己有点烦,在这总结一下:
原保存图片子函数
########使用当前执行时间来命名图片,lujing为图片存储位置,findgeshi为 正则表达式从网址中提取图片格式,用try和except来处理异常,返回 图片名称:########
def save_pictureurl(url,t0,lujing):
try:
urllib.request.urlopen(url,timeout=5)
t1 = time.clock()
timee = t1 - t0#形成时钟的名字
tupiangeshi = re.search(findgeshi, url)#确定格式是png还是gif还是jpg
ID1 = lujing +’\’+ str(timee) + ‘.’ + tupiangeshi.group(0)#串成总ID
ID2 = str(timee) + ‘.’ + tupiangeshi.group(0)
urllib.request.urlretrieve(url, ID2)
return (ID1)
except urllib.request.URLError as e:#网址无法访问的错误返回
print(“error”,e)
return (‘ERROR HTTP’)
except socket.timeout:
print(‘timeouterror’)
return (‘TIMEERROR HTTP’)
except :
return (‘UNKNOWN ERROR’)
“`
错误原因
本来想用openurl先打开网址检查是否能打开网址,然后用urlretrieve保存图片,但是还是会有假死现象,原来如果urlretrieve在执行的时候本来可以打开的网址由于网速原因没有打开所以没有返回,也会导致假死,而且urlretrieve没有timeout设置值所以换成文件指令的读写命令
更改后的保存图片子函数
#####open、file.write 实现读写,urlopen 判断是否超时#######
def save_pictureurl(url,t0,lujing):
try:
aa=urllib.request.urlopen(url,timeout=5).read()
t1 = time.clock()
timee = t1 - t0#形成时钟的名字
tupiangeshi = re.search(findgeshi, url)#确定格式是png还是gif
ID1 = lujing +’\’+ str(timee) + ‘.’ + tupiangeshi.group(0)#串成总ID
# ID2 = str(timee) + ‘.’ + tupiangeshi.group(0)
# urllib.request.urlretrieve(url, ID2)
with open(ID1, ‘wb’) as file:
file.write(aa)
file.close()
return (ID1)
except urllib.request.URLError as e:#网址无法访问的错误返回
print(“error”,e)
return (‘ERROR HTTP’)
except socket.timeout:
print(‘timeouterror’)
return (‘TIMEERROR HTTP’)
except :
return (‘UNKNOWN ERROR’)