前言

深夜更新,没想到吧。最近发生了很多的事情,很多很多,多到无法想象,2020年的前半年对我一点都不太友好,希望下半年能够时来运转,让我摆脱这种困境。

随着计算机和5G技术的发展,云计算、云存储这种需要大量网络带宽的解决方案开始变得愈发流行起来,企业越来越喜欢把自己的数据和自己的业务搭建在云上,本地没有对应的负载和维护成本,既能够解决数据存储和备份的痛点,对于版本回退和灾备也有了更好的支持,可能在未来10年后,人们只要靠一个浏览器,可是实现当前所有软件的功能。

今天的主角就是依赖于云存在的code-server,项目地址:https://github.com/cdr/code-server

顾名思义,从字面意思上来看它是一个编码服务器,实际上它就是一个可以架设在云端的代码编辑器,也是vscode的云版本,只要在对应的服务器上架设好的服务,理论上只要你有浏览器,你可以在任何设备上进行代码的编写,同时你的环境也不会丢掉,以后再也不用走哪里都带着一个笨重的电脑,可能一个蓝牙键盘,一个iPad就足够。好了,铺垫了这么多,接下来让我们来看看它如何架设。

安装

Ubuntu 服务器

# 下载对应安装包
wget https://github.com/cdr/code-server/releases/download/3.4.1/code-server_3.4.1_amd64.deb
 
# 安装包
sudo dpkg -i code-server_3.4.1_amd64.deb

Centos 服务器

# 下载对应安装包
wget https://github.com/cdr/code-server/releases/download/3.4.1/code-server-3.4.1-amd64.rpm
 
# 安装包
sudo rpm -i code-server-3.4.1-amd64.rpm

配置

# 修改配置文件
vim ~/.config/code-server/config.yaml

一打开配置文件你可能会看到以下几个选项:

  • bind-addr
  • auth
  • password
  • cert

一般来讲,我们主要关心的是bind-addrpassword这两个选项,bind-addr是设置code-server的监听地址,默认为127.0.0.1:8080,如果你是在云服务器主机上架设的话需要将127.0.0.1改成0.0.0.0:8080,如果是在自己的桌面版Linux上面装的话则不需要修改,8080是指服务的端口,如果不想使用8080请自行修改;接下来password这个参数显而易见,就是修改我们进入code-server的密码,将这个改成自己喜欢的密码即可。

初始化启动

systemctl --user enable --now code-server

享用

Tips

更多好玩的教程,好玩的技术博客,请持续关注下方我的微信公众号,如果有好的建议和好的想法欢迎公众号后台留言或者发送邮件至TyrantLucifer@linuxstudy.cn,我们下期再见!

我的微信公众号

前言

git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理,是Linux之父的另外一个得意之作,也是程序员团队协作一个不可缺少的工具,平时个人开发者都使用github来进行git的使用,如果团队开发又想将代码保存在自己服务器怎么办?今天就来记录一下如何在自己的服务器上搭建git。

准备工作

  • 一台安装了git的Linux服务器,系统版本不限
  • 服务器具有root权限

开始

创建git用户

useradd git # 增加git用户
password git # 设置密码

创建版本库保存目录

mkdir /git # 创建目录
chown -R git:git /git # 设置权限
cd /git # 进入目录
su git # 切换到git用户

创建并初始化版本库

mkdir testrepo
git init --bare testrepo/

此时我们的git版本库已经创建完成了,接下来需要做的是配置ssh免密

修改ssh配置文件

vim /etc/ssh/ssh_config
 
# 添加以下内容到文件中
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
 
systemctl restart sshd # 重启ssh服务

客户端生成公钥

请注意,这里需要在客户端机器上进行

ssh-keygen -t rsa -C "admin@admin.com" # 这里的邮件地址可以随便填,但是要记录下来

找到生成的id_rsa.pub,将文件内容复制出来,一般文件保存于~/.ssh

服务器配置authorized_keys

使用root用户登录到服务器,并切换到git

su git

编辑authorized_keys

