我用Python實(shí)現(xiàn)了一個(gè)小說(shuō)網(wǎng)站雛形

前言

前段時(shí)間做了一個(gè)爬取妹子套圖的小功能岳颇,小伙伴們似乎很有興趣投放,為了還特意組建了一個(gè)Python興趣學(xué)習(xí)小組,來(lái)一起學(xué)習(xí)疾棵。十個(gè)python九個(gè)爬,在大家的印象中好像Python只能做爬蟲痹仙。然而并非如此是尔,Python 也可以做Web開發(fā),接下來(lái)給大家展示一下如何做一個(gè)小說(shuō)站點(diǎn)开仰。

相關(guān)軟件

軟件版本功能地址Python3.7.1腳本語(yǔ)言https://www.python.org/Django2.1.3Web框架https://www.djangoproject.com/PyCharm2018.2.4可視化開發(fā)工具http://www.jetbrains.com/pycharm/

環(huán)境搭建說(shuō)明:

http://www.runoob.com/python3/python3-install.html

爬取數(shù)據(jù)

做一個(gè)小說(shuō)網(wǎng)站拟枚,內(nèi)容是必須的,首先我們爬取一本小說(shuō)《星辰變》到數(shù)據(jù)庫(kù)众弓。

創(chuàng)建一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)表:

