利用Python如何实现一个小说网站雏形
作者:小柒2012 发布时间:2023-09-22 05:52:07
前言
最近做了一个爬取妹子套图的小功能,小伙伴们似乎很有兴趣,为了还特意组建了一个Python兴趣学习小组,来一起学习。十个python九个爬,在大家的印象中好像Python只能做爬虫。然而并非如此,Python 也可以做Web开发,接下来给大家展示一下如何做一个小说站点。
下面话不多说了,来一起看看详细的介绍吧
相关软件
软件 | 版本 | 功能 | 地址 |
---|---|---|---|
Python | 3.7.1 | 脚本语言 | https://www.python.org/ |
Django | 2.1.3 | Web框架 | https://www.djangoproject.com/ |
PyCharm | 2018.2.4 | 可视化开发工具 | http://www.jetbrains.com/pycharm/ |
环境搭建说明:
linux下安装python3环境:https://www.jb51.net/article/109580.htm
Window 64位下python3.6.2环境搭建图文教程:https://www.jb51.net/article/147707.htm
爬取数据
做一个小说网站,内容是必须的,首先我们爬取一本小说《星辰变》到数据库。
创建一个简单的数据库表:
CREATE TABLE `novel` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`title` varchar(100) NOT NULL COMMENT '标题',
`content` text NOT NULL COMMENT '内容',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
安装数据库驱动以及连接池:
# 数据库驱动
pip install pymysql
# 数据库连接池
pip install DBUtils
代码实现:
# -*- coding: UTF-8 -*-
# 导入requests库
import requests
# 导入文件操作库
import codecs
from bs4 import BeautifulSoup
import sys
import mysql_DBUtils
from mysql_DBUtils import MyPymysqlPool
import importlib
importlib.reload(sys)
# 给请求指定一个请求头来模拟chrome浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}
server = 'http://www.biquge.cm'
# 星辰变地址
book = 'http://www.biquge.cm/2/2042/'
# 定义DB
mysql = MyPymysqlPool("dbMysql")
# 获取章节内容
def get_contents(chapter):
req = requests.get(url=chapter)
html = req.content
html_doc = str(html, 'gbk')
bf = BeautifulSoup(html_doc, 'html.parser')
texts = bf.find_all('div', id="content")
# 获取div标签id属性content的内容 \xa0 是不间断空白符
content = texts[0].text.replace('\xa0' * 4, '\n')
return content
# 写入数据库
def write_db(chapter, content):
sql = "INSERT INTO novel (title, content) VALUES(%(title)s, %(content)s);"
param = {"title": chapter, "content": content}
mysql.insert(sql, param)
# 主方法
def main():
res = requests.get(book, headers=headers)
html = res.content
html_doc = str(html, 'gbk')
# 使用自带的html.parser解析
soup = BeautifulSoup(html_doc, 'html.parser')
# 获取所有的章节
a = soup.find('div', id='list').find_all('a')
print('总章节数: %d ' % len(a))
for each in a:
try:
chapter = server + each.get('href')
content = get_contents(chapter)
chapter = each.string
write_db(chapter, content)
except Exception as e:
print(e)
mysql.dispose()
if __name__ == '__main__':
main()
更多代码详见:
https://gitee.com/52itstyle/Python/tree/master/Day04
Web实现
Django 是一个开放源代码的Web应用框架,由 Python 写成。采用了 MVC 的框架模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。
Django 框架的核心组件有:
用于创建模型的对象关系映射
为最终用户设计的完美管理界面
一流的 URL 设计
设计者友好的模板语言
缓存系统
创建项目
pip install Django
# 创建一个项目
python django-admin.py startproject itstyle
# 切换目录
cd itstyle
# 创建App
python manage.py startapp novel
一般一个项目有多个app, 当然通用的app也可以在多个项目中使用,然后启动服务:
# 默认端口是8000
python manage.py runserver
如果提示端口被占用,可以用其它端口:
python manage.py runserver 8001
项目结构
最终代码,如下:
│ manage.py
│
├─novel│ │ settings.py # 基础配置
│ │ urls.py # URL映射
│ │ wsgi.py
│ │ __init__.py
│ │
│
├─templates # 相关页面
│ novel.html # 章节
│ novel_list.html # 小说首页
├─utils
│ │ dbMysqlConfig.cnf # 数据库配置参数
│ │ encoder.py # 编码类
│ │ mysql_DBUtils.py # 数据库连接池
└─view
│ index.py # 后台业务
要点备注
RESTful 风格
控制器 urls.py
from django.conf.urls import url
from django.urls import path
from view import index
urlpatterns = [
# 《星辰变》首页List
path('', index.main), # new
# 章节页面 正则匹配
path('chapter/<int:novel_id>/', index.chapter), # new
]
代码实现:
from django.http import HttpResponse
from django.shortcuts import render
from utils.mysql_DBUtils import mysql
# 《星辰变》章节列表
def main(request):
sql = "SELECT id,title FROM novel LIMIT 10;"
result = mysql.getAll(sql)
# result = json.dumps(result, cls=MyEncoder, ensure_ascii=False, indent=4)
# result = json.loads(result)
context = {'novel_list': result}
return render(request, 'novel_list.html', context)
# def chapter(request):
# id = request.GET['id']
# sql = "SELECT content FROM novel where id = %(id)s;"
# param = {"id": id}
# result = mysql.getOne(sql, param)
# context = {'novel': result}
# return render(request, 'novel.html', context)
'''
单个章节
此处 novel_id 对应 urls.py 中的 <int:novel_id>
你可以访问:http://localhost:8000/chapter/1/
'''
def chapter(request, novel_id):
sql = "SELECT title,content FROM novel where id = %(id)s;"
param = {"id": novel_id}
result = mysql.getOne(sql, param)
context = {'novel': result}
return render(request, 'novel.html', context)
列表展示
基于后端返回的数据,在前台进行展示,这里你可以把它想象成Java中的Struts2标签或者JSTL标签,当然也有点Vue的意思:
{% for novel in novel_list %}
<a href="/chapter/{{novel.id}} " rel="external nofollow" ><li>{{ novel.title }}</li></a>
{% endfor %}
小结
至此,一个简单的Web项目雏形已经完成,当然还有很多需要优化的地方,小伙伴们可以关注从零学 Python,持续更新。
源码:https://gitee.com/52itstyle/Python/tree/master/Day06/novel (本地下载)
来源:https://www.cnblogs.com/smallSevens/p/10006986.html


