7天入门python系列之爬取热门小说项目实战,互联网的东西怎么算白嫖呢

第七天 Python项目实操

编者打算开一个python 初学主题的系列文章,用于指导想要学习python的同学。关于文章有任何疑问都可以私信作者。对于初学者想在7天内入门Python,这是一个紧凑的学习计划。但并不是不可完成的。
学到第7天说明你已经对python有了一个基本的认识,下面通过完成一个小项目来巩固之前几天所学的知识。
接下来我们上干货, 编者是一个网文读者,常常因为小说需要订阅或者有时候网路不好,看不到小说,因此选择将小说下载下来,保证能过随时随地的阅读。看看这个小项目的效果
在这里插入图片描述
在这里插入图片描述

接下来你需要熟悉几个词语,网页开发,flask 框架,request 、BeautifulSoup库,
源代码我放在**源代码地址**

  • 网页开发:

    • 定义: 网页开发是指创建和维护网页的过程。它涵盖了从设计、编写前端代码(HTML、CSS、JavaScript)到后端开发(服务器端代码、数据库交互)以及整个网站的部署和维护等一系列工作。网页开发旨在创造用户友好的、功能完善的网站和Web应用。
  • Flask 框架:

    • 定义: Flask 是一个基于 Python 的轻量级 Web 框架,用于构建 Web 应用程序。它提供了一些核心工具,如路由、视图函数、模板引擎等,使得开发者能够以简洁而灵活的方式构建 Web 应用。Flask 是一个微框架,它提供了一些基础的功能,但让开发者有更大的自由度选择其他库来满足特定需求。
  • requests 库:

    • 定义: requests 是一个用于发送 HTTP 请求的 Python 第三方库。它提供了简单而强大的 API,用于处理各种类型的请求和响应,如 GET、POST 等。requests 库使得在 Python 中进行网络请求变得更加方便,可以用于从 Web 服务器获取数据、与 API 交互等场景。
  • BeautifulSoup 库:

    • 定义: BeautifulSoup 是一个 Python 库,用于从 HTML 或 XML 文档中提取数据。它提供了一种方便的方式来搜索文档树、遍历文档树中的元素,以及修改文档树。在网页开发中,BeautifulSoup 主要用于解析 HTML 页面,从中提取结构化的信息,例如抓取特定标签的内容、提取链接、或者进行数据挖掘。

在网页开发中,通常会使用 Flask 框架来构建 Web 应用的后端,同时使用 requests 库来进行与其他服务器的通信,获取数据。而在处理获取到的 HTML 页面时,可以借助 BeautifulSoup 库进行解析和信息提取。这三者的结合使得开发者能够更轻松地构建和处理 Web 应用。
代码我放在gitee 仓库:https://gitee.com/constantine-G/getbook

项目搭建

然后开始我们的项目搭建:

使用pycharm 编辑器, 创建项目

在这里插入图片描述

新建好的干净项目

在这里插入图片描述> 此时你可以启动这个项目,会返回一句话
在这里插入图片描述

创建交互页面

创建这样两个文件
在这里插入图片描述
网络下载这个文件,如果找不到,直接到我的仓库下载
在这里插入图片描述

index.html 内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>hello,my world!</title>
</head>
<body>
<div id="app">
    <input id="bookName">输入书籍、作者名称</input>
    <button id="swap">确认</button>
    <ul id="data-list"></ul>
    <input id="bdbookName">本地书籍</input>
    <button id="search">搜索</button>
    <ul id="bd-list"></ul>