CREATE TABLE `novel` (

? `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',

? `title` varchar(100) NOT NULL COMMENT '標(biāo)題',

? `content` text NOT NULL COMMENT '內(nèi)容',

? PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

安裝數(shù)據(jù)庫(kù)驅(qū)動(dòng)以及連接池:

# 數(shù)據(jù)庫(kù)驅(qū)動(dòng)

pip install pymysql

# 數(shù)據(jù)庫(kù)連接池

pip install DBUtils

代碼實(shí)現(xiàn):

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

# 導(dǎo)入requests庫(kù)

import requests

# 導(dǎo)入文件操作庫(kù)

import codecs

from bs4 import BeautifulSoup

import sys

import mysql_DBUtils

from mysql_DBUtils import MyPymysqlPool

import importlib

importlib.reload(sys)

# 給請(qǐng)求指定一個(gè)請(qǐng)求頭來(lái)模擬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")

# 獲取章節(jié)內(nèi)容

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標(biāo)簽id屬性content的內(nèi)容 \xa0 是不間斷空白符  

? ? content = texts[0].text.replace('\xa0' * 4, '\n')

? ? return content

# 寫入數(shù)據(jù)庫(kù)

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

? ? # 獲取所有的章節(jié)

? ? a = soup.find('div', id='list').find_all('a')

? ? print('總章節(jié)數(shù): %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實(shí)現(xiàn)

Django 是一個(gè)開放源代碼的Web應(yīng)用框架恩溅,由 Python 寫成。采用了 MVC 的框架模式谓娃,即模型M脚乡,視圖V和控制器C。它最初是被開發(fā)來(lái)用于管理勞倫斯出版集團(tuán)旗下的一些以新聞內(nèi)容為主的網(wǎng)站的滨达,即是CMS(內(nèi)容管理系統(tǒng))軟件每窖。

Django 框架的核心組件有:

用于創(chuàng)建模型的對(duì)象關(guān)系映射

為最終用戶設(shè)計(jì)的完美管理界面

一流的 URL 設(shè)計(jì)

設(shè)計(jì)者友好的模板語(yǔ)言

緩存系統(tǒng)

創(chuàng)建項(xiàng)目

pip install Django

# 創(chuàng)建一個(gè)項(xiàng)目

python? django-admin.py startproject itstyle

# 切換目錄

cd itstyle

# 創(chuàng)建App

python manage.py startapp novel

一般一個(gè)項(xiàng)目有多個(gè)app, 當(dāng)然通用的app也可以在多個(gè)項(xiàng)目中使用,然后啟動(dòng)服務(wù):

# 默認(rèn)端口是8000

python manage.py runserver

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

python manage.py runserver 8001

項(xiàng)目結(jié)構(gòu)

最終代碼窒典,如下:

│? manage.py

│?

├─novel

│? │? settings.py? # 基礎(chǔ)配置

│? │? urls.py? ? # URL映射

│? │? wsgi.py

│? │? __init__.py

│? │?

│? ? ? ? ?

├─templates? ? ? ? ? ? # 相關(guān)頁(yè)面

│? ? ? novel.html? ? ? ? # 章節(jié)

│? ? ? novel_list.html? ? # 小說(shuō)首頁(yè)

├─utils

│? │? dbMysqlConfig.cnf? ? # 數(shù)據(jù)庫(kù)配置參數(shù)

│? │? encoder.py? ? ? ? ? # 編碼類

│? │? mysql_DBUtils.py? ? ? # 數(shù)據(jù)庫(kù)連接池

└─view

? ? │? index.py? # 后臺(tái)業(yè)務(wù)

要點(diǎn)備注

RESTful 風(fēng)格

控制器 urls.py

from django.conf.urls import url

from django.urls import path

from view import index

urlpatterns = [

? ? # 《星辰變》首頁(yè)List

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

? ? # 章節(jié)頁(yè)面 正則匹配

? ? path('chapter/<int:novel_id>/', index.chapter),? ? # new

]

代碼實(shí)現(xiàn):

from django.http import HttpResponse

from django.shortcuts import render

from utils.mysql_DBUtils import mysql

# 《星辰變》章節(jié)列表

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)

'''

單個(gè)章節(jié)

此處 novel_id 對(duì)應(yīng) urls.py 中的 <int:novel_id>

你可以訪問(wèn):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)

恩恩 好的 這是我們免費(fèi)的直播地址 正對(duì)開發(fā)兩到八年的人群的

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

報(bào)名截個(gè)圖給我確認(rèn)一下先? 我統(tǒng)計(jì)一下人數(shù)然后發(fā)你往期視頻資料先

列表展示

基于后端返回的數(shù)據(jù),在前臺(tái)進(jìn)行展示稽莉,這里你可以把它想象成Java中的Struts2標(biāo)簽或者JSTL標(biāo)簽瀑志,當(dāng)然也有點(diǎn)Vue的意思:

{% for novel in novel_list %}

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

{% endfor %}

小結(jié)

至此,一個(gè)簡(jiǎn)單的Web項(xiàng)目雛形已經(jīng)完成污秆,當(dāng)然還有很多需要優(yōu)化的地方劈猪,小伙伴們可以關(guān)注從零學(xué) Python,持續(xù)更新良拼。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末战得,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子庸推,更是在濱河造成了極大的恐慌常侦,老刑警劉巖浇冰,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異聋亡,居然都是意外死亡肘习,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門坡倔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)漂佩,“玉大人,你說(shuō)我怎么就攤上這事罪塔⊥恫酰” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵征堪,是天一觀的道長(zhǎng)瘩缆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)请契,這世上最難降的妖魔是什么咳榜? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任夏醉,我火速辦了婚禮爽锥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘畔柔。我一直安慰自己氯夷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布靶擦。 她就那樣靜靜地躺著腮考,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玄捕。 梳的紋絲不亂的頭發(fā)上踩蔚,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音枚粘,去河邊找鬼馅闽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛馍迄,可吹牛的內(nèi)容都是我干的福也。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼攀圈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼暴凑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起赘来,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤现喳,失蹤者是張志新(化名)和其女友劉穎凯傲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拿穴,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泣洞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了默色。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片球凰。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖腿宰,靈堂內(nèi)的尸體忽然破棺而出呕诉,到底是詐尸還是另有隱情,我是刑警寧澤吃度,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布甩挫,位于F島的核電站,受9級(jí)特大地震影響椿每,放射性物質(zhì)發(fā)生泄漏伊者。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一间护、第九天 我趴在偏房一處隱蔽的房頂上張望亦渗。 院中可真熱鬧,春花似錦汁尺、人聲如沸法精。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)搂蜓。三九已至,卻和暖如春辽装,著一層夾襖步出監(jiān)牢的瞬間帮碰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工拾积, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留殉挽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓殷勘,卻偏偏與公主長(zhǎng)得像此再,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玲销,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容