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

前言

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

相关软件

软件版本功能地址Python3.7.1脚本语言https://www.python.org/Django2.1.3Web框架https://www.djangoproject.com/PyCharm2018.2.4可视化开发工具http://www.jetbrains.com/pycharm/

环境搭建说明:

http://www.runoob.com/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=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)

恩恩 好的 这是我们免费的直播地址 正对开发两到八年的人群的

https://ke.qq.com/course/260263

报名截个图给我确认一下先  我统计一下人数然后发你往期视频资料先

列表展示

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

{% for novel in novel_list %}

    <a href="/chapter/{{novel.id}} "><li>{{ novel.title }}</li></a>

{% endfor %}

小结

至此,一个简单的Web项目雏形已经完成,当然还有很多需要优化的地方,小伙伴们可以关注从零学 Python,持续更新。

源码:https://gitee.com/52itstyle/Python/tree/master/Day06/novel

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • Web框架之Django: (1)简介: Django是一个由Python写成开源的重量级Web应用框架,采用MT...
    老肖阅读 3,053评论 0 18
  • # Awesome Python [![Awesome](https://cdn.rawgit.com/sindr...
    emily_007阅读 2,210评论 0 3
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,215评论 4 16
  • 前段时间由于工作任务大,好朋友从从北京过来待了一周时间,而自己最终也没能抽出一天的时间带着转转。高强度的工作环境和...
    王新春阅读 1,933评论 0 1
  • 路边有一大片花 黄色 我把她们全摘断扔了 一间房子那么大的花丛 我一朵一朵拔掉 路边来往的人报警吧
    毛欣与小李阅读 84评论 0 0