Python urllib模块urlopen()【打开网站,写入本地文件】与urlretrieve()【直接下载网站文件到本地】

本文介绍了Python的urllib模块中的urlopen()方法和urlretrieve()方法。urlopen()用于打开远程URL并返回类文件对象,可进行读取等操作;urlretrieve()则直接将远程数据下载到本地。通过示例代码展示了如何使用这两个方法,包括下载网页内容并保存到本地文件,以及显示下载进度。
部署运行你感兴趣的模型镜像

1.urlopen()方法
urllib.urlopen(url[, data[, proxies]]) :创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。
参数url表示远程数据的路径,一般是网址;
参数data表示以post方式提交到url的数据(玩过web的人应该知道提交数据的两种方式:post与get。如果你不清楚,也不必太在意,一般情况下很少用到这个参数);
参数proxies用于设置代理。
urlopen返回 一个类文件对象,它提供了如下方法:
read() , readline() , readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样;
info():返回一个httplib.HTTPMessage 对象,表示远程服务器返回的头信息
getcode():返回Http状态码。如果是http请求,200表示请求成功完成;404表示网址未找到;
geturl():返回请求的url;
代码示例:
复制代码 代码如下:

import urllib

url = "http://www.baidu.com/"

#urlopen()
sock = urllib.urlopen(url)
htmlCode = sock.read()
sock.close
fp = open("/home/geeklee/1.html","wb")
fp.write(htmlCode)
fp.close

#urlretrieve()
urllib.urlretrieve(url, '/home/geeklee/2.html')

2.urlretrieve方法
直接将远程数据下载到本地。
复制代码 代码如下:

urllib.urlretrieve(url[, filename[, reporthook[, data]]])
参数说明:
url:外部或者本地url
filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);
reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。
data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。

下面通过例子来演示一下这个方法的使用,这个例子将新浪首页的html抓取到本地,保存在D:/sina.html文件中,同时显示下载的进度。
复制代码 代码如下:

import urllib
def callbackfunc(blocknum, blocksize, totalsize):
    '''回调函数
    @blocknum: 已经下载的数据块
    @blocksize: 数据块的大小
    @totalsize: 远程文件的大小
    '''
    percent = 100.0 * blocknum * blocksize / totalsize
    if percent > 100:
        percent = 100
    print "%.2f%%"% percent

