利用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实现一个简单的线程池
Apr 07 Python
Python检测生僻字的实现方法
Oct 23 Python
Python解惑之整数比较详解
Apr 24 Python
Python实现识别手写数字 Python图片读入与处理
Mar 23 Python
tensorflow更改变量的值实例
Jul 30 Python
Python使用jsonpath-rw模块处理Json对象操作示例
Jul 31 Python
Python CSV文件模块的使用案例分析
Dec 21 Python
Python制作简易版小工具之计算天数的实现思路
Feb 13 Python
python实现低通滤波器代码
Feb 26 Python
利用Python发送邮件或发带附件的邮件
Nov 12 Python
matplotlib之多边形选区(PolygonSelector)的使用
Feb 24 Python
Python 数据可视化之Seaborn详解
Nov 02 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
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
如何将数据从文本导入到mysql
2006/10/09 PHP
第四节--构造函数和析构函数
2006/11/16 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
php无限遍历文件夹示例分享
2014/03/04 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
PHP7 windows支持
2021/03/09 PHP
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
jquery mobile实现拨打电话功能的几种方法
2013/08/05 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
jQuery中$原理实例分析
2018/08/13 jQuery
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
Python最长公共子串算法实例
2015/03/07 Python
Python缩进和冒号详解
2016/06/01 Python
Python实现图片拼接的代码
2018/07/02 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
python-视频分帧&amp;多帧合成视频实例
2019/12/10 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
高性能装备提升营地:Kammok
2019/02/27 全球购物
网络技术支持面试题
2013/04/22 面试题
12岁生日感言
2014/01/21 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
详解Python中的进程和线程
2021/06/23 Python
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS