Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤

思路:使用Python爬虫对腾讯疫情网站世界疫情数据进行爬取,封装成一个函数返回一个

     字典数据格式的对象,写另一个方法调用该函数接收返回值,和数据库取得连接后把

     数据存储到mysql数据库。

一、mysql数据库建表

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条数据,所以在插入完之后如果发现数据不对,可以看看可视化工具是不是有什么设置导致的。

二、下面直接上代码(爬虫方法)

"""
获取全球疫情数据
"""
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

三、插入数据库

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.非结构化数据

  就是没有固定的结构。各种文档,图片,视频或者音频都属于非结构化数据。对于这类数据,我们一般直接整体进行存储,而且一般存储为二进制形式。

原文链接:www.jb51.net/article/208448.htm

json数据

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)首先需要导入需要的包:

import requests
import pymysql
import time
import json
import traceback

(2)通过request向被爬取网站的url发起一个请求(如果网站有反爬取手段,需要在请求里加上headers)
获取headers:

到指定网站,浏览器按F12,之后在网络那一个选项里可以看到。

(3)获取和解析数据

 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的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python爬虫实例——爬取美团美食数据

    1.分析美团美食网页的url参数构成 1)搜索要点 美团美食,地址:北京,搜索关键词:火锅 2)爬取的url https://bj.meituan.com/s/%E7%81%AB%E9%94%85/ 3)说明 url会有自动编码中文功能.所以火锅二字指的就是这一串我们不认识的代码%E7%81%AB%E9%94%85. 通过关键词城市的url构造,解析当前url中的bj=北京,/s/后面跟搜索关键词. 这样我们就可以了解到当前url的构造. 2.分析页面数据来源(F12开发者工具) 开启F12开发

  • python爬虫爬取网页数据并解析数据

    1.网络爬虫的基本概念 网络爬虫(又称网络蜘蛛,机器人),就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序. 只要浏览器能够做的事情,原则上,爬虫都能够做到. 2.网络爬虫的功能 网络爬虫可以代替手工做很多事情,比如可以用于做搜索引擎,也可以爬取网站上面的图片,比如有些朋友将某些网站上的图片全部爬取下来,集中进行浏览,同时,网络爬虫也可以用于金融投资领域,比如可以自动爬取一些金融信息,并进行投资分析等. 有时,我们比较喜欢的新闻网站可能有几个,每次都要分别

  • python爬虫分布式获取数据的实例方法

    在我们进行卫生大扫除的时候,因为工作任务较多,所以我们会进行分工,每个人负责不同的打扫项目.同样分工合作的理念,在python分布式爬虫中也得到了应用.我们需要给不同的爬虫分配指令,让它们去分头行动获取同一个网站的数据.那么这些爬虫是怎么分工搜集数据的呢?感兴趣的小伙伴,我们可以通过下面的示例进行解惑. 假设我有三台爬虫服务器A.B和C.我想让我所有的账号登录任务分散到三台服务器.让用户抓取在A和B上执行,让粉丝和关注抓取在C上执行,那么启动A.B.C三个服务器的celery worker的命令

  • python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析

    一.CrawlSpider类介绍 1.1 引入 使用scrapy框架进行全站数据爬取可以基于Spider类,也可以使用接下来用到的CrawlSpider类.基于Spider类的全站数据爬取之前举过栗子,感兴趣的可以康康 scrapy基于CrawlSpider类的全站数据爬取 1.2 介绍和使用 1.2.1 介绍 CrawlSpider是Spider的一个子类,因此CrawlSpider除了继承Spider的特性和功能外,还有自己特有的功能,主要用到的是 LinkExtractor()和rules

  • python爬虫今日热榜数据到txt文件的源码

    今日热榜:https://tophub.today/ 爬取数据及保存格式: 爬取后保存为.txt文件: 部分内容: 源码及注释: import requests from bs4 import BeautifulSoup def download_page(url): headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko

  • python实现scrapy爬虫每天定时抓取数据的示例代码

    1. 前言. 1.1. 需求背景. 每天抓取的是同一份商品的数据,用来做趋势分析. 要求每天都需要抓一份,也仅限抓取一份数据. 但是整个爬取数据的过程在时间上并不确定,受本地网络,代理速度,抓取数据量有关,一般情况下在20小时左右,极少情况下会超过24小时. 1.2. 实现功能. 通过以下三步,保证爬虫能自动隔天抓取数据: 每天凌晨00:01启动监控脚本,监控爬虫的运行状态,一旦爬虫进入空闲状态,启动爬虫. 一旦爬虫执行完毕,自动退出脚本,结束今天的任务. 一旦脚本距离启动时间超过24小时,自动

  • Python爬虫数据的分类及json数据使用小结

    数据的结构化分类 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为三部分,结构化的数据.半结构化的数据和非机构化数据. 1.结构化数据:        可以用统一的结构加以表示的数据.可以使用关系型数据库表示和存储,表现为二维形式的数据,一般特点是:数据以行为单位,一行数据表示一个实体的信息,每一行的数据的属性是相同的. 2.半结构化数据:        结构化数据的一种形式,并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用

  • 详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库

    获取要爬取的URL 爬虫前期工作 用Pycharm打开项目开始写爬虫文件 字段文件items # Define here the models for your scraped items # # See documentation in: # https://docs.scrapy.org/en/latest/topics/items.html import scrapy class NbaprojectItem(scrapy.Item): # define the fields for yo

  • python爬虫实现爬取同一个网站的多页数据的实例讲解

    对于一个网站的图片.文字音视频等,如果我们一个个的下载,不仅浪费时间,而且很容易出错.Python爬虫帮助我们获取需要的数据,这个数据是可以快速批量的获取.本文小编带领大家通过python爬虫获取获取总页数并更改url的方法,实现爬取同一个网站的多页数据. 一.爬虫的目的 从网上获取对你有需要的数据 二.爬虫过程 1.获取url(网址). 2.发出请求,获得响应. 3.提取数据. 4.保存数据. 三.爬虫功能 可以快速批量的获取想要的数据,不用手动的一个个下载(图片.文字音视频等) 四.使用py

  • python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解

    基本思路: 首先用开发者工具找到需要提取数据的标签列 利用xpath定位需要提取数据的列表 然后再逐个提取相应的数据: 保存数据到csv: 利用开发者工具找到下一页按钮所在标签: 利用xpath提取此标签对象并返回: 调用点击事件,并循环上述过程: 最终效果图: 代码: from selenium import webdriver import time import re class Douyu(object): def __init__(self): # 开始时的url self.start

随机推荐