Python下载小说 -XXOO[通俗易懂]

Python下载小说 -XXOO[通俗易懂]前言作为一个十年老书虫,对于小说来源深有体会,从买实体书到电子书下载。各种不爽,在这里也是满足下自己迫切的心情,来,撸一发代码,找几本小说看看。一、搜索入口这里也是找了一个良心的网站来操作的。其他的下载不是充钱就是会员或者空白。http://www.bookshuku.com/是不是很直白,上代码#name小说名称defsearchTxt(name):url=’http://www.bookshuku.com/search.html’hea…

大家好,又见面了,我是你们的朋友全栈君。

前言

作为一个十年老书虫,对于小说来源深有体会,从买实体书到电子书下载。各种不爽,在这里也是满足下自己迫切的心情,来,撸一发代码,找几本小说看看。


一、搜索入口

这里也是找了一个良心的网站来操作的。其他的下载不是充钱就是会员或者空白。http://www.bookshuku.com/

Python下载小说 -XXOO[通俗易懂]

Python下载小说 -XXOO[通俗易懂]

是不是很直白,上代码

# 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

二、解析网页,下载

Python下载小说 -XXOO[通俗易懂]

直接解析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('输入序号应为数字')

Python下载小说 -XXOO[通俗易懂]

Python下载小说 -XXOO[通俗易懂]

写在最后

可以的,满足了下一个十年老书虫惶恐的心情。O(∩_∩)O哈哈~

感谢各位大大的耐心阅读~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160876.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Android布局之表格布局[通俗易懂]

    Android布局之表格布局[通俗易懂]表格布局(Tablelayout) 简介:       Tablelayout类以行和列的形式对控件进行管理,每一行为一个TableRow对象,或一个View控件。     当为TableRow对象时,可在TableRow下添加子控件,默认情况下,每个子控件占据一列。     当为View时,该View将独占一行。表格布局是以行和列的形式来对控件…

  • 内核态和用户态区别的重要性_cpu用户态和内核态区别

    内核态和用户态区别的重要性_cpu用户态和内核态区别内核态和用户态区别内核态和用户态区别当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在

  • JavaScript的变量作用域深入理解(转)

    JavaScript的变量作用域深入理解(转)

  • 中文按字母排序_怎么按首字母顺序排

    中文按字母排序_怎么按首字母顺序排        项目中用到前端排序,自己写了一个实现,给大家分享一下。      存在的问题:很多时候是用汉字的首拼来比较,但汉字转拼音在前端实现是个问题,主要表现在两个地方1、字符库里的数据量没有覆盖所有汉字,2、多音字问题(注:这里都是说简体汉字)。      实现思路:1、从网上找了一个汉字转拼音的库,能转大部分汉字(多音字也没处理);2、写一个字符比较的函数;3、调用Array里的…

    2022年10月12日
  • pycharm配置svn有什么用_SVN安装配置

    pycharm配置svn有什么用_SVN安装配置PyCharm是一款非常优秀的PythonIDE,以前用Editplus,用惯了感觉还行。用了PyCharm后被它丰富的功能吸引了。无论是普通python脚本、Django框架项目、还是GoogleAppEngine项目,它都能完美运行。不过设置起来比较麻烦,比如Subversion的用法我就一直没参透,我总是写完代码后出去用小乌龟提交。今天google一下,终于搞定了。现在写完代码后直接在…

  • Java开源博客源码完整汇总(持续更新)

    Java开源博客源码完整汇总(持续更新)程序员需要拥有一个属于自己的独立博客网站。所以我从网站收集了一些好的Java开源博客系统。既然是属于开源,当然支持我们广大程序员二次开发了。其实搭建属于自己的技术博客网站很简单,只需要一个域名,一台服务器,然后进行网站备案(个人备案很简单)就可以拥有属于自己的博客网站了。程序员一定要及早的打造个人独立IP,拥有自己的独立博客,学会扩大自己的影响力。在公司,你能力最多影响公司的同事。但是在互联网,拥有自己的网站,你就可以影响千千万万的程序员和即将入行的新手程序员1.OneBlog一个简洁美观、功能.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号