前言
前段时间做了一个爬取妹子套图的小功能,小伙伴们似乎很有兴趣,为了还特意组建了一个Python兴趣学习小组,来一起学习。十个python九个爬,在大家的印象中好像Python只能做爬虫。然而并非如此,Python 也可以做Web开发,接下来给大家展示一下如何做一个小说站点。
相关软件
软件
版本
功能
地址
Python
3.7.1
脚本语言
/
Django
2.1.3
Web框架
/
PyCharm
.2.4
可视化开发工具
/pycharm/
环境搭建说明:
/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=InnoDBAUTO_INCREMENT=1DEFAULT CHARSET=utf8
安装数据库驱动以及连接池:
# 数据库驱动
pip install pymysql
# 数据库连接池
pip installDBUtils
代码实现:
# -*- coding: UTF-8 -*-
# 导入requests库
importrequests
# 导入文件操作库
importcodecs
frombs4importBeautifulSoup
importsys
importmysql_DBUtils
frommysql_DBUtilsimportMyPymysqlPool
importimportlib
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")
# 获取章节内容
defget_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')
returncontent
# 写入数据库
defwrite_db(chapter, content):
sql ="INSERT INTO novel (title, content) VALUES(%(title)s, %(content)s);"
param = {"title": chapter,"content": content}
mysql.insert(sql, param)
# 主方法
defmain():
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))
foreachina:
try:
chapter = server + each.get('href')
content = get_contents(chapter)
chapter = each.string
write_db(chapter, content)
exceptExceptionase:
print(e)
mysql.dispose()
if__name__ =='__main__':
main()
更多代码详见:
/52itstyle/Python/tree/master/Day04
创建Web
Django 是一个开放源代码的Web应用框架,由 Python 写成。采用了 MVC 的框架模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。
Django 框架的核心组件有:
用于创建模型的对象关系映射
为最终用户设计的完美管理界面
一流的 URL 设计
设计者友好的模板语言
缓存系统。
创建项目
# 安装Web框架
pip installDjango
# 创建一个项目
python django-admin.py startproject itstyle
# 切换目录
cd itstyle
# 创建App
python manage.py startapp novel
一般一个项目有多个app, 当然通用的app也可以在多个项目中使用,然后启动服务:
# 默认端口是8000
python manage.py runserver
如果提示端口被占用,可以用其它端口:
python manage.py runserver8001
项目结构
最终代码,如下:
│ manage.py
│
├─novel
│ │ settings.py# 基础配置
│ │ urls.py# URL映射
│ │ wsgi.py
│ │ __init__.py
│ │
│
├─templates# 相关页面
│ novel.html# 章节
│ novel_list.html# 小说首页
│
├─utils
│ │ f# 数据库配置参数
│ │ encoder.py# 编码类
│ │ mysql_DBUtils.py# 数据库连接池
│
└─view
│ index.py# 后台业务
要点备注
RESTful 风格
控制器urls.py
fromdjango.conf.urlsimporturl
fromdjango.urlsimportpath
fromviewimportindex
urlpatterns = [
# 《星辰变》首页List
path('', index.main),# new
# 章节页面 正则匹配
path('chapter//', index.chapter),# new
]
代码实现
fromdjango.httpimportHttpResponse
fromdjango.shortcutsimportrender
importutils.mysql_DBUtils
fromutils.mysql_DBUtilsimportMyPymysqlPool
fromutils.encoderimportMyEncoder
importjson
mysql =MyPymysqlPool("dbMysql")
# 《星辰变》章节列表
defmain(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}
returnrender(request,'novel_list.html', context)
'''
单个章节访问
此处 novel_id 对应 urls.py 中的
你可以访问:http://localhost:8000/chapter/1/
'''
defchapter(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}
returnrender(request,'novel.html', context)
列表展示
基于后端返回的数据,在前台进行展示,这里你可以把它想象成Java中的Struts2标签或者JSTL标签,当然也有点Vue的意思:
{%fornovelinnovel_list %}
{{ novel.title }}
{% endfor %}
小结
至此,一个简单的Web项目雏形已经完成,当然还有很多需要优化的地方,阅读原文,关注小编的码云,持续更新。
往期
精彩回顾
点击图片查看更多推荐内容
↓↓↓
我用Python爬取了妹子网100G的套图
Python学习爬取你的第一张图片
温馨提示
如果你喜欢本文,觉得对周围的小伙伴有所帮助,请分享到朋友圈,你的支持就是小编最大的动力!