前言

百度疫情和腾讯疫情数据数据爬取方式不同,腾讯疫情数据把数据放在数据包里,而百度则把数据包裹在script标签内。

百度实时疫情网址

准备工作

编辑器还是推荐 PyCharm下载链接

本篇需要导入的python模块

import json
import requests
from lxml import etree
import openpyxl

json —— 老朋友了,这个模块主要是解码编码,以及格式转换

requests——灵活的爬虫库,requests请求的底层实现其实就是urllib3,不要再用urllib2做爬虫了,兄弟萌。

etree——主要是为了从html源码中得到自己想要的内容。

openpyxl——处理excel文件

抓包分析

我感觉做爬虫最重要的还是数据来源的分析,因为每一个网站数据来源都有可能不一样,就像百度和腾讯做的疫情实时数据,不得不说,百度这一块做得确实比腾讯有过之而无不及。

首先进入网站,我一开始也是老三样,F12->Network->XHR,发现只有一个数据包,但是并没有我们想要的数据。

img

然后准备从网页源码入手,复制一个数据查找后,发现数据被包裹在一个script标签内,然后准备先把script标签内的数据扒下来。

img

分析数据的时候要跟原网页数据对应,确定数据的中文意思。

img

img

国内数据在caseList内

国内数据对应参数

省份——area

累计确诊——confirmed

死亡——died

治愈——crued

现有确诊——curConfirm

累计确诊增量——confirmedRelative

海外数据在globalList内

海外数据对应参数

洲——area

国家——country

累计确诊——confirmed

死亡——died

治愈——crued

现有确诊——curConfirm

累计确诊增量——confirmedRelative

具体代码实现

import json
import requests
from lxml import etree
import openpyxl

url = 'https://voice.baidu.com/act/newpneumonia/newpneumonia/?from=osari_pc_1'
response = requests.get(url)
# print(response.text)
# 生成html对象
html = etree.HTML(response.text)
# 获取列表
r = html.xpath('//script[@type="application/json"]/text()')
# json.loads将字符串转换为python数据类型
result = json.loads(r[0])
# print(result['component'][0]['caseList'])
# 创建工作簿
wb = openpyxl.Workbook()
# 创建工作表
ws = wb.active
ws.title = '国内疫情'
# 表头
ws.append(['省份','累计确诊','死亡','治愈','现有确诊','累计确诊增量'])
# 国内疫情数据
result_in = result['component'][0]['caseList']
for data_in in result_in:
    temp_list = [data_in['area'], data_in['confirmed'],data_in['died'],data_in['crued'],data_in['curConfirm'],
               data_in['confirmedRelative']
                 ]
    # 判断是否为空 如果空数据则赋值 0,0是字符串
    for i in range(len(temp_list)):
        if temp_list[i] == '':
            temp_list[i] = '0'
    ws.append(temp_list)
# 国外疫情数据
result_out = result['component'][0]['globalList'];
# print(result_out)
for data_out in result_out:
    # 表名
    sheet_title = data_out['area']
    # 创建新的工作表
    ws_out = wb.create_sheet(sheet_title)
    ws_out.append(['国家','累计确诊','死亡','治愈','现有确诊','累计确诊增量'])
    # subList 具体国家疫情数据
    for sub_out in data_out['subList']:
        sub_list = [sub_out['country'], sub_out['confirmed'],sub_out['died'],sub_out['crued'],sub_out['curConfirm'],
               sub_out['confirmedRelative']]
        # 防止数据为空 如果空则 赋值0
        for i in range(len(sub_list)):
            if sub_list[i] == '':
                sub_list[i] = '0'
        ws_out.append(sub_list)
wb.save('./data.xlsx')
print("Ok")


一个可爱的人