- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
思路:使用python爬虫对腾讯疫情网站世界疫情数据进行爬取,封装成一个函数返回一个 。
字典数据格式的对象,写另一个方法调用该函数接收返回值,和数据库取得连接后把 。
数据存储到mysql数据库.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
create table world(
id
int
(
11
)
not
null auto_increment,
dt datetime
not
null comment
'日期'
,
c_name varchar(
35
) default null comment
'国家'
,
continent varchar(
35
) default null comment
'所属大洲'
,
nowconfirm
int
(
11
) default null comment
'累计确诊'
,
confirm
int
(
11
) default null comment
'当日现存确诊'
,
confirmadd
int
(
11
) default null comment
'当日新增确诊'
,
suspect
int
(
11
) default null comment
'剩余疑似'
,
heal
int
(
11
) default null comment
'累计治愈'
,
dead
int
(
11
) default null comment
'累计死亡'
,
confirmaddcut
int
(
11
) default null comment
'confirmaddcut'
,
confirmcompare
int
(
11
) default null comment
'confirmcompare'
,
nowconfirmcompare
int
(
11
) default null comment
'nowconfirmcompare'
,
healcompare
int
(
11
) default null comment
'healcompare'
,
deadcompare
int
(
11
) default null comment
'deadcompare'
,
primary key(
id
)
)engine
=
innodb default charset
=
utf8mb4;
|
注意建立的表,数据的名字,数据的长度,数据的类型,主键的定义一定要小心仔细.
这里博主出现了几个小错误:
①数据表的主键不可以设置为日期,因为在之后爬取数据之后可以看到,网站给的数据是同一天的, 。
因为主键不可以有重复,所以相同的日期是不可以作为主键定义的.
②设置int类型的id作为数据表的主键,那么存在一个问题,在往表里插入数据的时候,id位置的数据值需要考虑, 。
这个方法可以解决:可以在传值的时候把id的值设定为 0,前提是id是自增的, 。
这样数据库是可以自己处理id的,依然是从0开始自增,这样避免了不给id传值导致null的异常.
③博主使用的mysql可视化工具默认在一个页面显示30条记录,在右上角可以改变显示的记录数,因为本次插入的 。
是185条数据,所以在插入完之后如果发现数据不对,可以看看可视化工具是不是有什么设置导致的.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
"""
获取全球疫情数据
"""
def
get_world_data():
url
=
'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'
headers
=
{
'user-agent'
:
'wow64) applewebkit/537.36 (khtml, like gecko) chrome/86.0.4240.198 safari/537.36'
}
# 创建会话对象
# session = requests.session()
# 请求接口
# result = session.get('https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist')
# 打印结果
# print(result.text)
res
=
requests.get(url, headers
=
headers)
# print(res.text)
response_data_0
=
json.loads(res.text.replace(
'jquery34102848205531413024_1584924641755('
, '')[:
-
1
])
#转化json对象
# print(response_data_0.keys())
# print(response_data_0)
response_data_1
=
response_data_0[
'data'
]
# print(response_data_1)
# print(response_data_1[0].keys())
# data = jsonpath.jsonpath(resjson_1, '$.data.*')
# print(resjson_1.keys())
# for d in data:
# res = '日期:' + d['date'] + '--' + d['continent'] + '--' + d['name'] + '--' + '新增确诊:' + str(
# d['confirmadd']) + '累计确诊:' + str(d['confirm']) + '治愈:' + str(d['heal']) + '死亡:' + str(d['dead'])
# file = r'c:/users/administrator/desktop/world_data.txt'
# with open(file, 'w+', encoding='utf-8') as f:
# f.write(res + '\n') # 加\n换行显示
# f.close()
world
=
{}
for
i
in
response_data_1:
temp
=
i[
'y'
]
+
'.'
+
i[
'date'
]
tup
=
time.strptime(temp,
'%y.%m.%d'
)
dt
=
time.strftime(
'%y-%m-%d'
, tup)
# 改变时间格式,插入数据库 日期
# print(ds)
c_name
=
i[
'name'
]
#国家
continent
=
i[
'continent'
]
#所属大洲
nowconfirm
=
i[
'nowconfirm'
]
#现有确诊
confirm
=
i[
'confirm'
]
#累计确诊
confirmadd
=
i[
'confirmadd'
]
#新增确诊
suspect
=
i[
'suspect'
]
#现有疑似
heal
=
i[
'heal'
]
#累计治愈
dead
=
i[
'dead'
]
#累计死亡
confirmaddcut
=
i[
'confirmaddcut'
]
confirmcompare
=
i[
'confirmcompare'
]
nowconfirmcompare
=
i[
'nowconfirmcompare'
]
healcompare
=
i[
'healcompare'
]
deadcompare
=
i[
'deadcompare'
]
world[c_name]
=
{
'dt'
:dt ,
'continent'
: continent,
'nowconfirm'
: nowconfirm,
'confirm'
: confirm,
'confirmadd'
: confirmadd,
'suspect'
: suspect,
'heal'
: heal,
'dead'
: dead,
'confirmaddcut'
: confirmaddcut,
'confirmcompare'
: confirmcompare,
'nowconfirmcompare'
: nowconfirmcompare,
'healcompare'
: healcompare,
'deadcompare'
: deadcompare,
}
return
world
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
def
insert_world():
"""
更新 world 表
:return:
"""
cursor
=
none
conn
=
none
try
:
dic
=
get_world_data()
print
(dic)
conn, cursor
=
get_conn()
sql
=
"insert into world values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
sql_query
=
'select %s=(select dt from world order by id desc limit 1)'
#对比当前最大时间戳
cursor.execute(sql_query,dic[
'美国'
][
'dt'
])
if
not
cursor.fetchone()[
0
]:
print
(f
"{time.asctime()}开始插入世界数据"
)
for
k, v
in
dic.items():
# item 格式 {'2021-01-13': {'confirm': 41, 'suspect': 0, 'heal': 0, 'dead': 1}
cursor.execute(sql, [
0
,v.get(
'dt'
), k, v.get(
"continent"
), v.get(
"nowconfirm"
),
v.get(
"confirm"
), v.get(
"confirmadd"
),v.get(
"suspect"
),v.get(
"heal"
), v.get(
"dead"
)
, v.get(
"confirmaddcut"
), v.get(
"confirmcompare"
), v.get(
"nowconfirmcompare"
), v.get(
"healcompare"
),
v.get(
"deadcompare"
)])
conn.commit()
# 提交事务
print
(f
"{time.asctime()}插入世界数据完毕"
)
else
:
print
(f
"{time.asctime()}世界数据已是最新数据!"
)
except
:
traceback.print_exc()
finally
:
close_conn(conn, cursor)
|
总结一下在完成这两个方法的过程中遇到的问题,首先是最基础的问题,数据的类型和格式的转换,这里主要是指json字符串和 。
python里对应的数据对象(list和字典).
(1)一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值。内容一般分为三部分, 。
结构化的数据、半结构化的数据和非机构化数据.
1.结构化数据: 可以用统一的结构加以表示的数据。可以使用关系型数据库表示和存储,表现为二维形式的数据,一般特点是:数据以行为单位, 。
一行数据表示一个实体的信息,每一行的数据的属性是相同的。 2.半结构化数据: 结构化数据的一种形式,并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记, 。
用来分隔语义元素以及对记录和字段进行分层。因此他也被成为自描述的结构。常见的半结构数据有:html,xml和json等、 。
实际上是以树或者图的结构来存储的。 对于半结构化数据,节点中属性的顺序是不重要的,不同的半结构化数据的属性的个数是不一样的。这样的数据格式, 。
可以自由的表达很多有用的信息, 。
包含自描述信息。所以半结构化数据的扩展性很好,特别适合于在互联网中大规模传播。 3.非结构化数据 。
就是没有固定的结构。各种文档,图片,视频或者音频都属于非结构化数据。对于这类数据,我们一般直接整体进行存储,而且一般存储为二进制形式.
原文链接:
json(javascript object notation,js对象标记)是一种轻量级的数据交换格式.
基于ecmascript(w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据.
简洁和清晰的层次结构使得json成为理想的数据交换语言.
特点:易于阅读、易于机器生成、有效提升网络速度。 。
json语法规则:
在js语言中,一切都是对象。因此,任何支持的类型都可以通过json来表示.
例如字符串、数字,对象,数组。 js中对象和数组是比较特殊并且常用的两种类型: 1、对象表示为键值对{name:'zhangsan',age:'7'} 2、数据有逗号分隔[1,2,3,4,5] 3、花括号保存对象 4、方括号保存数组。 js的对象就相当于python中的字典 js的数组就相当于python中的列表 因为json用来存储js的对象或者数组,所以在python中我们可以将json转化为list或者dict.
解析json的包json: json.dumps(python的list或者dict)---->(返回值)---->json字符串。 json.loads(json字符串)------>(返回值)----->python的list或者dict. 。
json.dump(list/dict,fp)—>list,或者字典保存到json文件中。 json.load(fp)—>list/dict:从json文件中读出json数据.
json键值对是用来保存js对象的一种方式,和js对象的写法页大同小异,比如: {“firstname”:“json”,“class”:“aid1111”}等价于下面这条js语句:{firstname:“json”,class:“aid1111”}。 很多人搞不清楚json和js对象的关系,甚至谁是谁都不清楚。其实可以这么理解:
【json是js对象的字符串表达式,他使用文本形式表示一个js对象的信息,本质是一个字符串。】 如var obj = {a:“hello”,b:“world”}这是一个js对象。注意,键名也是可以用引号包裹的var json = ' {“a”:“hello”,“b”:“world”}'这是一个json字符串,本质上是一个字符串。 json作为数据包格式传输的时候具有更高的效率,这是因为json不想xml那样具有严格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输的压力大大减低.
之前写过一篇关于爬取中国疫情数据的博客文章,那里爬取的每日疫情数据和全球爬取的疫情数据格式有一点点不同:
这是中国的疫情数据,注意箭头指的地方,这里的data对应的key是字典 。
这是全球疫情,注意这里data对应的是list 。
数据的格式非常重要,因为在后续需要把网页爬取的数据接受之后,还要把数据导入数据库,所以中间数据的格式必须清楚, 。
比如list类型的可以通过下标去访问,而字典只可以通过name来访问,字典是不提供索引的,所以不可以通过下标访问。还 。
有就是数据库里的日期格式一定要注意转换再插入.
(1)首先需要导入需要的包:
1
2
3
4
5
|
import
requests
import
pymysql
import
time
import
json
import
traceback
|
(2)通过request向被爬取网站的url发起一个请求(如果网站有反爬取手段,需要在请求里加上headers) 获取headers:
到指定网站,浏览器按f12,之后在网络那一个选项里可以看到.
(3)获取和解析数据 。
1
2
3
4
5
6
|
url
=
'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'
headers
=
{
'user-agent'
:
'wow64) applewebkit/537.36 (khtml, like gecko) chrome/86.0.4240.198 safari/537.36'
}
res
=
requests.get(url, headers
=
headers)
# print(res.text)
response_data_0
=
json.loads(res.text.replace(
'jquery34102848205531413024_1584924641755('
, '')[:
-
1
])
#转化json对象
|
这里进行了第一步解析,通过json.loads( ) 方法把从网页获取的json字符串数据转化成python对应的list或者字典.
如果第一步解析之后data对应的value不是list,那么可以进行第二次解析,本次操作中,世界疫情数据的data对 。
应的数据是一个list,所以也就不需要进行第二次转化,可以直接通过list的下标去访问.
数据转化是必要的,在网络中json字符串传递小巧安全速度快,但是我们读取数据,如果直接对字符串进行操作 。
会非常不方便,所以我们需要解析json字符串,也就是通过json.loads()方法把字符串转化成python对应的list或 。
者字典对象,这样我们访问操作这些数据会变得简单.
以上就是python爬虫爬取全球疫情数据并存储到mysql数据库的步骤的详细内容,更多关于python 爬取疫情数据存储到mysql的资料请关注我其它相关文章! 。
原文链接:https://www.cnblogs.com/rainbow-1/p/14578793.html 。
最后此篇关于Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤的文章就讲到这里了,如果你想了解更多关于Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在字符串中有一个大词。例子白 Wine 额外优惠。 我想在第一行使用“White”,在第二行使用“wine extra offer”。使用下面的代码: string value="White win
我想在无符号中执行一些算术运算,需要取负整数的绝对值,比如 do_some_arithmetic_in_unsigned_mode(int some_signed_value) { unsign
我正在努力使用 data.table 来总结向量函数的结果,这在 ddply 中很容易。 问题 1:使用带有矢量输出的(昂贵的)函数聚合 dt dt[ , as.list(quantile(x)),
我有两个分数列表; 说 A = [ 1/212, 5/212, 3/212, ... ] 和 B = [ 4/143, 7/143, 2/143, ... ] . 如果我们定义 A' = a[0] *
我已经使用 numpy 从 csv 文件中获取数据。 numpy 数组的尺寸为:100*20。我如何取列的平均值(比如 col 3,5,8)并用包含这 3 个 cols 平均值的新列替换它们 如果
在 Rust 中取任意数的 n 次根的最佳方法是什么?例如,num crate 只允许取整数类型的第 n 个主根,即 floor'ed 或 ceil'ed 值......如何最好地接近实际值? 最佳答
看起来这应该很容易,但我很困惑。我已经掌握了使用 dplyr 进行编程的大致技巧0.7,但为此苦苦挣扎:How do Iprogram in dplyr我想要编程的变量是否是一个字符串? 我正在抓取数
在 Rust 中取任意数的 n 次根的最佳方法是什么?例如,num crate 只允许取整数类型的第 n 个主根,即 floor'ed 或 ceil'ed 值......如何最好地接近实际值? 最佳答
我有一个 pandas 数据框,其中有一列名为“coverage”。对于一系列特定索引值,我想获取前 100 行的平均“覆盖率”值。例如,对于索引位置 1001,我想要第 901-1000 行的平均“
import pandas as pd data = {'date': ['1998-03-01', '2001-04-01','1998-06-01','2001-08-01','2001-05-0
我有一个包含 100 个数字的 NSArray。我想创建一个 5 个数字的 NSArray。第二个数组中的第一个数字是第一个数组中前 20 个数字的平均值。第二个数字是第一个数组中第二组 20 个数字
我该怎么做?我试过 abs() 但它只适用于整数。有内置的方法吗? CGFloat flo = -123; abs(flo) 返回 0 最佳答案 使用 fabs() CGFloat f = -123.
我正在采用以下计算的 log2: tl_out.a.bits.size := log2Ceil(s1_row * s2_column * 4.U) 其中,s1_row 和 s2_column 是 UI
如何从 m 个元素集合中取出 n 个元素,以便在元素用完时从头开始? List list = new List() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; List newL
我已经完成了研究,但似乎找不到有关该主题的足够文档。 在 Object streams 上尝试一些代码时,我注意到将 BufferedOutputStream 放入 ObjectOutputStrea
我需要计算数据中连续时间组之间的差异,如下所示 from io import StringIO import pandas as pd strio = StringIO("""\
我在 Mongo 数据库中有以下文档: { _id: 1, question: "Blue or red?", __v: 0, votes: [9, 5] } 我想在后
好吧,宇宙中一定有人知道这个问题的答案。 我已经在这里问过这个问题,但仍然没有解决方案。 我需要保留和换行 div 中的文本。到目前为止,我很难想出解决方案。我找到的最佳解决方案并不适用于所有浏览器。
我正在尝试采用 3 个单独的整数输入(年、月、日)并采用这 3 个条目并从中形成一个日期对象,以便我可以使用它来比较其他日期。 这是我目前所拥有的,不知从何而来: public void compar
在我的 IOS 项目中,我有一个包含该函数的自定义 Logger 类(单例) - (void)log:(NSString *)domain logLevel:(int)level logMessage
我是一名优秀的程序员,十分优秀!