python爬虫(Python读取TXT文件中的URL并下载文件)

时间:2021-04-25 09:59:30

前言:本人之前并没有接触过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中逐条运行,这样可以便于大家理解程序,我注释了一部分,其余的大家可以自己运行。
如有错误,欢迎指出。