加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

自己开发了一款小说网站!师傅说这个项目做外包可以拿3W?

发布时间:2020-12-17 00:33:54 所属栏目:Python 来源:网络整理
导读:环境搭建说明: http://www.runoob.com/python3/python3-install.html 爬取数据 做一个小说网站,内容是必须的,首先我们爬取一本小说《星辰变》到数据库。 创建一个简单的数据库表: CREATE TABLE `novel` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT

环境搭建说明:

http://www.runoob.com/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=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,'
')
 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()

更多代码详见:

https://gitee.com/52itstyle/Python/tree/master/Day04

进群:548377875? 即可获取惊喜大礼包哦!

创建项目

# 安装Web框架 
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//',index.chapter),# new
]

代码实现

from django.http import HttpResponse
from django.shortcuts import render
import utils.mysql_DBUtils
from utils.mysql_DBUtils import MyPymysqlPool
from utils.encoder import MyEncoder
import json
mysql = MyPymysqlPool("dbMysql")
# 《星辰变》章节列表
def main(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}
 return render(request,'novel_list.html',context)
'''
单个章节访问
此处 novel_id 对应 urls.py 中的 
你可以访问: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)
 result['title'] = result['title'].decode('utf-8')
 result['content'] = result['content'].decode('utf-8')
 context = {'novel': result}
 return render(request,'novel.html',context)

列表展示

基于后端返回的数据,在前台进行展示,这里你可以把它想象成Java中的Struts2标签或者JSTL标签,当然也有点Vue的意思:

{% for novel in novel_list %}
 {{ novel.title }}
{% endfor %}

小结

至此,一个简单的Web项目雏形已经完成,当然还有很多需要优化的地方,做成了项目,应该就能有3w快到手了!路还长,还需努力!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读