说说如何利用 Python 的 requests 模块,从网络下载电子小说

利用 Python 的 requests 模块可以很容易从网络下载电子小说,甚至可以处理 https 连接!首先必须先安装该模块。

通过命令行,运行 -》

pip install request

1 请求

首先找一个电子书下载链接,形如:https://xiazai.xqishu.com/txt/%E9%80%A0%E5%8C%96%E5%9B%BE.txt, 这个 URL 地址指向了一个 txt 文件,这个文件包含小说全文内容。分析这个地址,可以发现,这里把书名做了 URL 编码,然后作为链接的请求地址内容。这种链接很容易处理。

import requests
from urllib.parse import quote
import logging

# logging.disable(logging.CRITICAL)
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

代码如下,注意必须保证本机能连接上因特网:
'''
下载电子小说
@author Deniro Li
'''
book_name = '造化图'
logging.debug('编码后 -> ' + quote(book_name))

res = requests.get('https://xiazai.xqishu.com/txt/' + quote(book_name) + '.txt')
logging.debug('res -> ' + str(type(res)))
assert res.status_code == requests.codes.ok
logging.debug('text size -> ' + str(len(res.text)))
logging.debug('显示前300个字符 -> ' + res.text[:300])
  • 这里通过检查 Response 对象的 status_code 属性,来判定请求是否成功。如果该值等于 requests.codes.ok,即 200,那么请求成功。
  • len(res.text) 可以计算出该书的总字符数,比如这本书共有 1069192 个字符。
  • 通过 res.text[:300] 可以显示这本书的前 300 个字符。

输出结果:

2 检查错误

除了直接通过 Response 对象的 status_code 属性来判定请求是否成功之外,还可以使用 Response 对象的 raise_for_status() 方法。如果下载文件失败,它会抛出异常。我们可以使用 try 和 except 语句将 raise_for_status() 包裹起来,对其进行处理,比如打印出错日志。通过 raise_for_status() 方法可以确保程序在下载失败时停止,避免程序崩溃。

res=requests.get('http://www.gutenberg.org/deniro.txt')
try:
    res.raise_for_status()
except Exception as exc:
    logging.error('There was a problem -> ' + str(exc))

3 下载电子小说

现在使用标准的 open()函数和 write()方法,将请求后的响应字符保存到本地硬盘中。

注意: 必须用“写二进制”模式打开该文件,即向函数中传入字符串’wb’,作为 open() 的第二参数。因为要保存该文本的“Unicode 编码”。比如英文小说一般是 UTF-8 编码,而中文小说也是 GBK 编码的。通过这种方式,可以统一处理。

# 下载到本地文件
file = open(book_name + '.txt', 'wb')
for chunk in res.iter_content(100000):
    file.write(chunk)
file.close()

为了将 Web 页面写入到一个文件,这里使用了 for 循环和 Response 对象的 iter_content()方法。iter_content()方法会在循环的每次迭代中,返回一段内容。每一段都是 bytes 类型的数据。iter_content()方法传入缓冲字节大小。通过设置缓存区大小,可以控制消耗的内存大小,这种方法可以有效地应对大文件下载的情况。

顺便说一下,古登堡计划网站 http://www.gutenberg.org,有很多免费、无版权限制的英文电子书哦。

4 下载流程

下载并保存到本地的完整流程如下:
1.调用 requests.get()请求该电子书。
2.用’wb’调用 open(),以写二进制的方式打开一个新文件。
3.利用 Respose 对象的 iter_content()方法进行循环操作。
4.在每次迭代中调用 write(),将缓冲中的内容写入该文件。
5.调用 close() 关闭该文件。


当然不只是电子小说,任何网页都可以采用这种方式,下载到本地哦O(∩_∩)O哈哈~

发布了671 篇原创文章 · 获赞 766 · 访问量 99万+

猜你喜欢

转载自blog.csdn.net/deniro_li/article/details/105007414