mkdir -p ~/.ssh
vim ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

将上面id_rsa.pub的内容保存authorized_keys到中

客户端clone项目到本地测试

git config --global user.email "admin@admin.com" # 这里填刚才生成公钥时使用的邮箱地址
git config --global user.name "admin" # 这里用户名随便填
git clone git@*.*.*.*:/git/testrepo.git

看到图中提示,说明我们的git服务器已经搭建成功,至此,我们已经成功搭建了一台只属于自己的git服务器。

Tips

  • 更多好玩的教程,好玩的技术博客,请持续关注下方我的微信公众号,如果有好的建议和好的想法欢迎公众号后台留言或者发送邮件至TyrantLucifer@linuxstudy.cn,我们下期再见!

我的微信公众号

前言

树莓派相信熟悉小型Linux开发板的朋友都不陌生,作为一款优秀的卡片型小电脑,麻雀虽小五脏俱全,普通电脑能做的事情,它全都能做,最重要的一个优点,它作为一台24小时不停服的服务器来讲,低功耗,高收益,所以民间高手用树莓派来diy各种千奇百怪好玩好用的东西,例如用树莓派做家庭nas存放自己的小姐姐,用树莓派做为软路由管理家庭的网络,用树莓派做自己的贴心语音小助手来管理家庭智能家电等等一系列的应用场景,可玩性很高,作为一个很爱折腾的我也是对它爱不释手,很多人买来树莓派就是放在角落吃灰,但我的树莓派至今已经平稳运行了2年之久,它承担了我的毕业设计---智能语音机器人,承担了家中的nas共享,承担了平时在家的jupyter开发环境,在今天,我将赋予它新的使命---扶墙(FQ)好帮手,让我们家庭网络的终端中,无需连接威批恩便可以顺畅睁眼看世界!接下来请跟随文章的脚步,一起走进奇妙的折腾之旅~~~

本篇教程会占用你大概20分钟左右,过程较为复杂,但只要坚持做完,你会发现自己的扶墙是多么的方便!

准备

  • 一台刷好系统可以正常工作的树莓派
  • shadowsocksR订阅链接(一般从机场主处购买获得)
  • 树莓派安装Python环境

开始

  1. 使用ssh工具链接进入到树莓派

  1. 安装必备依赖
sudo apt install python3-pip
sudo apt install net-tools
  1. 从github下载ssr-command-client源码,关于ssr-command-client的信息,详情请见https://github.com/TyrantLucifer/ssr-command-client
git clone https://github.com/TyrantLucifer/ssr-command-client.git
  1. 进入到项目文件夹中,安装ssr-command-client相关依赖
sudo pip3 install -r requirement.txt
  1. 设置ssr-command-client订阅链接
python3 main.py --setting-url 你的订阅链接地址
  1. 更新订阅列表
python3 main.py -u

  1. 查看节点列表是否正常
python3 main.py -l

  1. 设置代理IP地址
  • 查看本机ip
sudo ifconfig

记住这个IP地址

  • 修改配置项
python3 main.py --setting-address 上面的ip地址
  1. 使用第七步显示的节点id,选择一个id,生成配置json文件
python3 main.py -c 1

  1. 启动代理
python3 main.py -s

享用

按照图中指示设置内容,点击左下角应用选项,即可设置完毕

  • 设置代理

选择我们刚才设置好的代理方式

打开谷歌,愉快的网上冲浪

  • QQ浏览器,与Google浏览器设置方法一致

Tips

  • 我没有订阅链接,但我还是想体验扶墙快感怎么办?ssr-command-client项目自带github免费订阅链接,下载项目到本地后直接执行python3 main.py -l即可
# github共享ssr订阅链接
https://raw.githubusercontent.com/satrom/V2SSR/master/SSR/Day.txt
  • 我还想手机也能实现跟电脑一样的功能,别着急,下期更新~~~
  • 我没有树莓派怎么办,云服务器也可以实现这个功能,把ip换成公网ip即可,也是一样的步骤去进行设置
  • 我没看懂怎么办,如果有需要的话我可以出一期教学视频给大家演示一遍,这看后台读者的需
  • 我想停止代理,更换节点怎么办?使用python3 main.py -S停止代理,使用python3 main.py -c 新的节点id重新生成节点配置文件,使用python3 main.py -s启动代理
  • 我想实现网站自动分流,墙外网站走代理,墙内网站走直连,别着急,下期更新~~~
  • 更多好玩的教程,好玩的技术博客,请持续关注下方我的微信公众号,如果有好的建议和好的想法欢迎公众号后台留言或者发送邮件至TyrantLucifer@linuxstudy.cn,我们下期再见!

我的微信公众号

前言

ShadowsocksR,小名酸酸乳,在扶墙届具有着不小的名声,如今机场的大半江山都被这款知名代理工具所占据,我平时的工作学习环境是个人笔记的Linux系统(Ubuntu 18.04),每日都有着上Google的需求,所以扶墙出去也是每日的必需操作,然而这款代理工具发展到至今,一键配置的脚本有很多,Windows下客户端有很多,唯独就是没有Linux环境下的客户端,之前倒是是有一款(electron-ssr),但不久前作者彻底删除了项目,估摸着是被叫去喝茶了,只剩下v0.2.6版本孤零零的存活于世,我曾经尝试过这款软件,使用体验还不错,界面化操作,适用于小白玩家,界面点点点,但作为一名硬核的Linux玩家,命令能实现的骚操作为什么不能用命令行实现呢?GUI在Linux下简直是浪费,为了满足我平时的需求,能够在命令行下直接一键开启代理,更换节点,ssr-command-client应运而生。

介绍

ssr-command-client是我开发的一款基于Python3的酸酸乳命令行客户端,功能简洁,主要是针对于Linux用户在命令行下能够愉快的使用代理上网冲浪,定位清晰,不臃肿,轻量级,没有GUI的限制,可以使用在国内的云服务器(阿里云、腾讯云)中,国内云服务器普遍存在一个问题,git速度很慢很慢,以至于我们在安装一些开源组件从github上拉取源码的过程变得十分缓慢,通常以10KB为秒的计数单位,而ssr-command-client完美解决了这个问题,世界可达,项目地址:https://github.com/TyrantLucifer/ssr-command-client(跪求star)

特性

ssr-command-client主要有以下功能:

  • 支持订阅链接解析
  • 支持指定本地socks5代理端口
  • 支持测试节点ping值

安装方式

git clone https://github.com/TyrantLucifer/ssr-commend-client.git
cd ssr-commend-client
pip3 install -r requirement.txt

使用方法

python3 main.py [OPTIONS]

OPTIONS

-l --list "show ssr list" 展示ssr节点列表
-s --start "start ssr proxy" 启动ssr代理服务
-S --stop "stop ssr proxy" 停止ssr代理服务
-p --port port "assign local port" 指定本地代理端口
-c --config ssr_node_id "generate config json file" 生成指定节点json文件
-u --update "update ssr list" 更新ssr节点列表

效果展示

  • 输出ssr链接节点列表 python3 main.py -l

  • 更新ssr订阅链接 python3 main.py -u

  • 生成ssr节点配置文件 python3 main.py -c ssr_node_id

  • 指定本地代理端口并生成配置文件 python3 main.py -c ssr_node_id -p local_port

  • 启动ssr代理 python3 main.py -s

  • 停止ssr代理 python3 main.py -S

未来计划

  • [ ] 支持多订阅链接解析
  • [ ] 支持自动选择速度最优节点
  • [ ] 支持自动生成PAC代理文件
  • [ ] 支持一键关闭、开启系统PAC网络代理(针对于Ubuntu 18.04)
  • [ ] 支持指定ssr链接启动服务
  • [ ] 支持命令行解析ssr链接信息

总结

没有轮子造轮子,这是我一概的作风,也是我学习编程的主要驱动力,兴趣占据了大半,我想做出一些让大多数人都觉得好用的东西,方便自我也方便他人,到今天为止这是我写的第44篇博客,但是发在公众号的只有几篇,未来我会坚持更新,记录自己的代码人生,code is my life!

