Python学习笔记从Web抓取信息之用requests模块从web下载文件

随笔记录方便自己和同路人查阅。

#------------------------------------------------我是可耻的分割线-------------------------------------------

  requests 模块让你很容易从 Web 下载文件,不必担心一些复杂的问题,诸如网络错误、连接问题和数据压缩。requests 模块不是 Python 自带的,所以必须先安装。

通过命令行,运行 pip install requests

#------------------------------------------------我是可耻的分割线-------------------------------------------

  1、检查requests模块是否安装成功,在交互式环境输入import requests,如果没有报错,就证明安装成功。

  这样就证明是没有问题的。

  2、用requests.get()函数下载一个网页,示例代码;

#! 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()方法,下载错误,示例代码:

#! 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()方法,下载正常,示例代码: 

#! 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()代码行包裹起来,处理这一错误,不让程序崩溃。

  遇到下载错误是不停止工作,示例代码:

#! 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()方法。

   示例代码:

#! 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()

  运行结果:会把下载内容写入指定文件

posted @ 2019-07-17 15:19  李荣洋  阅读(866)  评论(0编辑  收藏  举报