我用Python實現了一個小說網站雛形

Java技術分享師發表於2018-11-25

前言

前段時間做了一個爬取妹子套圖的小功能,小夥伴們似乎很有興趣,為了還特意組建了一個Python興趣學習小組,來一起學習。十個python九個爬,在大家的印象中好像Python只能做爬蟲。然而並非如此,Python 也可以做Web開發,接下來給大家展示一下如何做一個小說站點。

相關軟體

軟體版本功能地址Python3.7.1指令碼語言www.python.org/Django2.1.3Web框架www.djangoproject.com/PyCharm2018.2.4視覺化開發工具www.jetbrains.com/pycharm/
環境搭建說明:

爬取資料

做一個小說網站,內容是必須的,首先我們爬取一本小說《星辰變》到資料庫。
建立一個簡單的資料庫表:
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()複製程式碼
更多程式碼詳見:

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}} "><li>{{ novel.title }}</li></a>
{% endfor %}複製程式碼

小結

加2643804531樂樂老師為好友,她會發以往資料給您,及時發課題給您哦 

611481448,這是我們的群號,如果您有什麼問題可以在群內諮詢

至此,一個簡單的Web專案雛形已經完成,當然還有很多需要優化的地方,小夥伴們可以關注從零學 Python,持續更新。


相關文章