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

news2024/11/16 9:36:29

第七天 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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生活消费分销系统搭建开发制作

文章目录 前言 一、生活消费系统是什么&#xff1f;二、生活消费分销系统的营销方式和功能三、总结 一、生活消费系统介绍 生活消费系统涵盖了吃喝玩乐&#xff0c;衣食住行。网购消费等生活消费的优惠券领取以及分销功能 二、生活消费分销系统的营销方式和功能 A: 会员体…

基于Springboot的影城管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的影城管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍…

【Proteus仿真】【Arduino单片机】DS18B20温度计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶、DS18B20温度传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示传感器采集温度。 二、软件设计 /*…

Android抓包工具—Fiddler详解

前言 平时和其他大佬交流时&#xff0c;总会出现这么些话&#xff0c;“抓个包看看就知道哪出问题了”&#xff0c;“抓流量啊&#xff0c;payload都在里面”&#xff0c;“这数据流怎么这么奇怪”。 &#x1f449;这里出现的名词&#xff0c;其实都是差不多的意思啊&#xf…

leetcode:1576. 替换所有的问号(python3解法)

难度&#xff1a;简单 给你一个仅包含小写英文字母和 ? 字符的字符串 s&#xff0c;请你将所有的 ? 转换为若干小写字母&#xff0c;使最终的字符串不包含任何 连续重复 的字符。 注意&#xff1a;你 不能 修改非 ? 字符。 题目测试用例保证 除 ? 字符 之外&#xff0c;不存…

Unity反编译:IL2CPP 打包输出的cpp文件和dll(程序集)位置、Mono打包输出的dll(程序集)位置

目录 如题&#xff1a;IL2CPP 打包输出的cpp文件和dll位置(并不会出现在APK里) 如题&#xff1a;Mono打包输出的dll位置 校验平台&#xff1a;Android 如题&#xff1a;IL2CPP 打包输出的cpp文件和dll位置(并不会出现在APK里) Unity Assets同级目录下 Temp/StagingArea/Il2…

C# datagridView 控件使用心得

首先本人的需求是&#xff0c;通过UI编辑一个表格文件&#xff0c;然后将其存储起来。 同时也可以对其进行载入,话不多说先上图片 dataGridView1 的初始化&#xff0c;这个控件的初始化可以使用UI界面的设置&#xff0c;也可以使用程序&#xff1a; Column1 new System.Window…

开源免费的Windows应用程序强力卸载工具Bulk Crap UninstallerV5.7的简单使用

经常遇到Windows平台上安装的一些应用&#xff0c;因为应用自带的安装卸载程序有问题、应用的卸载程序损坏、应用卸载需要密码等原因&#xff0c;导致应用无法卸载、卸载不完整等。本介绍了开源的Windows应用程序强力卸载工具Bulk Crap UninstallerV5.7和安装使用的简单说明。 …

Ubuntu 搜狗输入法无法输入中文解决方案(不需要重装,不需要重启服务器)

Ubuntu 搜狗输入法突然无法输入中文&#xff0c;上午还好用&#xff0c;下午就不好用了&#xff0c;直接上解决方案 1.终端输入pidof fcitx找到搜狗的进程&#xff0c;如下图红框中的就是进程 2.直接杀掉这个进程 3.其实到第二步&#xff0c;如果搜狗输入法自动重启了&#xf…

数据库事务相关问题

1. 什么是数据库事务&#xff1f; 事务&#xff0c;由一个有限的数据库操作序列构成&#xff0c;这些操作要么全部执行,要么全部不执行&#xff0c;是一个不可分割的工作单位。 假如A转账给B 100 元&#xff0c;先从A的账户里扣除 100 元&#xff0c;再在 B 的账户上加上 100 …

力扣每日一道系列 --- LeetCode 160. 相交链表

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 LeetCode 160. 相交链表 思路&#xff1a; 首先计算两个链表的长度&#xff0c;然后判断两个链…

原生js做打地鼠游戏

抱歉素材有点难找&#xff0c;这次的学习重点是在JS的实现&#xff0c;梳理一下打地鼠的实现逻辑&#xff0c;主要分为三个主要功能函数。 开始游戏&#xff1a;对分数、并根据游戏难度对游戏的倒计时和延迟进行初始化之后&#xff0c;利用setInterval定时器Math.random随机函…

淘宝客APP源码/社交电商自营商城源码/前端基于Uniapp开发

淘宝客APP源码&#xff0c;前端基于Uniapp开发的社交电商自营商城源码。Thinkphp的后台&#xff0c;不是很标准&#xff0c;感兴趣的可以自行研究。 商城功能 1、首页基础装修&#xff1b;2、丰富选品库&#xff1b;3、淘口令解析&#xff1b;4、支持京东&#xff1b;5、支持…

python链表_递归求和_递归求最大小值

创建一个单链表&#xff1a; class LinkNode: #设置属性def __init__(self,data None):self.data dataself.next None class LinkList: #设置头结点def __init__(self):self.head LinkNode()self.head.next Nonedef CreateListR(self,a): …

CSS英文单词强制截断换行

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> <style> p.test1 {width:9em; border:1px solid #000000;word-break:keep-all; }p.…

SQL note2:DIsks and Files

目录 1、内存和磁盘 2、磁盘API 3、磁盘结构 4、访问磁盘页面 5、磁盘 vs SSD 5、磁盘空间管理 6、Files, Pages, Records 7、选择文件类型 8、堆文件 1&#xff09;链表实现 2&#xff09;页面目录实现 9、排序文件 10、关于计算标题页的注意事项 11、记录类型 …

黄金投资面对K线图有哪些好用的交易策略?

在现货黄金交易中&#xff0c;学会观察K线图能够帮助投资者进行市场分析&#xff0c;根据K线图呈现出来的市场走势制定交易策略&#xff0c;是技术分析的主要作用。在黄金买卖过程中掌握K线交易技巧能够提升理财效率&#xff0c;所以这也就成为了炒金者的必修课。 K线图是以交…

Java 算法篇-链表的经典算法:根据值删除节点、删除倒数第 n 个节点

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 链表的创建 2.0 链表的经典算法 - 根据值来删除节点 2.1 根据值来删除节点 - 遍历链表来实现 2.2 根据值来删除节点 - 递归实现 3.0 链表的经典算法 - 删除倒数第 n…

Android修行手册 - 阴影效果的几种实现以及一些特别注意点

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC &#x1f449;关于作者 专…

一本了解生成式人工智能

上周&#xff0c;发了一篇关于大语言模型图数据库技术相结合的文章&#xff0c;引起了很多朋友的兴趣。当然了&#xff0c;这项技术本身就让俺们很兴奋&#xff0c;比如我就是从事图研发的&#xff0c;当然会非常关注它在图领域的应用与相互促就啦。 纵观人类文明历史&#xff…