前言:本人之前并没有接触过python爬虫,但是现在因为要做个试验,需要下载海量人脸图片,所以需要用到python爬虫这个办法。但是过程中遇到到了很多问题,程序调了很久都不成功,终于调通了,所以就记录一下,万一以后还能用到呢(顺便一提,程序不是我写的,是我的师兄写的,我只是调了很久还没调通,最后依然是师兄调通的,感觉自己有点不要脸,嘻嘻)
正文:我们这个链接中有的是需要通过*才能访问的,所以遇到了一些问题,下面这个链接描述了我们的下载任务:下载任务
我们的程序如下:
import urllib.request
import os
paths = r'F:/vgg_face_dataset/files'
paths_1 = paths[0:19]
files = os.listdir(paths) #——指定所有目录下所有的文件和目录名。每个人的链接
headers = {'User-Agent': 'Mozilla/5.0'}
for i in files:
# print(i)
name = i[:-4]#每个文件名除去后面四个符号
path_name = paths_1+'/'+name#每个人下载的图片将要寸的文件,以自己的名字命名
dec = os.path.exists(path_name) #判断文件是否存在
add_path = 'F:/vgg_face_dataset/file'+'/'+name
dec1 = os.path.exists(add_path)
if not dec:
os.mkdir(path_name)#如果没有该文件,就要创建
# return False
if not dec1:
os.mkdir(add_path)
f = open(add_path + "/" + i, 'w')
j=1
with open(paths+"/"+i ,'r') as p:
lines = p.readlines()#一个人所有照片的链接
for line in lines:
path = line.split(' ')[1]#第一个链接
# path = str(path)
# save_path = path_name
path_n = path_name+'/'+str(j)+'.jpg'#图片以数字增加的顺序命名
j = j + 1
det = os.path.exists(path_n)
if not det:
req = urllib.request.Request(path, headers=headers)#可以将url先构造成一个Request对象,传进urlopen
print("output1",req)
try:
f = urllib.request.urlopen(req)
print("output2",f)
except urllib.error.HTTPError as e:
# print(e.code)
# if e.code==404:
#break
with open(add_path+"/"+i,'a') as f:
f.write(line)
except ConnectionResetError as e:
with open(add_path+"/"+i,'a') as f:
f.write(line)
except urllib.error.URLError as e:
with open(add_path+"/"+i,'a') as f:
f.write(line)
else:
det = os.path.exists(path_n)
if not det:
with open(path_n, 'wb') as code:
code.write(f.read())
print('第 '+str(j)+' 张图片下载成功!')
f.close()
# f.close()
# print(a)
# f = urllib.request.urlopen(req)
上面的是我们的程序,因为存在一些无法访问的链接,所以我们试图去跳过它,刚开始在出现错误链接时,我们是这么写的:
try:
f = urllib.request.urlopen(req)
#html=f.read.decode("utf8")
print(f)
except urllib.error.HTTPError as e:
if e.code=='404':
#break
continue
else:
det = os.path.exists(path_n)
if not det:
with open(path_n, 'wb') as code:
code.write(f.read())
f.close()
但是还是调不通,该过程之后,是这么写的:
try:
f = urllib.request.urlopen(req)
print("output2",f)
except urllib.error.HTTPError as e:
# print(e.code)
# if e.code==404:
#break
with open(add_path+"/"+i,'a') as f:
f.write(line)
except ConnectionResetError as e:
with open(add_path+"/"+i,'a') as f:
f.write(line)
except urllib.error.URLError as e:
with open(add_path+"/"+i,'a') as f:
f.write(line)
else:
det = os.path.exists(path_n)
if not det:
with open(path_n, 'wb') as code:
code.write(f.read())
print('第 '+str(j)+' 张图片下载成功!')
f.close()
然后调通了,做法是对于无法访问的链接我们把它存在了文件中,比较两者,感觉就是跳过无济于事,非要做一些处理,我也有些不懂,对于三种错误做处理就可以了。
下面有几个链接,是关于这个程序所需要了解的知识:
解决:ConnectionResetError 的一个博客
python爬虫之urlError异常处理
python os
python urllib.request
好的,就这样,关于链接大家可以在下载任务中下载。
大家可以在python中逐条运行,这样可以便于大家理解程序,我注释了一部分,其余的大家可以自己运行。
如有错误,欢迎指出。