Tips

如果有好的建议,欢迎发邮件给我,关注下方我的个人微信公众号在后台留言,或者在项目主页提交issue,如果觉得好用的话,各位读者姥爷在github项目首页帮我点个star,右下角帮我点击在看,感激不尽!

我的微信公众号

前言

前几日,于一月底在家闲的实在无聊,便找了点事情做,写了个小脚本每小时收集实时疫情信息,并保存到数据库中,到我写这篇文章为止,我已经收集到了241396条数据,精确到了地级市的确诊人数、治愈人数、死亡人数,大多数小伙伴们都于下周一返回工作岗位进行复工,下面我将用数据告诉你,为什么国家在下周一敢让你复工。

导入数据

将mysql数据库中的数据导出csv,保存到桌面,记住路径,用sas导入到临时work库中:

filename csvfile '/folders/myfolders/data_files/all_data.csv';

proc import datafile=csvfile
    dbms=csv
    out=work.import;
    getnames=yes;
    guessingrows=32767;
run;

导入的数据集信息如下:

  • confirmedCount:确诊人数
  • curedCount:治愈人数
  • deadCount:死亡人数
  • name:省份、地级市名称
  • parent_id:上级地区名称
  • update_time:更新时间

数据清洗

  • 由于数据源suspectedCount(疑似人数)不正确,需要在数据集里丢掉它
  • update_time的格式是datetime,需要把相关日期提取出来,把时间去掉
  • 需要从时间把时提取出来,方便后面作筛选
data sasr_all_data;
    set work.import;
    datetime = datepart(update_time);
    hour = hour(update_time);
    format datetime yymmddn8.;
    drop suspectedCount update_time;
run;

数据筛选、计算

以湖北省为例

数据筛选

由于湖北省是疫情重灾区,数据量较大,更容易看出疫情蔓延的趋势,所以我们首先将湖北省截止到我写文章的时间点数据(20点)拿出来:

data hubei_data;
    set work.sasr_all_data;
    where datetime between input('2020-01-29',yymmdd10.) 
    and input('2020-02-20',yymmdd10.)
    and hour = 20
    and name = '湖北省';
    drop parent_id;
run;

数据计算

计算每日确诊人数、死亡人数、治愈人数的增长率

data hubei_data_handle;
    set work.hubei_data;
    
    /*新建三个变量来保存数据上次迭代的数据*/
    retain confirmed_temp cured_temp dead_temp;
    
    /*计算增长率*/
    confirmed_growth_rate = abs(confirmed_temp - confirmedCount) / confirmed_temp;
    cured_growth_rate = abs(cured_temp - confirmedCount) / cured_temp;
    dead_growth_rate = abs(dead_temp - confirmedCount) / dead_temp;
    
    /*为临时变量赋值*/
    confirmed_temp = confirmedCount;
    cured_temp = curedCount;
    dead_temp = deadCount;
    
    /*为缺失值赋值为0*/
    if confirmed_growth_rate = . then confirmed_growth_rate = 0;
    if cured_growth_rate = . then cured_growth_rate = 0;
    if dead_growth_rate = . then dead_growth_rate = 0;
run;

在进行完数据计算之后,接下来就是图形展示:

图形可视化分析

我们先看一下湖北省每日的死亡人数和确诊人数:

title "湖北省疫情感染情况图";
proc sgplot data=hubei_data_handle;
  xaxis type=discrete;
  series x=datetime y=confirmedCount / datalabel;
  series x=datetime y=deadCount / 
      datalabel y2axis;
run;
title;

从折线图看,每日增长在逐渐变缓,在02月12日湖北省感染人数明显增长,原因是在12日这天新的领导班子,将之前掩盖的问题彻底揭露了出来,经过新的领导班子的铁腕政策,拐点快要到来,下面看一下死亡人数、确诊人数的增长率:

