Python下载小说 -XXOO[通俗易懂]
2023-06-13 09:12:27 时间
大家好,又见面了,我是你们的朋友全栈君。
前言
作为一个十年老书虫,对于小说来源深有体会,从买实体书到电子书下载。各种不爽,在这里也是满足下自己迫切的心情,来,撸一发代码,找几本小说看看。
一、搜索入口
这里也是找了一个良心的网站来操作的。其他的下载不是充钱就是会员或者空白。http://www.bookshuku.com/
是不是很直白,上代码
# name 小说名称
def searchTxt(name):
url = 'http://www.bookshuku.com/search.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': ""
}
data = {'searchkey': name}
# 发起请求
response = requests.post(url, data, headers)
# 解决requests.get 网页中文乱码
response.encoding = response.apparent_encoding
# 得到搜索结果。获取小说信息
html_obj = etree.HTML(response.text)
bookInfo1 = html_obj.xpath('//div[@class="searchTopic"]/a')
bookInfo2 = html_obj.xpath('//div[@class="searchInfo"]/span')
counter = 0
result = []
r = ['序号', '名称', '作者', '类别', '大小', '日期', '地址']
result.append(r)
for b1 in bookInfo1:
book_na = b1.xpath('text()')[0]
# 名称
book_name = str(book_na).split("/")[0]
# 访问地址
book_url = b1.xpath("@href")[0]
# 作者
book_auth = str(book_na).split("/")[1].split(":")[1]
# 类别
book_type = bookInfo2[counter * 2].xpath('text()')[0]
# 大小
book_size = str(bookInfo2[counter * 2].tail).split(":")[1].split(" ")[0]
# 日期
book_date = bookInfo2[counter * 2].xpath('//span[@class="oldDate"]/text()')[0]
r = [counter + 1, book_name, book_auth, book_type, book_size, book_date, book_url]
result.append(r)
counter = counter + 1
return result
二、解析网页,下载
直接解析Html
# 小说 下载
# name 小说名称
# url 下载url
def downloadTxt(name, url):
print("正在爬取-{}-小说".format(name))
if not os.path.exists(name):
os.mkdir(name)
os.chdir(name)
else:
os.chdir(name)
response = requests.get(url)
# 解决requests.get 网页中文乱码
response.encoding = response.apparent_encoding
html_obj = etree.HTML(response.text)
div = html_obj.xpath('//dl[@id="downInfoArea"]')[0]
# 小说名称
novel_name = div.xpath('//dt/text()')[0]
c_list = html_obj.xpath('//dd[@class="downInfoRowL"]')[1]
# 小说书籍格式
novel_txt_format = c_list[6].tail
# 小说书籍字数
novel_txt_num = c_list[12].tail
# 小说最新章节
novel_new_point = div.xpath('//dd/a/text()')[3]
# 小说文件大小
novel_size = c_list[10].tail
# 小说书籍类型
novel_file_type = div.xpath('//dd/a/text()')[1]
# 小说更新日期
novel_update_time = c_list[14].tail
# 小说作者
novel_author = div.xpath('//dd/a/text()')[0]
# 小说图片的地址
novel_img_url = div.xpath('//dd/img/@src')[0]
urlretrieve(novel_img_url, "{}.jpg".format(novel_name))
# 小说的下载地址
# 根据正则表达式提取
download_str = html_obj.xpath('//li[@class="downAddress_li"]/a')[0]
novel_download_url = download_str.xpath("@href")[0]
# 打开页面,获取下载地址
response = requests.get(novel_download_url)
# 解决requests.get 网页中文乱码
response.encoding = response.apparent_encoding
html_tobj = etree.HTML(response.text)
t_list = html_tobj.xpath('//a[@class="strong blue"]')[1]
novel_download_url = t_list.xpath("@href")[0]
print("小说下载地址:", novel_download_url, '开始下载.....')
# 来个进度条
urlretrieve(novel_download_url, "{}.txt".format(novel_name), Schedule)
f = open("{}信息.txt".format(novel_name), "w", encoding="utf-8")
# write():文件写入
f.write("小说名称:{}".format(novel_name))
f.write("\n")
f.write("小说格式:{}".format(novel_txt_format))
f.write("\n")
f.write("小说字数:{}".format(novel_txt_num))
f.write("\n")
f.write("小说最新章节:{}".format(novel_new_point))
f.write("\n")
f.write("文件大小:{}".format(novel_size))
f.write("\n")
f.write("书籍类型:{}".format(novel_file_type))
f.write("\n")
f.write("更新日期:{}".format(novel_update_time))
f.write("\n")
f.write("小说作者:{}".format(novel_author))
f.write("\n")
f.write("下载地址:{}".format(novel_download_url))
f.write("\n")
f.write("小说图片地址:{}".format(novel_img_url))
f.write("\n")
print("文件关闭")
# 关闭文件
f.close()
os.chdir(os.pardir)
再来个进度条
# 进度条
def Schedule(a, b, c):
'''''
a:已经下载的数据块
b:数据块的大小
c:远程文件的大小
'''
per = 100.0 * a * b / c
if per > 100:
per = 100
print('%.2f%%' % per)
二、man方法,操作一波
if __name__ == '__main__':
while True:
txtName = input("请输入小说名称:")
if txtName == 'exit':
print('退出搜索.....')
break
result = searchTxt(txtName)
if len(result) < 1:
print('没有找到你想要的小说,请重新输入:')
else:
# 展示小说搜索结果
print('------------------结果如下--------------------')
for r in result:
print(str(r).replace('[', '').replace(']', '').replace(',', ''))
while True:
num = input("请选择你要下载的小说序号:")
if is_number(num):
if int(num) > len(result):
print('没有找到你选择的序号,请重新输入:')
else:
content = result[int(num)]
print('你选择的内容:', str(content).replace('[', '').replace(']', '').replace(',', ''))
flag = input("是否确认下载 y/n ?")
if 'y' == flag:
# 下载
downloadTxt(content[1], content[6])
print("小说-{}-下载完成".format(content[1]))
break
else:
print('输入序号应为数字')
写在最后
可以的,满足了下一个十年老书虫惶恐的心情。O(∩_∩)O哈哈~
感谢各位大大的耐心阅读~
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160876.html原文链接:https://javaforall.cn
相关文章
- 下载whl文件,离线方式安装numpy包_python离线安装pip
- 在pycharm中如何新建Python文件?_github下载的python源码项目怎么用
- 苹果电脑python官网下载步骤-Python下载和安装图文教程[超详细]
- python的进制转换器,Python进制转换[通俗易懂]
- python人工智能学习笔记_[Python] 人工智能与自然语言处理学习笔记(1)[通俗易懂]
- python控制mt4自动交易软件下载_MT4 EA智能自动交易系统使用教程[通俗易懂]
- python删除首行_Python删除文件第一行
- python解压bz2文件命令,在Python中解压缩.bz2文件
- python中替换字符串中字符_Python replace()函数:替换字符串中的某个字符「建议收藏」
- python常见运维脚本_Python运维常用脚本[通俗易懂]
- 手机python 3.8解释器_Python 3.8 解释器安装教程
- 怎么用python打开csv文件_Python文本处理之csv-csv文件怎么打开[通俗易懂]
- python表情代码_Python实现表情包的代码实例[通俗易懂]
- python里面的缩进是什么意思_Python缩进规则(一看即懂)[通俗易懂]
- PYTHON主机_我的Python世界PDF
- python lambda表达式举例_Python中lambda表达式[通俗易懂]
- win10 python环境_win10安装python
- Python接口自动化测试自学路线
- 人生苦短,我用Python-手把手教你如何使用python写串口调试助手
- python-Python与SQLite数据库-使用Python执行SQLite查询(一)
- 小白的Python之路 day5 python模块详解及import本质编程语言
- Python机器学习入门详解编程语言
- Python静态方法和类方法的区别和应用(无师自通)
- 快速查询MySQL数据库:Python篇(python查询mysql数据库)
- 使用Python连接SQL Server数据库(python连接sqlserver数据库)
- python用Redis与Python实现大数据收集与分析(redis 联合)
- python实现爬虫下载漫画示例
- Python中无限元素列表的实现方法