</div>
{# <script src="/static/js/common/vue/vue.js"></script>#}
{# <script type="text/javascript" src="/static/js/common/require/require.min.js"></script>#}
 <script src="/static/js/common/jquery.js"></script>
 <script src="/static/js/index.js"></script>

</body>
</html>

iondex,js 内容

const person = document.getElementById('bookName');
const bdbookName = document.getElementById('bdbookName');
$(document).ready(function () {
    $("#swap").click(function () {
        $.ajax({
            type: "POST",
            url: "/searchBook",
            dataType: "json",
            data: {"bookName": person.value},
            success: function (res) {
                displayData(res);
                // addListener();
            },
            error: function (xhr, status, error) {
                alert(error);
            }
        });
    });

    $("#search").click(function () {
        $.ajax({
            type: "POST",
            url: "/searchBd",
            dataType: "json",
            data: {"bookName": bdbookName.value},
            success: function (res) {
                dbdisplayData(res);
                // addListener();
            },
            error: function (xhr, status, error) {
                alert(error);
            }
        });
    });
     //
});

function addListener(){
            // 获取列表项元素
    const listItems = document.querySelectorAll('#data-list li');
        // 为每个列表项添加点击事件
        listItems.forEach(item => {
            item.addEventListener('click', () => {
               downLoadBook(item)
            });
        });
}

function addListener(){
            // 获取列表项元素
    const listItems = document.querySelectorAll('#bd-list li');
        // 为每个列表项添加点击事件
        listItems.forEach(item => {
            item.addEventListener('click', () => {
               downLoadBook(item)
            });
        });
}
function downLoadBook(event) {

    $.ajax({
        type: "POST",
        url: "/downLoadBook",
        dataType: "json",
        data: {"book": data},
        success: function (res) {
            alert(res);
        },
        error: function (xhr, status, error) {
            alert(error);
        }
    });
}
function dbdisplayData(data) {
    var dataList = $("#bd-list");
    dataList.empty();
    data.forEach(function (item) {
        // <a href="{{ url_for('downLoadBook', id=post['id']) }}">Edit</a>
        // var url = "/downLoadBook" + item.link;
        var url = "/downLoadBook" + item.bookLink;
        dataList.append("<li>" + item.bookName + "<a href=\""+url+"\">  下载  </a>"+"地址:  "+item.path+"</li>");
        // dataList.append("<li>" + item.bookName + "</li>");
    });
}

function displayData(data) {
    var dataList = $("#data-list");
    dataList.empty();
    data.forEach(function (item) {
        // <a href="{{ url_for('downLoadBook', id=post['id']) }}">Edit</a>
        var url = "/downLoadBook" + item.link;
        dataList.append("<li>" + item.name + "<a href=\""+url+"\">下载</a>"+"</li>");
    });
}

在app.py 文件中添加一个方法

@app.route('/')
def hello_world():  # put application's code here
    return render_template("index.html")

此时再次重启项目,并访问 http://127.0.0.1:5000/
在这里插入图片描述
可以看到已经多了一些内容。这是用于一个简单交互的页面。主要是输入想要下载的书籍,发起查询,然后在下载

完成时的效果:
在这里插入图片描述

网站后端查询小说

新增一个文件叫book.py
并新增以下内容 :

主要是点击查询的功能实现

def searchBooklist(bookName):
    try:
        # 发送GET请求 = "http://www.biqu5200.net"
        response = requests.get(url== "http://www.biqu5200.net" + "/modules/article/search.php?searchkey=" + bookName, headers=header)
        response.encoding = 'utf-8'
        # 检查请求是否成功
        res = []
        bookList = []
        if response.status_code == 200:
            # 如果请求成功,获取响应数据
            soup = BeautifulSoup(response.content, "html.parser")
            even_items = soup.find_all("tr")
            # 遍历并打印匹配的元素内容
            for item in even_items:
                booklink = item.find("a")
                if booklink != None and booklink["href"] != None and booklink.text != None:
                    book = {
                        "name": booklink.text,
                        "link": booklink["href"]
                    }
                    bookO = {
                        "name": booklink.text,
                        "link": url+booklink["href"]
                    }
                    res.append(book)
                    # book = select(booklink.text)
                    if book == None:
                        bookList.append(bookO)
            # insert(bookList)
            return res

        else:
            # 如果请求失败,打印错误信息
            print("请求失败,状态码:", response.status_code)
            return res
    except requests.exceptions.RequestException as e:
        # 处理请求异常
        print("请求异常:", e)
        return res

这个方法是返回一个书籍的列表
在这里插入图片描述

接下来实现下载功能

def downLoadBook(bookLink):
    # 发送GET请求
    # response = requests.get(url=book["link"], headers=header)
    #  请求数据
    response = getRequsetContent(url+"/"+bookLink)
    if response != None:
        # 如果请求成功,获取响应数据
        soup = BeautifulSoup(response, "html.parser")
        even_items = soup.find_all("dd")
        bookName = soup.find(id='info').find('h1').text
        start = time.time()
        min = len(even_items) / (60/second)
        hour = min / 60
        print("预估时间:" + str(min) +"分钟" + "= "+str(hour)+"小时")
        # 遍历并打印匹配的元素内容
        # open(bookName+".txt", mode="r")
        # 读文件
        # open("demo1/1.txt", mode="w")
        # 写文件
        file = open(bookName + ".txt", mode="w",encoding='utf-8')
        file = open(bookName + ".txt", mode="a",encoding='utf-8')
        # 追加
        ret_message = {"code": 0, "status": "successful", "msg": "成功,耗时:" + str(min)}
        failed = []
        # book = select(bookName)
        try:
            chapterList = []
            for item in even_items:
                booklink = item.find("a")
                chapter = {
                    "bookid": book["id"],
                    "chapterLink": url+ booklink["href"],
                    "chapterName": booklink.text
                }
                chapterList.append(chapter)
            # insertChapter(chapterList)
            leastchaper = ''
            for item in even_items:
                booklink = item.find("a")
                contemxUrl =booklink["href"]
                chaper = booklink.text
                leastchaper = chaper
                chaperurl = url + contemxUrl
                # 休息1秒
                time.sleep(second)
                content = getRequsetContent(chaperurl)
                contentList = []
                if content != None:
                    soup = BeautifulSoup(content, "html.parser")
                    chapername = soup.find(class_="bookname").find("h1").text
                    contentList.append(chapername + '\n')
                    pList = soup.find(id="content").find_all("p")
                    contentList = []
                    for p in pList:
                        constr = p.text
                        if constr.find("请记住本书首发域名:。顶点小说手机版阅读网址:") != -1:
                            print("有广告:" + constr)
                        contentList.append(p.text + '\n')
                else:
                    failed.append(chaper)
                file.writelines(contentList)
                # update(chaper,url+ booklink["href"])
                print("完成:"+chaper)
            upBook = Book(book['id'],1,os.path.abspath(os.path.dirname(file.__str__())).replace('\\','/'),leastchaper,';'.join(failed))
            # updateBook(upBook)
            print("failed:" + ''.join(failed))
            size =file.seek(0, os.SEEK_END)
            end = time.time()
            print("size:" + ''.join(size))
            print("time:" + end - start)
            file.close()
            return ret_message
        except Exception as e:
            # 处理请求异常
            file.close()
            print("异常:", e)
            return ret_message
    else:
        # 如果请求失败,打印错误信息
        print("请求失败,状态码:", response.status_code)

# 公用方法
def getRequsetContent(url):
    try:
        # 发送GET请求
        response = requests.get(url=url, headers=header)
        response.encoding = 'utf-8'
        # 检查请求是否成功
        if response.status_code == 200:
            # 如果请求成功,获取响应数据
            return response.content
        else:
            # 如果请求失败,打印错误信息
            print("请求失败,状态码:", response.status_code)
            return None
    except requests.exceptions.RequestException as e:
        # 处理请求异常
        print("请求异常:", e)
        return None

到此我们的功能就基本完成了。实现了查询数据,并选择自己想要的书籍下载,有任何疑问请联系我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/150159.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Playwright UI 自动化测试实战

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

VSCode配置MingW编译调试环境

1.MingW简介 MinGW&#xff0c;即 Minimalist GNU For Windows。它是一些头文件和端口库的集合&#xff0c;该集合允许人们在没有第三方动态链接库的情况下使用 GCC&#xff08;GNU Compiler C&#xff09;产生 Windows32 程序。 实际上 MinGW 并不是一个 C/C 编译器&#xf…

亚马逊产品召回后如何重新发布商品?儿童睡衣,婴儿沐浴座椅,不锈钢儿童水杯被召回

近日&#xff0c;又有一款亚马逊热销超34w的产品出现安全问题。据外媒报道&#xff0c;7月20日&#xff0c;CPSC发现一款产品名为CUPKIN双层不锈钢儿童水杯存在铅中毒的风险&#xff0c;该水杯的铅含量超过联邦铅含量禁令。 CPSC在召回公告中指出&#xff0c;因为铅极容易被6岁…

南湖HIT论坛|《医疗数据安全风险分析及防范实践(2023)》正式发布

11月11日&#xff0c;2023年南湖HIT论坛在浙江嘉兴隆重举行。作为颇受HIT从业者关注的年度盛会——本届论坛以“数据驱动医院运营管理”为主题&#xff0c;全国各地医疗机构信息主管和骨干围绕“数据驱动运营管理、运营数据中心建设、数据治理和数据安全”等话题展开深入研讨。…

Python自动化测试:web自动化测试——Selenium框架

web自动化测试1 Selenium介绍web自动化实现原理环境准备1&#xff09;Seleniumpython环境搭建安装步骤环境变量的配置 2&#xff09;浏览器驱动驱动下载驱动环境配置 3&#xff09;版本检查4&#xff09;其他异常情况排查版本不一致未激活卸载、降低/升级setuptools版本 web自动…

什么是CSV文件,以及如何打开CSV文件格式

​CSV代表Comma Separated Values。CSV文件是一种纯文本文件&#xff0c;用于存储表格和电子表格信息。内容通常是由文本、数字或日期组成的表格。使用将数据存储在表中的程序可以轻松导入和导出CSV文件。 CSV文件格式 通常CSV文件的第一行包含表格列标签。后面的每一行表示表…

【软考篇】中级软件设计师 第三部分(一)

中级软件设计师 第三部分&#xff08;一&#xff09; 十七. I/O管理软件十八. 输入/输出技术十九. 总线系统二十. 磁盘管理20.1 移臂调度算法20.2 缓冲区 二十一. 操作系统二十二. 数据库22.1 三级模式-两级映射22.2 数据库设计22.3 规范化理论22.4 范式判断22.5 模式分解 二十…

单链表按位查找 按值查找与 求表长

按位查找 #define NULL 0typedef struct LNode {int data;struct LNode *next; }LNode,*LinkList;//按位查找&#xff0c;返回第i个元素&#xff08;带头结点&#xff09; LNode* GetElem(LinkList L,int i){if(i<0)return NULL;LNode *p L;int j 0;while (p!NULL &&a…

使用 MATLAB HDL Coder 和 FPGA 快速实现自动白平衡(AWB)

使用 MATLAB HDL Coder 和 FPGA 快速实现自动白平衡&#xff08;AWB&#xff09; 在此项目中&#xff0c;我们将使用 MATLAB Simulink 和 HDL 编码器创建自定义 IP -- AWB。 MATLAB 设计 自动白平衡模块的设计是使用 HDL Coder 在 MATLAB 和 Simulink 中创建的。HDL Coder能够生…

免费开源客服机器人tiledesk 实现一个查询天气机器人

第一步,槽位收集: 第二步:天气api接口调用: 效果展示:

云原生下GIS服务规划与设计

作者&#xff1a;lisong 目录 背景云原生环境下GIS服务的相关概念GIS服务在云原生环境下的规划调度策略GIS服务在云原生环境下的调度手段GIS服务在云原生环境下的服务规划调度实践 背景 作为云原生GIS系统管理人员&#xff0c;在面对新建的云GIS系统时&#xff0c;通常需要应对…

LTD251次升级 | 商机平台可筛选、浏览历史可查看 • 在线课程可秒杀购买 • 采购表单可实时计算价格与周期

1、 新增商机类型筛选及历史浏览功能&#xff1b; 2、 新增地址管理和物流公司管理功能&#xff1b; 3、 优化表单导出问题文件格式&#xff1b; 4、 可定制实时计算价格的表单&#xff1b; 5、 知识付费支持秒杀活动&#xff1b; 01 商机平台应用 在上次升级中&#xff0c;我…

大环境之下软件测试行业趋势能否上升?

如果说&#xff0c;2021年对于全世界来说&#xff0c;都是一场极大的挑战的话&#xff1b;那么&#xff0c;2022年绝对是机遇多多的一年。众所周知&#xff0c;随着疫情在全球范围内逐步得到控制&#xff0c;无论是国际还是国内的环境&#xff0c;都会呈现逐步回升的趋势&#…

PM2学习

目录 PM2简介 pm2的主要特性 PM2安装 启动PM2项目 查看应用列表&#xff08;查看当前机器执行的所有进程&#xff09; 查看某个应用详情 重启 停止 删除 日志查看 负载均衡 监控CPU/内存 内存使用超过上限自动重启 监听代码变化/自动重启 PM2简介 PM2是常用的node…

2023年【道路运输企业主要负责人】考试技巧及道路运输企业主要负责人复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 道路运输企业主要负责人考试技巧是安全生产模拟考试一点通总题库中生成的一套道路运输企业主要负责人复审模拟考试&#xff0c;安全生产模拟考试一点通上道路运输企业主要负责人作业手机同步练习。2023年【道路运输企…

Redis应用场景及常见的数据类型

目录 一、Redis应用场景 1.1 Redis作为缓存 1.2 Redis作为消息队列 1.3 实现计数器和排行榜 1.4 实现分布式锁及分布式会话管理 二、Redis常见的数据类型 2.1 String&#xff08;字符串&#xff09;类型 2.2 list类型 2.3 Hash类型 2.4 Set类型 2.5 Sorted Set 一、Redis应用场…

什么是3D建模中的“高模”和“低模”?

3D建模中什么是高多边形和低多边形&#xff1f; 高多边形建模和低多边形建模之间的主要区别正如其名称所暗示的那样&#xff1a;您是否在模型中使用大量多边形或少量多边形。 然而&#xff0c;在决定每个模型的细节和多边形级别时&#xff0c;还需要考虑其他事项。最值得注意的…

安装宝塔,使用宝塔自动部署

这里用的是华为云服务器&#xff0c;其实也就是普普通通的一个linux操作系统 首先我们来到宝塔官网地址 宝塔面板下载&#xff0c;免费全能的服务器运维软件 (bt.cn) 翻到下面&#xff0c;会有使用脚本安装的命令。 yum install -y wget && wget -O install.sh https:/…

【C++面向对象】10. 多态

文章目录 【 前言 】【 虚函数 】【 纯虚函数 】 【 前言 】 多态按字面的意思就是多种形态。当 类之间存在层次结构&#xff0c;并且类之间是通过继承关联时 &#xff0c;就会用到多态。 C 多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的函数…

msvcp140_CODECVT_IDS.dll丢失怎么办,分享两个有效的方法

在计算机使用的过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“缺少xxx.dll文件”。这些文件是动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它们包含了程序运行所需的函数和资源。而msvcp140_CODECVT_IDS.dll就是其中之一。那么&#…