title "湖北省疫情增长率情况图";
proc sgplot data=hubei_data_handle;
  xaxis type=discrete;
  series x=datetime y=confirmed_growth_rate / datalabel;
  series x=datetime y=dead_growth_rate / 
      datalabel y2axis;
run;
title;

红色线条是死亡增长率,从02月05日开始,死亡率明显下降,同时在12日有了突增,原因还是因为新的领导班子大刀阔斧,将之间旧的问题暴露出来,从12日开始,增长率开始有了明显的下降,蓝色线条是确诊人数增长率,我们也看到了明显的下降,疫情有了明显的控制。

以全国为例

数据筛选

首先需要拿出全国省市在01月29日至02月20日特定时间点(20点)的数据:

data all_data;
    set work.sasr_all_data;
    where datetime between input('2020-01-29',yymmdd10.) 
    and input('2020-02-20',yymmdd10.)
    and hour = 20
    and parent_id = 'NULL';
    drop parent_id;
run;

数据计算

将数据按照日期汇总,计算出全国总的确诊人数、死亡人数、治愈人数:

proc sql;
    create table all_data_sum as
    select t.datetime,
        sum(t.confirmedCount) as confirmedCount,
        sum(t.deadCount) as deadCount,
        sum(t.curedCount) as curedCount
        from all_data t group by t.datetime;
quit;

计算增长率,计算逻辑与之前相似:

data all_data_handle;
    set all_data_sum;
    retain confirmed_temp cured_temp dead_temp;
    confirmed_growth_rate = abs(confirmed_temp - confirmedCount) / confirmed_temp;
    cured_growth_rate = abs(cured_temp - confirmedCount) / cured_temp;
    dead_growth_rate = abs(dead_temp - confirmedCount) / dead_temp;
    confirmed_temp = confirmedCount;
    cured_temp = curedCount;
    dead_temp = deadCount;
    if confirmed_growth_rate = . then confirmed_growth_rate = 0;
    if cured_growth_rate = . then cured_growth_rate = 0;
    if dead_growth_rate = . then dead_growth_rate = 0;
run;

图形可视化分析

首先看一下全国的每日死亡人数和确诊人数:

title "全国疫情详情统计图";
proc sgplot data=all_data_handle;
  xaxis type=discrete;
  series x=datetime y=confirmedCount / datalabel;
  series x=datetime y=deadCount / 
      datalabel y2axis;
run;
title;

虽然曲线在逐渐增长,但是斜率在逐渐变低,那就意味着增长率也在慢慢降低。

接下来看一下增长率:

红色线条是死亡增长率,蓝色线条是感染人数增长率,我们可以明显看到,每日感染人数的增长率都在逐步降低,死亡率也在慢慢降低,疫情得到了明显的控制,增长率已经控制到了2%以下。

总结

通过全国和湖北重灾区数据的可视化分析,我们能够得到的一个结论是,我们的各项数据的增长率在慢慢降低,相信不久的将来,可能是10天以内,增长率会控制在1%以下,这就为全国复工打下了坚实的基础,所以国家才会大力鼓励各地全员开工,恢复经济发展,好了今天的文章就到这里,下面是我的个人微信公众号,如果这篇文章帮到了您,请右下角点一个在看支持我一下,我们下期再见!我是TyrantLucifer,一个专注于Linux、Python、数据挖掘、数据分析的初入门小菜鸡~~

前言

俗话说,好记性不如烂笔头,要想成为一名好的程序员,时刻记录自己遇到的问题和解决方案才能让自己不断成长,所以为了成为一名优秀的程序员,我习惯用Markdown这种语法来记录自己的所见所得。下面就简单介绍一下Markdown

Markdown

Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式,它的格式简单易学,可以轻易排版出一篇好的笔记。

问题的抛出

在笔记中我经常加入一些配图,用来理解一些概念很有帮助,此时问题便出现了:

  1. 图片存放在哪里?
  2. 图片的时效性问题怎么保证?
  3. 图片的加载速度如何保证?

