关于记录一些报错问题

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个字符;
最重要的原因就是文件中有中文
解决办法:
文件头部填入:

# -*- 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')。

pip install pyOpenSSL
pip install ndg-httpsclient
pip install pyasn1

这里先上一个demo:

# -*- 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测试成功:
demo

这里创建好项目之后,先修改设置吧。

1.settings.py

#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

from django.contrib import admin
from django.urls import path
urlpatterns = [
    path('admin/', admin.site.urls),
]

3.server/app/urls.py

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

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)模型迁移(建表)

生成迁移文件:根据模型类生成创建表的语句
python manage.py makemigrations
执行迁移:根据第一步生成的语句在数据库中创建表
python manage.py migrate

6.实现数据库操作方法

在app子应用下创建一个名为‘mysqldb.py’数据库操作工具文件,里面封装了数据库操作方法。
mysqldb.py

7.创建HTML页面

在templates文件夹中创建一个名为'index'的html文件

8.前后端交互业务逻辑部分views.py

最后修改:2022 年 02 月 16 日 11 : 00 AM
如果觉得这篇文章不错,不妨赏我碎银几两。