利用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和OpenCV库将URL转换为OpenCV格式的方法
Mar 27 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
python图像处理之镜像实现方法
May 30 Python
Python对列表中的各项进行关联详解
Aug 15 Python
numpy.linspace 生成等差数组的方法
Jul 02 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
python 通过可变参数计算n个数的乘积方法
Jun 13 Python
python basemap 画出经纬度并标定的实例
Jul 09 Python
Django中使用极验Geetest滑动验证码过程解析
Jul 31 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
Nov 15 Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 Python
基于Python爬取fofa网页端数据过程解析
Jul 13 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函数eval()介绍和使用示例
2014/08/20 PHP
ThinkPHP实现带验证码的文件上传功能实例
2014/11/01 PHP
PHP解耦的三重境界(浅谈服务容器)
2017/03/13 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
javascript函数中的arguments参数
2010/08/01 Javascript
javascript数组去掉重复
2011/05/12 Javascript
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
Python笔记之facade模式
2019/11/20 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
英国Amara家居法国网站:家居装饰,现代装饰和豪华礼品
2016/12/15 全球购物
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
广播电视新闻学专业应届生求职信
2013/10/08 职场文书
路政管理毕业自荐书范文
2014/02/10 职场文书
《兰亭集序》教学反思
2014/02/11 职场文书
庆元旦迎新年广播稿
2014/02/18 职场文书
优秀会计求职信
2014/07/04 职场文书
师德师风的心得体会
2014/09/02 职场文书
烛光里的微笑观后感
2015/06/17 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
Nginx访问日志及错误日志参数说明
2021/03/31 Servers