因为在Markdown笔记中引用图片是用url来进行引用的,每次所引用的图片大多数来自于互联网,源图地址大多数都有防盗链,无法永久的引用到笔记当中,时间不长,就会出现以下情景:

为了避免这种尴尬的情况,又想获得很快的加载速度,之前有一个很好地解决方案,那就是新浪图床,之前新浪大大免费给予图片的外链和永久无限空间的图床,真是优惠了一波又一波的人,可是总有那么些垃圾人去滥用,导致在去年3月份,新浪大大彻底关闭了公众免费图床,导致许多博客博主图片变成404,也包括我,我的博客当时全部把图重新换了一遍,费了老大劲,将图片转移到了自己的云服务器上,但是这样解决问题不代表长久解决问题:

  1. 云服务器空间有限,譬如阿里云、腾讯云学生机,40G内存,但是只能续费3年
  2. 国外云服务器譬如搬瓦工,20G内存,小的可怜,而且高峰时间点必炸,无法保证速度(手动狗头,懂的自然懂)

如果拥有自己的图床(无限空间、访问速度快、安全)该多好?

之前这样的想法简直就是在想pitch,哪有地方让你这么白嫖?

但是现在呢,我发现了一个一站式个人图床解决方案,那就是Github(无限空间)+jsDelivr(免费CDN加持)+PicGo(调用Github API),这样完美解决了当前的燃眉之急。

Github

Github作为每个程序员基本功,在这里我就不多作赘述,自从Github被微软收购之后,公众很是担心微软会把Github原有的精神给污染掉,但这样的担心却是多余的,微软接手Github之后宣布个人仓库永久无限免费空间,白嫖党们瞬间沸腾了~~(手动狗头)

jsDelivr

jsDelivr是一家打通国内与国外的cdn供应商,它向公众开放了免费的Github CDN加持,只需要将自己文件的外链前缀改成他们的服务器即可。

PicGo

之前想着自己用代码实现Github API的上传功能,但我还是想多了,逛了一圈Github果然有先辈将功能完整实现并开发出了一整套产品,那就是PicGo,一键式图床管理,项目地址:https://github.com/Molunerfinn/PicGo,这款软件可以实现下列图床的管理,并且支持网络代理、支持开启本地api server等等一系列强大的功能,有兴趣的小伙伴可以自行去项目页面进行研究,这里不多作赘述。

搭建流程

创建Github仓库

前往Github主页,登陆账户,点击新建仓库按钮:

在新建仓库页面,选择公有库public,如果选成私有库你的图片是显示不出来的,输入完库的名称和描述之后点击创建,这里请记录一下你的owner和你的Respository name,后面要用到:

新建Github token

点击Github页面右上角你的头像,选择settings

进入settings页面,选择Developer settings

进入Developer settings,选择Personal access token

然后输入Note,Note是用来标记这个token是干嘛用的,可以自己定义,再勾选token所具有的权限,就勾选图上的就可以

之后你就会获得一串token,记住:token只显示一次,显示了请务必保存下来

配置PicGo

https://github.com/Molunerfinn/PicGo/releases页面下载最新版本的PicGo,安装到自己电脑上,然后打开:

选择Github图床,按照图里面的配置:

仓库名就是你上面在创建Github仓库时候的用户名/仓库名

分支名填master

Token填你刚才生成的token

存储路径如果没有其他需求的话可以按照我图的填

自定义域名需要填https://cdn.jsdelivr.net/gh/用户名/仓库名

享用

本篇文章所有图片均是由GitHub+jsDelivr+PicGo一站式完成上传加载,祝各位读者老爷能够成功搭建起自己的个人图床!欢迎关注我的个人微信公众号,二维码见下方,我们下期再见!

前言

2020是一个不太平的年头,篮球标杆的意外去世,新型冠状病毒的肆虐横行,给本来喜庆的新年蒙上了厚厚的阴霾,为此,国家呼吁减少出行,安心呆在家里为国家做贡献,之前想象中的躺在床上有吃的有WiFi的生活彻底实现了,但是躺的时间太久了,难免有些厌倦,朋友圈里的有些朋友丧心病狂的去晒自己吃小橘子的步骤,简直惨不忍睹,为了打发时间,想了想要不爬一下最近全国肺炎感染信息,小小分析一下,画几个图出来看看感染情况究竟如何。

