美文网首页Python新世界
自己开发了一款小说网站!师傅说这个项目做外包可以拿3W?

自己开发了一款小说网站!师傅说这个项目做外包可以拿3W?

作者: 919b0c54458f | 来源:发表于2018-11-26 20:39 被阅读24次

    环境搭建说明:

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

    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

    进群:548377875  即可获取惊喜大礼包哦!

    创建项目

    # 安装Web框架

    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//', index.chapter), # new

    ]

    代码实现

    from django.http import HttpResponse

    from django.shortcuts import render

    import utils.mysql_DBUtils

    from utils.mysql_DBUtils import MyPymysqlPool

    from utils.encoder import MyEncoder

    import json

    mysql = MyPymysqlPool("dbMysql")

    # 《星辰变》章节列表

    def main(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}

    return render(request, 'novel_list.html', context)

    '''

    单个章节访问

    此处 novel_id 对应 urls.py 中的

    你可以访问: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)

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

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

    context = {'novel': result}

    return render(request, 'novel.html', context)

    列表展示

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

    {% for novel in novel_list %}

  1. {{ novel.title }}
  2. {% endfor %}

    小结

    至此,一个简单的Web项目雏形已经完成,当然还有很多需要优化的地方,做成了项目,应该就能有3w快到手了!路还长,还需努力!

    相关文章

      网友评论

        本文标题:自己开发了一款小说网站!师傅说这个项目做外包可以拿3W?

        本文链接:https://www.haomeiwen.com/subject/toeiqqtx.html