利用Python如何实现一个小说网站雏形


Posted in Python onNovember 23, 2018

前言

最近做了一个爬取妹子套图的小功能,小伙伴们似乎很有兴趣,为了还特意组建了一个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://3water.com/article/109580.htm

Window 64位下python3.6.2环境搭建图文教程:https://3water.com/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 (本地下载)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python translator使用实例
Sep 06 Python
简单介绍Python的Django框架加载模版的方式
Jul 20 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
每天迁移MySQL历史数据到历史库Python脚本
Apr 13 Python
Django读取Mysql数据并显示在前端的实例
May 27 Python
python3+pyqt5+itchat微信定时发送消息的方法
Feb 20 Python
在python中实现同行输入/接收多个数据的示例
Jul 20 Python
python设计tcp数据包协议类的例子
Jul 23 Python
基于python实现学生信息管理系统
Nov 22 Python
Python常用库大全及简要说明
Jan 17 Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
Jun 14 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
Nov 23 #Python
python+selenium实现自动抢票功能实例代码
Nov 23 #Python
3分钟学会一个Python小技巧
Nov 23 #Python
值得收藏,Python 开发中的高级技巧
Nov 23 #Python
python 常见字符串与函数的用法详解
Nov 23 #Python
django+mysql的使用示例
Nov 23 #Python
Linux下Python安装完成后使用pip命令的详细教程
Nov 22 #Python
You might like
php析构函数的简单使用说明
2015/08/24 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
使用jQuery管理选择结果
2015/01/20 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
JS实现的表格行鼠标点击高亮效果代码
2015/11/27 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
详解JavaScript 的变量
2019/03/08 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
python中的函数用法入门教程
2014/09/02 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
15行Python代码带你轻松理解令牌桶算法
2018/03/21 Python
python实现对文件中图片生成带标签的txt文件方法
2018/04/27 Python
Random 在 Python 中的使用方法
2018/08/09 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
Python实现对word文档添加密码去除密码的示例代码
2020/12/29 Python
CSS3制作文字半透明倒影效果的两种实现方式
2014/08/08 HTML / CSS
先进工作者获奖感言
2014/02/08 职场文书
小学生操行评语大全
2014/04/22 职场文书
领导干部群众路线教育实践活动剖析材料
2014/10/10 职场文书
简单聊聊Golang中defer预计算参数
2022/03/25 Golang
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers