100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > python 小说 小说_我用Python实现了一个小说网站雏形

python 小说 小说_我用Python实现了一个小说网站雏形

时间:2022-12-29 22:05:04

相关推荐

python 小说 小说_我用Python实现了一个小说网站雏形

前言

前段时间做了一个爬取妹子套图的小功能,小伙伴们似乎很有兴趣,为了还特意组建了一个Python兴趣学习小组,来一起学习。十个python九个爬,在大家的印象中好像Python只能做爬虫。然而并非如此,Python 也可以做Web开发,接下来给大家展示一下如何做一个小说站点。

相关软件

软件

版本

功能

地址

Python

3.7.1

脚本语言

/

Django

2.1.3

Web框架

/

PyCharm

.2.4

可视化开发工具

/pycharm/

环境搭建说明:

/python3/python3-install.html

爬取数据

做一个小说网站,内容是必须的,首先我们爬取一本小说《星辰变》到数据库。

创建一个简单的数据库表:

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=InnoDBAUTO_INCREMENT=1DEFAULT CHARSET=utf8

安装数据库驱动以及连接池:

# 数据库驱动

pip install pymysql

# 数据库连接池

pip installDBUtils

代码实现:

# -*- coding: UTF-8 -*-

# 导入requests库

importrequests

# 导入文件操作库

importcodecs

frombs4importBeautifulSoup

importsys

importmysql_DBUtils

frommysql_DBUtilsimportMyPymysqlPool

importimportlib

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")

# 获取章节内容

defget_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')

returncontent

# 写入数据库

defwrite_db(chapter, content):

sql ="INSERT INTO novel (title, content) VALUES(%(title)s, %(content)s);"

param = {"title": chapter,"content": content}

mysql.insert(sql, param)

# 主方法

defmain():

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))

foreachina:

try:

chapter = server + each.get('href')

content = get_contents(chapter)

chapter = each.string

write_db(chapter, content)

exceptExceptionase:

print(e)

mysql.dispose()

if__name__ =='__main__':

main()

更多代码详见:

/52itstyle/Python/tree/master/Day04

创建Web

Django 是一个开放源代码的Web应用框架,由 Python 写成。采用了 MVC 的框架模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。

Django 框架的核心组件有:

用于创建模型的对象关系映射

为最终用户设计的完美管理界面

一流的 URL 设计

设计者友好的模板语言

缓存系统。

创建项目

# 安装Web框架

pip installDjango

# 创建一个项目

python django-admin.py startproject itstyle

# 切换目录

cd itstyle

# 创建App

python manage.py startapp novel

一般一个项目有多个app, 当然通用的app也可以在多个项目中使用,然后启动服务:

# 默认端口是8000

python manage.py runserver

如果提示端口被占用,可以用其它端口:

python manage.py runserver8001

项目结构

最终代码,如下:

│ manage.py

├─novel

│ │ settings.py# 基础配置

│ │ urls.py# URL映射

│ │ wsgi.py

│ │ __init__.py

│ │

├─templates# 相关页面

│ novel.html# 章节

│ novel_list.html# 小说首页

├─utils

│ │ f# 数据库配置参数

│ │ encoder.py# 编码类

│ │ mysql_DBUtils.py# 数据库连接池

└─view

│ index.py# 后台业务

要点备注

RESTful 风格

控制器urls.py

fromdjango.conf.urlsimporturl

fromdjango.urlsimportpath

fromviewimportindex

urlpatterns = [

# 《星辰变》首页List

path('', index.main),# new

# 章节页面 正则匹配

path('chapter//', index.chapter),# new

]

代码实现

fromdjango.httpimportHttpResponse

fromdjango.shortcutsimportrender

importutils.mysql_DBUtils

fromutils.mysql_DBUtilsimportMyPymysqlPool

fromutils.encoderimportMyEncoder

importjson

mysql =MyPymysqlPool("dbMysql")

# 《星辰变》章节列表

defmain(request):

# 这里读取10条,待优化分页

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}

returnrender(request,'novel_list.html', context)

'''

单个章节访问

此处 novel_id 对应 urls.py 中的

你可以访问:http://localhost:8000/chapter/1/

'''

defchapter(request, novel_id):

sql ="SELECT title,content FROM novel where id = %(id)s;"

param = {"id": novel_id}

result = mysql.getOne(sql, param)

result['title'] = result['title'].decode('utf-8')

result['content'] = result['content'].decode('utf-8')

context = {'novel': result}

returnrender(request,'novel.html', context)

列表展示

基于后端返回的数据,在前台进行展示,这里你可以把它想象成Java中的Struts2标签或者JSTL标签,当然也有点Vue的意思:

{%fornovelinnovel_list %}

{{ novel.title }}

{% endfor %}

小结

至此,一个简单的Web项目雏形已经完成,当然还有很多需要优化的地方,阅读原文,关注小编的码云,持续更新。

往期

精彩回顾

点击图片查看更多推荐内容

↓↓↓

我用Python爬取了妹子网100G的套图

Python学习爬取你的第一张图片

温馨提示

如果你喜欢本文,觉得对周围的小伙伴有所帮助,请分享到朋友圈,你的支持就是小编最大的动力!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。