您好,登錄后才能下訂單哦!
前言
最近做了一個(gè)爬取妹子套圖的小功能,小伙伴們似乎很有興趣,為了還特意組建了一個(gè)Python興趣學(xué)習(xí)小組,來一起學(xué)習(xí)。十個(gè)python九個(gè)爬,在大家的印象中好像Python只能做爬蟲。然而并非如此,Python 也可以做Web開發(fā),接下來給大家展示一下如何做一個(gè)小說站點(diǎn)。
下面話不多說了,來一起看看詳細(xì)的介紹吧
相關(guān)軟件
軟件 | 版本 | 功能 | 地址 |
---|---|---|---|
Python | 3.7.1 | 腳本語言 | https://www.python.org/ |
Django | 2.1.3 | Web框架 | https://www.djangoproject.com/ |
PyCharm | 2018.2.4 | 可視化開發(fā)工具 | http://www.jetbrains.com/pycharm/ |
環(huán)境搭建說明:
linux下安裝python3環(huán)境:https://www.jb51.net/article/109580.htm
Window 64位下python3.6.2環(huán)境搭建圖文教程:https://www.jb51.net/article/147707.htm
爬取數(shù)據(jù)
做一個(gè)小說網(wǎng)站,內(nèi)容是必須的,首先我們爬取一本小說《星辰變》到數(shù)據(jù)庫。
創(chuàng)建一個(gè)簡單的數(shù)據(jù)庫表:
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ù)庫驅(qū)動(dòng)以及連接池:
# 數(shù)據(jù)庫驅(qū)動(dòng) pip install pymysql # 數(shù)據(jù)庫連接池 pip install DBUtils
代碼實(shí)現(xiàn):
# -*- coding: UTF-8 -*- # 導(dǎo)入requests庫 import requests # 導(dǎo)入文件操作庫 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)求頭來模擬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ù)庫 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ā)來用于管理勞倫斯出版集團(tuán)旗下的一些以新聞內(nèi)容為主的網(wǎng)站的,即是CMS(內(nèi)容管理系統(tǒng))軟件。
Django 框架的核心組件有:
創(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)頁面
│ novel.html # 章節(jié)
│ novel_list.html # 小說首頁
├─utils
│ │ dbMysqlConfig.cnf # 數(shù)據(jù)庫配置參數(shù)
│ │ encoder.py # 編碼類
│ │ mysql_DBUtils.py # 數(shù)據(jù)庫連接池
└─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 = [ # 《星辰變》首頁List path('', index.main), # new # 章節(jié)頁面 正則匹配 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> 你可以訪問: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)
列表展示
基于后端返回的數(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}} " rel="external nofollow" ><li>{{ novel.title }}</li></a> {% endfor %}
小結(jié)
至此,一個(gè)簡單的Web項(xiàng)目雛形已經(jīng)完成,當(dāng)然還有很多需要優(yōu)化的地方,小伙伴們可以關(guān)注從零學(xué) Python,持續(xù)更新。
源碼:https://gitee.com/52itstyle/Python/tree/master/Day06/novel (本地下載)
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。