采集步骤

圈里的朋友最近都会分享丁香医生的接口https://3g.dxy.cn/newh5/view/pneumonia,就从这个网址入手吧

首先浏览器打开网址,熟练的操作F12,看到以下些个请求:

请求列表

有没有异步ajax请求呢?发现没有,看来页面开发的哥们没有直接开发接口,继续看页面数据怎么渲染上去的,点开主要的页面请求,看一看response,发现以下内容:

返回页面信息

原来开发页面哥们直接用js渲染json到页面上了,那就更简单了,直接get请求发送,解析标签获取内容即可,获取json直接保存到数据库,思路有了,接下来设置一下表结构吧:

create table sars_real_num(
    parent_id varchar(20), --父级地区
    name varchar(20), --省市名字
    confirmedCount integer, --确诊人数
    deadCount integer, --死亡人数
    suspectedCount integer, --疑似人数
    curedCount integer, --治愈人数
    update_time datetime --更新时间
);

之后直接上代码:

run.py

# 导入相关包
import requests
import json
import re
import datetime
from pymysql import *
from bs4 import BeautifulSoup

# 设置url
url = 'https://3g.dxy.cn/newh5/view/pneumonia'

# 发送http请求,获取结果
result = requests.get(url, headers=headers)

# 获取更新时间
update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

# 解析内容
result.encoding='utf-8'
content = result.text
soup = BeautifulSoup(content, 'lxml')
script_tags = soup.find_all(id='getAreaStat')
r = script_tags[0].text[27:-11]
province_list = json.loads(r)

# 设置数据库连接信息
host = '*.*.*.*'
port = 3306
database = 'sars'
user = 'sars'
password = 'sars'
charset='utf8'
connection = connect(host=host, port=port, database=database, 
               user=user, password=password, charset=charset)
cursor = connection.cursor()
insert_sql = 'insert into sars_real_num(name, parent_id, confirmedCount, deadCount, suspectedCount, curedCount, update_time) values(%s, %s, %s, %s, %s, %s, %s)'

# 解析json,保存到数据库
for province in province_list:
    params = list()
    params.append(province['provinceName'])
    params.append('NULL')
    params.append(province['confirmedCount'])
    params.append(province['deadCount'])
    params.append(province['suspectedCount'])
    params.append(province['curedCount'])
    params.append(update_time)
    cursor.execute(insert_sql, params)
    for city in province['cities']:
        params = list()
        params.append(city['cityName'])
        params.append(province['provinceName'])
        params.append(city['confirmedCount'])
        params.append(city['deadCount'])
        params.append(city['suspectedCount'])
        params.append(city['curedCount'])
        params.append(update_time)
        cursor.execute(insert_sql, params)
connection.commit()

# 关闭数据库连接
cursor.close()
connection.close()

为了使数据具有时效性,我们可以使用schedule这个模块,设置定时任务,每小时收集一次:

get_sars_real_num.py

import requests
import json
import re
import datetime
import schedule
import time
from pymysql import *
from bs4 import BeautifulSoup