猜你喜欢
- 项目中使用的日志库是使用python官方库logging封装的,但是居然一直么有设置日志自动滚动,经常会受到告警说哪台机器磁盘空间又满,清理
- MySQL是一个多线程的,结构化查询语言(SQL)数据库服务器。SQL在世界上是最流行的数据库语言。MySQL的执行性能非常高,运行速度非常
- 数据库索引是一个数据结构,提高操作的速度,在一个表中可以使用一个或多个列,提供两个快速随机查找和高效的顺序访问记录的基础创建索引。在创建索引
- 下面就来介绍下SQL Server 2008中使用的端口有哪些:首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果我们要远程
- 前言:最近正在将一个使用单文件组件的 Options API 的 Vue2 JavaScript 项目升级为 Vue3 typescript
- 问题描述大家都知道, MySQL 中按某字段升序排列的 SQL 为 (以 id 为例,下同):SELECT * FROM `MyTable`
- 目标在本节中,将学习根据立体图像创建深度图基础在上一节中,看到了对极约束和其他相关术语等基本概念。如果有两个场景相同的图像,则可以通过直观的
- ①差集方法一:if __name__ == '__main__':a_list = [{'a' : 1},
- 1.世界地图绘制演示先给大家看下效果图哈。① 世界地图数据准备地图数据如下:因为是世界地图,所以对标的国家,我设置了 2 组,里面的数据是随
- php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一
- 本文实例讲述了Python实现快速排序的方法。分享给大家供大家参考,具体如下:说起快排的Python实现,首先谈一下,快速排序的思路:1、取
- 1、半开放socket利用shutdown()函数使socket双向数据传输变为单向数据传输。shutdown()需要一个单独的参数,该参数
- 前言:随着移动端的普及出现了很多的移动 APP,应用软件也随之流行起来。最近又捡起来了英雄联盟手游,感觉还行,PC 端英雄联盟可谓是爆火的游
- 前言最近在完成软件体系结构上机实验时,遇到一个有点点小难度的选做题,题目信息如下:利用套接字技术实现应用程序中对数据库的访问。应用程序只是利
- 本文实例讲述了Python使用sorted排序的方法。分享给大家供大家参考,具体如下:# 例1. 按照元素出现的次数来排序seq = [2,
- 表单校验是页面开发中非常常见的一类需求,相信每个前端开发人员都有这方面的经验。网上有很多成熟的表单校验框架,虽然按照它们默认的设计,用起来没
- 本文介绍基于Python中seaborn模块,实现联合分布图绘制的方法。联合分布(Joint Distribution)图是一种查看两个或两
- 数据准备ON DUPLICATE KEY UPDATEinsert into test_table(id,username)VALUES(4
- 是否了解线程的同步和异步?线程同步:多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低线程异步:在访问资源时在空闲等待时同时访问其
- 推箱子游戏是老游戏了, 网上有各种各样的版本, 说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例;如下是效果图:这个拖箱子游戏做了移