Python学习笔记从Web抓取信息之用requests模块从web下载文件
随笔记录方便自己和同路人查阅。
#------------------------------------------------我是可耻的分割线-------------------------------------------
requests 模块让你很容易从 Web 下载文件,不必担心一些复杂的问题,诸如网络错误、连接问题和数据压缩。requests 模块不是 Python 自带的,所以必须先安装。
通过命令行,运行 pip install requests。
#------------------------------------------------我是可耻的分割线-------------------------------------------
1、检查requests模块是否安装成功,在交互式环境输入import requests,如果没有报错,就证明安装成功。
这样就证明是没有问题的。
2、用requests.get()函数下载一个网页,示例代码;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang #导入第三方库 import requests #该 URL 指向一个文本页面,其中包含整部罗密欧与朱丽叶 res = requests.get( 'http://www.gutenberg.org/cache/epub/1112/pg1112.txt' ) #打印它的类型 print ( type (res)) #通过检查 Response 对象的 status_code 属性,你可以了解对这个网页的请求是否成功。如果该值等于requests.codes.ok,那么一切都好 if res.status_code = = requests.codes.ok: print ( 'True' ) else : print ( 'False' ) #打印大小 print ( len (res.text)) #打印文本内容 print (res.text[: 250 ]) |
运行结果:
requests.get()函数接受一个要下载的 URL 字符串。通过在 requests.get()的返回值上调用 type(),你可以看到它返回一个 Response 对象,其中包含了 Web 服务器对
你的请求做出的响应。
该 URL 指向一个文本页面,其中包含整部罗密欧与朱丽叶。通过检查 Response 对象的 status_code 属性,你可以了解对这个网页的请求是否成功。如果该值等于requests.codes.ok,那么一切都好(顺便说一下,HTTP协议中“OK”的状态码是 200。你可能已经熟悉404 状态码,它表示“没找到”)。如果请求成功,下载的页面就作为一个字符串,保存在 Response 对象的 text变量中。这个变量保存了包含整部戏剧的一个大字符串,调用 len(res.text)表明,它的长度超过 178000 个字符。最后,调用 print(res.text[:250])显示前 250 个字符。
3、检查错误
正如你看到的,Response 对象有一个 status_code 属性,可以检查它是否等于requests.codes.ok,了解下载是否成功。检查成功有一种简单的方法,就是在 Response
对象上调用 raise_for_status()方法。如果下载文件出错,这将抛出异常。如果下载成功,就什么也不做。
raise_for_status()方法,下载错误,示例代码:
1 2 3 4 5 6 | #! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang import requests res = requests.get( 'http://inventwithpython.com/page_ _that_ _does_ _not_ _exist' ) res.raise_for_status() |
运行结果:
raise_for_status()方法,下载正常,示例代码:
1 2 3 4 5 6 | #! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang import requests res = requests.get( 'http://www.gutenberg.org/cache/epub/1112/pg1112.txt' ) res.raise_for_status() |
运行结果:
raise_for_status()方法是一种很好的方式,确保程序在下载失败时停止。这是一件好事:你希望程序在发生未预期的错误时,马上停止。如果下载失败对程序来说
不够严重,可以用 try 和 except 语句将 raise_for_status()代码行包裹起来,处理这一错误,不让程序崩溃。
遇到下载错误是不停止工作,示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 | #! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang import requests ''' 遇到下载错误不停止工作 ''' res = requests.get( 'http://inventwithpython.com/page_ _that_ _does_ _not_ _exist' ) try : res.raise_for_status() except Exception as exc: print ( 'there was a problem: %s' % (exc)) |
运行结果:
4、将下载文件保存在硬盘
现在,可以用标准的 open()函数和 write()方法,将 Web 页面保存到硬盘中的一个文件。但是,这里稍稍有一点不同。首先,必须用“写二进制”模式打开该文件,即向函数传入字符串'wb',作为 open()的第二参数。即使该页面是纯文本的(例如前面下载的罗密欧与朱丽叶的文本),你也需要写入二进制数据,而不是文本数据,目的是为了保存该文本中的“Unicode 编码”。
为了将 Web 页面写入到一个文件,可以使用 for 循环和 Response 对象的iter_content()方法。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang import requests res = requests.get( 'http://www.gutenberg.org/cache/epub/1112/pg1112.txt' ) try : res.raise_for_status() except Exception as exc: print ( 'there was a problem: %s' % (exc)) playFile = open ( 'd:\\RomeoAndJuliet.txt' , 'wb' ) #iter_content方法,循环的每次迭代中 for chunk in res.iter_content( 100000 ): #把每次迭代内容写入文件 playFile.write(chunk) playFile.close() |
运行结果:会把下载内容写入指定文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异