def run():

    url = 'https://3g.dxy.cn/newh5/view/pneumonia'

    headers = {
        'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
        'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
        'Accept-Encoding':'gzip, deflate, br',
    }

    result = requests.get(url, headers=headers)

    update_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

    result.encoding='utf-8'

    content = result.text

    soup = BeautifulSoup(content, 'lxml')

    script_tags = soup.find_all(id='getAreaStat')

    r = script_tags[0].text[27:-11]

    province_list = json.loads(r)

    host = '*.*.*.*'
    port = 3306
    database = 'sars'
    user = 'sars'
    password = 'sars'
    charset='utf8'

    connection = connect(host=host, port=port, database=database, 
                   user=user, password=password, charset=charset)
    cursor = connection.cursor()

    insert_sql = 'insert into sars_real_num(name, parent_id, confirmedCount, deadCount, suspectedCount, curedCount, update_time) values(%s, %s, %s, %s, %s, %s, %s)'

    for province in province_list:
        params = list()
        params.append(province['provinceName'])
        params.append('NULL')
        params.append(province['confirmedCount'])
        params.append(province['deadCount'])
        params.append(province['suspectedCount'])
        params.append(province['curedCount'])
        params.append(update_time)
        cursor.execute(insert_sql, params)
        for city in province['cities']:
            params = list()
            params.append(city['cityName'])
            params.append(province['provinceName'])
            params.append(city['confirmedCount'])
            params.append(city['deadCount'])
            params.append(city['suspectedCount'])
            params.append(city['curedCount'])
            params.append(update_time)
            cursor.execute(insert_sql, params)
    connection.commit()
    cursor.close()
    connection.close()


if __name__ == "__main__":
    schedule.every(1).hours.do(run)
    while True:
        schedule.run_pending()
        time.sleep(1)

在Linux服务器后台设置后台任务,让代码自己跑起来:

nohup python3 get_sars_real_num.py >> get_sars_real_num.log 2>&1 &

在后台数据库我们可以看见数据一点一点的保存了进来:

数据库信息

数据简单分析

作为典型,我们拿出湖北省的数据来进行画图分析,在这里我们用到了Python比较经典的画图库matplotlib,有兴趣的小伙伴可以去官网学习库的用法,在这里不多过赘述。

大体流程:查询数据->画图

analysis.py

import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['figure.figsize'] = (14.0, 10.0)
from pymysql import *
host = '60.205.181.33'
port = 3306
database = 'sars'
user = 'sars'
password = 'sars'
charset='utf8'
connection = connect(host=host, port=port, database=database, 
               user=user, password=password, charset=charset)
cursor = connection.cursor()
select_sql = 'select * from sars_real_num where name = %s'
params = list()
params.append('湖北省')
count = cursor.execute(select_sql, params)
results = cursor.fetchall()
confirmedCount = list()
deadCount = list()
suspectedCount = list()
curedCount = list()
update_time = list()
for result in results:
    update_time.append(result[-1].strftime('%Y-%m-%d %H:%M:%S'))
    confirmedCount.append(result[2])
    deadCount.append(result[3])
    suspectedCount.append(result[4])
    curedCount.append(result[5])
plt.plot(update_time,confirmedCount,linewidth=3, linestyle='-.', label='确诊人数')
plt.title("湖北省肺炎确诊情况统计图",fontsize=20)
plt.tick_params(axis='both',labelsize=15)
plt.xticks(update_time, rotation=90)
y_major_locator=MultipleLocator(200)
ax=plt.gca()
ax.yaxis.set_major_locator(y_major_locator)
plt.ylim(0,5000)
plt.legend()
plt.show() #显示折线图

肺炎感染人数统计图

plt.plot(update_time,deadCount,linewidth=3, linestyle='-.', label='死亡人数')
plt.plot(update_time,suspectedCount,linewidth=3, linestyle='-.', label='疑似人数')
plt.plot(update_time,curedCount,linewidth=3, linestyle='-.', label='治愈人数')
plt.title("湖北省肺炎死亡治愈情况统计图",fontsize=20)
plt.tick_params(axis='both',labelsize=15)
plt.xticks(update_time, rotation=90)
y_major_locator=MultipleLocator(10)
ax=plt.gca()
ax.yaxis.set_major_locator(y_major_locator)
plt.ylim(0,200)
plt.legend()
plt.show()

肺炎死亡人数统计图

结论

丁香医生的接口大概在早上7点左右更新数据,且湖北省的整体感染人数、死亡人数都在不断的增加,即将要达到一个爆发期,特殊时期,谨慎出行,出门戴口罩,减少疾病的传播,保持一个健康的身体才是最重要的,祝愿祖国能早日度过这个难关,闲来无事,水文一篇,求各位大佬轻喷,溜了溜了,继续躺着去了~~~