以下是下载SAT竞赛网站样例时的学习过程。最后实现了通过python实现批量样例文件下载。
首先向博客园分享代码的两位博客博主致谢!
QzZq博客网址https://www.cnblogs.com/zhangzhangtabszj/p/14592061.html |
|
1 # -- coding:UTF-8 --<code> 2 import requests 3 import re 4 from io import BytesIO 5 6 file = open("E:/cnf/test.txt") # 打开存放链接的TXT文档 7 num = 0 8 while 1: 9 line = file.readline() # 逐行读链接 10 if not line: 11 break 12 print("正在下载 第 %d cnf...." % num) 13 num += 1 14 image_url = line 15 ima = image_url.replace('\n','') #去除每行的'\n',不然会404 16 try: 17 requests.packages.urllib3.disable_warnings() 18 r = requests.get(ima, verify=False) # 创建响应对象 19 path = re.sub("https://gbd.iti.kit.edu/file/", "E:/cnf/", line) 20 # 通过re模块的搜索和替换功能,生成下载文档的保存地址 21 path = re.sub('\n', '', path + ".cnf.zip") # 删除path末尾的换行符'\n' 22 f = open(path, "wb") 23 f.write(r.content) # 将响应对象的内容写下来 24 f.close() 25 except Exception as e: 26 print('无法下载,%s' % e) 27 continue 28 file.close()
|
|
chenzhen0530的博客网址:https://www.cnblogs.com/chenzhen0530/p/10619668.html |
|
1 #coding=utf-8 2 """ 3 目标:提供一个函数能够从网上下载资源 4 输入: 5 url列表 6 保存路径 7 输出: 8 保存到指定路径中的文件 9 要求: 10 能够实现下载过程,即从0%到100%可视化 11 """ 12 # ===================================================== 13 from six.moves import urllib 14 import os 15 import sys 16 17 18 def download_and_extract(filepath, save_dir): 19 """根据给定的URL地址下载文件 20 21 Parameter: 22 filepath: list 文件的URL路径地址 23 save_dir: str 保存路径 24 Return: 25 None 26 """ 27 for url, index in zip(filepath, range(len(filepath))): 28 filename = url.split('/')[-1] 29 save_path = os.path.join(save_dir, filename) 30 urllib.request.urlretrieve(url, save_path) 31 sys.stdout.write('\r>> Downloading %.1f%%' %
|
|
以下为本人学习并使用的代码
1.下载单个文件
1 import requests 2 url = "https://gbd.iti.kit.edu/file/002a0330958a14deb23dcc84b5489e8a/" 3 r = requests.get(url) 4 with open("uri2022/cnf02.xz","wb") as f: 5 f.write(r.content) 缺点:没有保留原有文件名。 |
|
2. 下载单个文件-可以解决大文件的下载
1 import requests 2 file_url = 'https://gbd.iti.kit.edu/file/002a0330958a14deb23dcc84b5489e8a/' 3 r = requests.get(file_url, stream = True) 4 with open("uri2022/cnf01.xz","wb") as f: 5 for chunk in r.iter_content(chunk_size = 1024**2): 6 if chunk: 7 f.write(chunk)
|
|
3. 使用wget下载单个文件
1 import wget 2 url = 'https://gbd.iti.kit.edu/file/002a0330958a14deb23dcc84b5489e8a/' 3 #filename = wget.download(url) 4 filename = wget.download(url, out="uri2022/")
|
|
4. 根据QzZq博客的代码改动得到使用wget批量下载文件
1 # -- coding:UTF-8 --<code> 2 import requests 3 import re 4 import wget 5 6 file = open("track_main_2022.uri") # 打开存放链接的TXT文档 7 num = 0 8 while 1: 9 line = file.readline() # 逐行读链接 10 if not line: 11 break 12 print("正在下载 第 %d cnf...." % num) 13 num += 1 14 image_url = line 15 ima = image_url.replace('\n','') #去除每行的'\n',不然会404 16 try: 17 url = ima 18 filename = wget.download(url, out="uri2022/") 19 except Exception as e: 20 print('无法下载,%s' % e) 21 continue 22 file.close()
|
|
5. 由于上面这个批量下载脚本不能满足要求,只能借鉴chenzhen0530的博客用脚本改写如下。
1 """ 2 目标:提供一个函数能够从网上下载资源 3 输入: 4 url列表 5 保存路径 6 输出: 7 保存到指定路径中的文件 8 """ 9 # ===================================================== 10 # -- coding:UTF-8 --<code> 11 import requests 12 import re 13 14 15 def download_and_extract(filepath, save_dir): 16 """根据给定的URL地址下载文件 17 18 Parameter: 19 filepath: list 文件的URL路径地址 20 save_dir: str 保存路径 21 Return: 22 None 23 """ 24 for url, index in zip(filepath, range(len(filepath))): 25 file_url = url 26 r = requests.get(file_url, stream = True) 27 28 filename = save_dir + url.split('/')[-2] + '.cnf.xz' 29 30 print("正在下载 第 %d cnf...." % index) 31 32 with open(filename,"wb") as f: 33 for chunk in r.iter_content(chunk_size = 1024**2): 34 if chunk: 35 f.write(chunk) 36 print('\nSuccessfully downloaded') 37 38 39 40 41 def _get_file_urls(file_url_txt): 42 """根据URL路径txt文件,获取URL地址列表 43 44 Parameter: 45 file_url_txt: str txt文件本地路径 46 Return: 47 filepath: list URL列表 48 """ 49 filepath = [] 50 file = open(file_url_txt, 'r') 51 for line in file.readlines(): 52 line = line.strip() 53 filepath.append(line) 54 file.close() 55 return filepath 56 57 58 if __name__ == '__main__': 59 file_url_txt = 'track_main_2022.uri' 60 save_dir = "uri2022_1/" 61 filepath = _get_file_urls(file_url_txt) 62 download_and_extract(filepath, save_dir) 这次修改后的代码成功实现批量下载任务。在个人电脑下载2022年SAT竞赛的Benchmarks文件,即track_main_2022.uri对应的400个样例,用时约3个小时。
|
|
如果发生如下错误,可以用建议方法完成全部下载: 关闭运行窗口,将代码做少量修改,只针对后续的index进行下载。重新运行程序即可。如有必要需要修改和继续运行多次才能完成下载。 |
|