利用Python如何实现一个小说网站雏形
前言
最近做了一个爬取妹子套图的小功能,小伙伴们似乎很有兴趣,为了还特意组建了一个Python兴趣学习小组,来一起学习。十个python九个爬,在大家的印象中好像Python只能做爬虫。然而并非如此,Python也可以做Web开发,接下来给大家展示一下如何做一个小说站点。
下面话不多说了,来一起看看详细的介绍吧
相关软件
| 软件 | 版本 | 功能 | 地址 |
|---|---|---|---|
| Python | 3.7.1 | 脚本语言 | https://www.python.org/ |
| Django | 2.1.3 | Web框架 | https://www.djangoproject.com/ |
| PyCharm | 2018.2.4 | 可视化开发工具 | http://www.jetbrains.com/pycharm/ |
环境搭建说明:
linux下安装python3环境:https://www.nhooo.com/article/109580.htm
Window64位下python3.6.2环境搭建图文教程:https://www.nhooo.com/article/147707.htm
爬取数据
做一个小说网站,内容是必须的,首先我们爬取一本小说《星辰变》到数据库。
创建一个简单的数据库表:
CREATETABLE`novel`( `id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'自增主键', `title`varchar(100)NOTNULLCOMMENT'标题', `content`textNOTNULLCOMMENT'内容', PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8
安装数据库驱动以及连接池:
#数据库驱动 pipinstallpymysql #数据库连接池 pipinstallDBUtils
代码实现:
#-*-coding:UTF-8-*-
#导入requests库
importrequests
#导入文件操作库
importcodecs
frombs4importBeautifulSoup
importsys
importmysql_DBUtils
frommysql_DBUtilsimportMyPymysqlPool
importimportlib
importlib.reload(sys)
#给请求指定一个请求头来模拟chrome浏览器
headers={
'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/54.0.2840.99Safari/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="INSERTINTOnovel(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()
更多代码详见:
https://gitee.com/52itstyle/Python/tree/master/Day04
Web实现
Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的框架模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。
Django框架的核心组件有:
- 用于创建模型的对象关系映射
- 为最终用户设计的完美管理界面
- 一流的URL设计
- 设计者友好的模板语言
- 缓存系统
创建项目
pipinstallDjango #创建一个项目 pythondjango-admin.pystartprojectitstyle #切换目录 cditstyle #创建App pythonmanage.pystartappnovel
一般一个项目有多个app,当然通用的app也可以在多个项目中使用,然后启动服务:
#默认端口是8000 pythonmanage.pyrunserver
如果提示端口被占用,可以用其它端口:
pythonmanage.pyrunserver8001
项目结构
最终代码,如下:
│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
fromdjango.conf.urlsimporturl
fromdjango.urlsimportpath
fromviewimportindex
urlpatterns=[
#《星辰变》首页List
path('',index.main),#new
#章节页面正则匹配
path('chapter//',index.chapter),#new
]
代码实现:
fromdjango.httpimportHttpResponse
fromdjango.shortcutsimportrender
fromutils.mysql_DBUtilsimportmysql
#《星辰变》章节列表
defmain(request):
sql="SELECTid,titleFROMnovelLIMIT10;"
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)
#defchapter(request):
#id=request.GET['id']
#sql="SELECTcontentFROMnovelwhereid=%(id)s;"
#param={"id":id}
#result=mysql.getOne(sql,param)
#context={'novel':result}
#returnrender(request,'novel.html',context)
'''
单个章节
此处novel_id对应urls.py中的
你可以访问:http://localhost:8000/chapter/1/
'''
defchapter(request,novel_id):
sql="SELECTtitle,contentFROMnovelwhereid=%(id)s;"
param={"id":novel_id}
result=mysql.getOne(sql,param)
context={'novel':result}
returnrender(request,'novel.html',context)
列表展示
基于后端返回的数据,在前台进行展示,这里你可以把它想象成Java中的Struts2标签或者JSTL标签,当然也有点Vue的意思:
{%fornovelinnovel_list%}
{{novel.title}}
{%endfor%}
小结
至此,一个简单的Web项目雏形已经完成,当然还有很多需要优化的地方,小伙伴们可以关注从零学Python,持续更新。
源码:https://gitee.com/52itstyle/Python/tree/master/Day06/novel(本地下载)
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。