url = 'http://www.sina.com.cn'
local = '/home/geeklee/1.html'
urllib.urlretrieve(url, local, callbackfunc)

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮助用户学习如何使用Pythonurllib库中的urlopenurlretrieve方法来下载超文本文件并保存到本地。首先,我得回顾一下用户的问题,确保我准确理解他们的需求。用户明确提到了想学习这两种方法的具体使用步骤,包括示例代码,可能还希望了解两者的区别以及常见错误的解决方法。 接下来,我需要查阅提供的引用资料,特别是引用1、2和3,这些引用提供了关于urllib模块urlopenurlretrieve的使用方法,以及在Python2和Python3中的差异。例如,引用1指出在Python3中,urlretrieve位于urllib.request模块中,而Python2则是直接使用urllib.urlretrieve。用户可能会遇到属性错误,比如在Python3中错误地调用urllib.urlretrieve而没有导入正确的模块,这点需要注意。 根据引用2,urlopen返回一个类文件对象,需要手动读取内容并写入本地文件,而urlretrieve则可以直接下载文件到指定路径。同时,引用3展示了如何在使用urlretrieve时添加回调函数来显示下载进度,这也是用户可能需要的一个进阶功能。 现在,我需要组织一个清晰的教程结构,分步骤讲解两种方法。首先,介绍Python3中的导入方式,因为Python2已经不再维护,推荐用户使用Python3。然后,分别用示例代码展示urlopenurlretrieve的使用,包括异常处理,比如网络请求可能出现的错误,以及文件写入时的处理。 另外,需要强调两种方法的区别:urlopen需要手动处理文件的读写,适合需要处理内容或进行额外操作的场景;而urlretrieve则更简洁,适合直接保存文件的场景。同时,提及回调函数的应用,如显示下载进度,可以增强用户体验。 还要注意用户可能遇到的常见问题,例如模块导入错误,特别是在Python3中urllib的结构变化。需要明确指出正确的导入语句,避免用户踩坑。此外,代码示例中的路径处理也需要考虑,比如使用os模块来构建跨平台的路径,或者处理文件写入时的权限问题。 最后,根据用户的要求,生成相关问题,这些问题应该围绕urllib库的其他功能、错误处理、高级用法等,帮助用户进一步探索。需要确保问题具有针对性,能够引导用户深入学习。 总结一下,我的回答需要包括以下几个部分: 1. 导入urllib库的正确方式(Python3)。 2. 使用urlopen下载并保存文件的步骤,包括代码示例和异常处理。 3. 使用urlretrieve的步骤,同样包括代码示例和回调函数的示例。 4. 两种方法的对比和适用场景。 5. 常见问题解答,如导入错误、路径问题等。 6. 生成的相关问题,帮助用户扩展知识。 在编写过程中,要确保代码语法正确,注释清晰,同时符合用户的中文需求。另外,引用资料中的信息要正确标注,例如在提到Python3的模块结构变化时引用[^1],在解释urlopenurlretrieve功能时引用[^2]和[^3]。 现在,我需要检查是否有遗漏点,比如是否需要提及urllib的其他功能,或者其他库(如requests)的对比。但根据用户的问题,重点在urlliburlopenurlretrieve,所以可以暂时不展开其他库的内容,除非用户后续提问。 此外,确保代码示例中的URL文件路径是示例性的,不会引起用户的困惑。例如,使用http://example.com作为示例URL,保存到当前目录的示例文件,避免使用真实网站可能带来的问题。 最后,语言要简洁明了,步骤分明,让用户能够一步步跟随操作,同时理解每个步骤的作用。如果有需要注意的细节,比如关闭文件句柄或处理HTTP错误状态码,也应该在示例中体现。</think>以下是通过Python urllib库实现URL下载超文本文件的详细教程: ### 一、使用urlopen方法下载 ```python import urllib.request import os try: # 创建请求对象 response = urllib.request.urlopen('http://example.com') # 读取内容(bytes类型) html_content = response.read() # 解码为字符串(自动识别编码) charset = response.headers.get_content_charset() decoded_content = html_content.decode(charset or 'utf-8') # 写入本地文件 save_path = os.path.join(os.getcwd(), 'example.html') with open(save_path, 'w', encoding='utf-8') as f: f.write(decoded_content) except urllib.error.URLError as e: print(f"连接失败:{e.reason}") except Exception as e: print(f"发生异常:{str(e)}") ``` 代码特点: - 自动处理网页编码(通过响应头获取) - 使用上下文管理器自动关闭文件 - 包含异常处理机制[^2] ### 二、使用urlretrieve方法下载 ```python import urllib.request def progress_report(count, block_size, total_size): """下载进度显示函数""" downloaded = count * block_size percent = min(100, downloaded / total_size * 100) print(f"\r下载进度: {percent:.2f}%", end='') url = 'http://example.com' urllib.request.urlretrieve( url, filename='example_retrieve.html', reporthook=progress_report ) ``` 代码特点: - 单行代码实现完整下载 - 支持进度回调函数 - 自动处理文件存储[^3] ### 三、方法对比 | 特性 | urlopen | urlretrieve | |--------------------|-----------------------------|--------------------------| | 代码复杂度 | 需手动读写文件 | 单行完成下载 | | 内存占用 | 需完整加载内容到内存 | 流式写入节省内存 | | 适用场景 | 需要预处理内容 | 直接保存文件 | | 进度显示 | 需自行实现 | 支持reporthook参数 | ### 四、常见问题解决 1. **Python3的模块导入问题** 出现`AttributeError`时,确认使用: ```python from urllib.request import urlopen, urlretrieve ``` [^1] 2. **文件路径推荐写法** 使用`os.path`模块构建路径: ```python import os save_path = os.path.join(os.getcwd(), 'downloads', 'file.html') ``` 3. **大文件下载优化** 使用分块下载: ```python CHUNK = 1024*8 with open('largefile.html', 'wb') as f: while True: chunk = response.read(CHUNK) if not chunk: break f.write(chunk) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值