关于记录一些报错问题
1.SyntaxError: Non-ASCII character 'xe9' in file /Users/macbook/Desktop/back_end/test.py on line 18, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details 解析原因: SyntaxError: Non-ASCII character 'xe9' in file意思是说,在文件中存在非ASCII字符; ASCII是8位即一个字符,一共256个字符,随着计算机的发展,现在已经用到2个或者4个字符; 最重要的原因就是文件中有中文 解决办法: 文件头部填入:
代码语言:javascript复制# -*- coding: cp936 -*-
或者
# -*- coding: utf-8 -*
2.用python request腾讯新闻网的内容 报错:('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer')) 分析: 之前我的Homebrew不太合适,换了一下,然后可能把OpenSSL没有重装,重装测试之后还是不行,既然不是这里的问题,那应该就是其他地方的问题,于是最后找了好久,给我另一个(项目正在使用的Python版本)安装了三个库,于是测试成功了,这里就很开心。 解决: 在安装requests库时,它会跳过一些SSL/Https连接所需的可选安全包('pyOpenSSL','ndg-httpsclient'和'pyasn1')。
代码语言:javascript复制pip install pyOpenSSL
pip install ndg-httpsclient
pip install pyasn1
这里先上一个demo:
代码语言:javascript复制# -*- coding: utf-8 -*
import json
import requests
import pandas as pd
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType, ChartType
reponse = requests.get(
'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5').json()
data = json.loads(reponse['data'])
province = []
confirm = []
for item in data['areaTree'][0]['children']:
province.append(item['name'])
confirm.append(item['total']['confirm'])
china_data = pd.DataFrame({"province": province, "confirm": confirm})
dicts_all = {'黑龙江': [127.9688, 45.368], '上海': [121.4648, 31.2891],
'内蒙古': [110.3467, 41.4899], '吉林': [125.8154, 44.2584],
'辽宁': [123.1238, 42.1216], '河北': [114.4995, 38.1006],
'天津': [117.4219, 39.4189], '山西': [112.3352, 37.9413],
'陕西': [109.1162, 34.2004], '甘肃': [103.5901, 36.3043],
'宁夏': [106.3586, 38.1775], '青海': [101.4038, 36.8207],
'新疆': [87.9236, 43.5883], '西藏': [91.11, 29.97],
'四川': [103.9526, 30.7617], '重庆': [108.384366, 30.439702],
'山东': [117.1582, 36.8701], '河南': [113.4668, 34.6234],
'江苏': [118.8062, 31.9208], '安徽': [117.29, 32.0581],
'湖北': [114.3896, 30.6628], '浙江': [119.5313, 29.8773],
'福建': [119.4543, 25.9222], '江西': [116.0046, 28.6633],
'湖南': [113.0823, 28.2568], '贵州': [106.6992, 26.7682],
'广西': [108.479, 23.1152], '海南': [110.3893, 19.8516],
'广东': [113.28064, 23.125177], '北京': [116.405289, 39.904987],
'云南': [102.71225, 25.040609], '香港': [114.165460, 22.275340],
'澳门': [113.549130, 22.198750], '台湾': [121.5200760, 25.0307240]}
for item in [list(z) for z in zip(china_data['province'],
china_data['confirm'])]:
dicts_all[item[0]].append(item[1])
(Map3D()
.add_schema(
itemstyle_opts=opts.ItemStyleOpts(
color="rgb(5,101,123)",
opacity=1,
border_width=0.8,
border_color="rgb(62,215,213)"),
map3d_label=opts.Map3DLabelOpts(
is_show=False,
formatter=JsCode(
"function(data){return data.name " " data.value[2];}")),
emphasis_label_opts=opts.LabelOpts(
is_show=False,
color="#fff",
font_size=10,
background_color="rgba(0,23,11,0)"),
light_opts=opts.Map3DLightOpts(
main_color="#fff",
main_intensity=1.2,
main_shadow_quality="high",
is_main_shadow=False,
main_beta=10,
ambient_intensity=0.3))
.add(
series_name="bar3D",
data_pair=list(zip(list(dicts_all.keys()), list(dicts_all.values()))),
type_=ChartType.BAR3D,
bar_size=1,
shading="lambert",
label_opts=opts.LabelOpts(
is_show=True,
formatter=JsCode(
"function(data){return data.name ' ' data.value[2];}")))
.set_global_opts(title_opts=opts.TitleOpts(title="COVID-19全国疫情分布图")))
.render("render.html")
demo测试成功:
这里创建好项目之后,先修改设置吧。
1.settings.py
代码语言:javascript复制#ALLOWED_HOSTS是一个字符串列表,代表了这个Django网站可以服务的主机名或域名。
这是为了阻止HTTP Host头攻击而采用的一种安全措施
ALLOWED_HOSTS = ['xxx.xxx.xxx.xxx','127.0.0.1']
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app.apps.AppConfig', #添加子应用
]
# 数据库设置,默认数据库改为MySQL数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'xxx.xxx.xxx.xxx',
'PORT': '3306',
'USER': 'root',
'PASSWORD': '123',
'NAME': 'crawler',
}
}
LANGUAGE_CODE = 'zh-Hans'#语言
TIME_ZONE = 'Asia/Shanghai'#时区
#静态文件 在static添加的任何静态文件都可以使用网址/static/文件在static中的路径来访问了
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
2.server/server/urls.py
代码语言:javascript复制from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
3.server/app/urls.py
代码语言:javascript复制from django.conf.urls import url
from app.views import index
app_name = 'info'
urlpatterns = [
url(r'^$',index,name = 'index'),
url(r'^index/$',index,name = 'index'),# 每个都返回到views下index实现业务逻辑
]
4.设置爬虫爬取的网站(之前测试过,因此这里继续爬取腾讯网)
在app子应用下创建一个名为‘Crawler.py’爬虫工具文件,里面封装了爬虫方法。
5.创建Models中的class对应数据库中的表,属性对应字段。
(1)定义模型类
在models.py中定义模型类,继承自models.Model
代码语言:javascript复制class foreign_data(models.Model):
date = models.DateField(verbose_name='更新时间')
name = models.CharField(max_length=20,verbose_name='国家')
confirm = models.IntegerField(verbose_name='确认总数')
confirmAdd = models.IntegerField(verbose_name='新增确诊人数')
heal = models.IntegerField(verbose_name='治愈人数')
dead = models.IntegerField(verbose_name='死亡人数')
nowConfirm = models.IntegerField(verbose_name='现存确诊')
class Meta:
#改表名
db_table = 'foreign_data'
#修改后台admin对的显示信息的配置
verbose_name_plural = '国外疫情数据(每个国家不同日期的数据)'
def __str__(self):
#后台显示
return self.name ':' str(self.date)
class globalStatic(models.Model):
lastUpdateTime = models.DateTimeField(verbose_name='更新时间')
nowConfirm = models.IntegerField(verbose_name='现存确诊')
confirm = models.IntegerField(verbose_name='确认总数')
heal = models.IntegerField( verbose_name='治愈人数')
dead = models.IntegerField(verbose_name='死亡人数')
nowConfirmAdd = models.IntegerField(verbose_name='新增现存确诊人数')
confirmAdd = models.IntegerField(verbose_name='新增确诊人数')
healAdd = models.IntegerField(verbose_name='新增治愈人数')
deadAdd = models.IntegerField(verbose_name='新增死亡人数')
class Meta:
# 改表名
db_table = 'globalStatic'
# 修改后台admin对的显示信息的配置
verbose_name_plural = '全球疫情总数据'
def __str__(self):
return '更新时间' str(self.lastUpdateTime)
class USA_history_confirm_data(models.Model):
date = models.DateField(verbose_name='日期')
confirm = models.IntegerField(verbose_name='确认数')
class Meta:
# 改表名
db_table = 'USA_history_confirm_data'
# 修改后台admin对的显示信息的配置
verbose_name_plural = '美国历史疫情数据'
def __str__(self):
return '日期:' str(self.date)
# 全球疫情实体类
class usa_global_all_data(models.Model):
date = models.DateField(verbose_name='日期')
usaconfirm = models.IntegerField(verbose_name='美国确诊')
confirm = models.IntegerField(verbose_name='全球确诊')
dead = models.IntegerField(verbose_name='全球死亡')
heal = models.IntegerField(verbose_name='全球治愈')
confirmAdd = models.IntegerField(verbose_name='全球新增')
class Meta:
# 改表名
db_table = 'usa_global_all_data'
# 修改后台admin对的显示信息的配置
verbose_name_plural = '美国和全球历史疫情数据'
def __str__(self):
return '日期:' str(self.date)
(2)模型迁移(建表)
代码语言:javascript复制生成迁移文件:根据模型类生成创建表的语句
python manage.py makemigrations
执行迁移:根据第一步生成的语句在数据库中创建表
python manage.py migrate
6.实现数据库操作方法
在app子应用下创建一个名为‘mysqldb.py’数据库操作工具文件,里面封装了数据库操作方法。
7.创建HTML页面
在templates文件夹中创建一个名为'index'的html文件