鱼C论坛

 找回密码
 立即注册
查看: 2974|回复: 7

[作品展示] 爬取新冠肺炎疫情最新情况的爬虫

[复制链接]
发表于 2020-2-18 11:54:42 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好,今天闲来无事,就想刷刷疫情情况,就自己做了个可以查询到市的爬虫,
疫情期间,大家可以光明正大的宅在家里做贡献了,

代码只用了requests和json库:
[hide]
import json
import requests
import time
url='https://lab.isaaclin.cn/nCoV/api/overall'
url2='https://lab.isaaclin.cn/nCoV/api/area?latest=1&province='
def get_json(url):
        res=requests.get(url)
        js=json.loads(res.text)
        return js
        
def get_time(sec):
        t=time.localtime((sec/1000))
        return t[:5]

def get_info(r):
        return (r['confirmedCount'],
        r['currentConfirmedCount'],
        r['suspectedCount'],
        r['curedCount'],
        r['deadCount'])

def get_p(de):
        j=get_json(url2+str(de))
        if j['results'] == []:
                print('哎呀,你输入的地址有误啊,再输一遍吧')
        else:
                r=j['results'][0]
                t=get_time(r['updateTime'])
                print('截止至%d年%d月%d日%d时%d分时许,\n%s累计确诊病例%d例,现有确诊%d例,现有疑似患者%d例,\n累计治愈出院%d例,累计死亡病例%d例。\n#######################' % (t+(r['provinceName'],)+get_info(r)))
                a=input('是否查看下辖区详细情况?Y/N: ')
                if a == 'Y' or a == 'y' and r['cities'] != []:
                        for i in r['cities']:
                                print('%s累计确诊病例%d例,现有确诊%d例,现有疑似患者%d例,\n累计治愈出院%d例,累计死亡病例%d例。\n====================================' % ((i['cityName']+'市',)+get_info(i)))
                elif r['cities'] == []:
                        print('抱歉,该省份暂不支持查看下辖区情况。')
        
def main():
        j=get_json(url)
        r=j['results'][0]
        t=get_time(r['updateTime'])
        print('截止至%d年%d月%d日%d时%d分时许,\n我国累计确诊病例%d例,较昨日新增%d例,\n现有确诊%d例,现有疑似患者%d例,较昨日新增%d例,\n累计治愈出院%d例,较昨日新增%d例,\n现有重症%d例,累计死亡病例%d例,较昨日新增%d例。\n$$$$$$$$$$$$$$$$$$$$$$$$$$' % (t[:5]+(
        r['confirmedCount'],
        r['confirmedIncr'],
        r['currentConfirmedCount'],
        r['suspectedCount'],
        r['suspectedIncr'],
        r['curedCount'],
        r['curedIncr'],
         r['seriousCount'],
        r['deadCount'],
        r['deadIncr'])))
        
        while 1:
                de=input('请输入要查看的省份(一定要全称,例如"湖北省"): ')
                get_p(de)
main()
[/hide]
Screenshot_2020-02-18-11-45-23-679_ru.iiec.pydroid3.png
Screenshot_2020-02-18-02-41-05-143_ru.iiec.pydroid3.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-18 12:36:41 | 显示全部楼层
非常好,已收藏!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-19 15:19:28 | 显示全部楼层
本帖最后由 烟肖雨晨 于 2020-2-19 15:26 编辑

呼叫作者呼叫作者!
本人萌新发现了一个能更好完善的地方
按理来说,如果用户查询了一些特定的省级行政区(例如香港,没有市级行政区,即r['cities']==[]),那么这个时候输入Y(yes)是正常显示的,则提示不支持查看下辖区情况;但是如果这个时候输入N(no)是一点小问题的。用户输入了不查看,但是不支持查看下辖区情况还是会提示给用户。(31——35行代码,即那个判断语句)
 if a == 'Y' or a == 'y' and r['cities'] != []:
    for i in r['cities']:
        print('%s累计确诊病例%d例,现有确诊%d例,现有疑似患者%d例,\n累计治愈出院%d例,累计死亡病例%d例。\n====================================' % ((i['cityName']+'市',)+get_info(i)))
elif r['cities'] == []:#如果用户选择不查询香港下面的市级行政区(香港是没有下辖区的),那么上面那个判断语句没有全部满足条件,就来到了此处。来到此处后马上又满足了条件,所以即使用户输入不查询这条提示也会跳出来
    print('抱歉,该省份暂不支持查看下辖区情况。')

用户在不需要进行查询下辖区的情况下,不应提示给用户不支持查看,应该照常回到那个循环中。所以我认为这个判断语句可以这样改:
if a == 'Y' or a == 'y':#分离了那一条长的判断语句,可以保证n则重新循环;y则进入如下判断
    if r['cities'] != []:#如果用户既想查看,又能查找到,就进行输出
        for i in r['cities']:
            print('%s累计确诊病例%d例,现有确诊%d例,现有疑似患者%d例,\n累计治愈出院%d例,累计死亡病例%d例。\n====================================' % ((i['cityName']+'市',)+get_info(i)))
    else:#如果用户想查看,但不能查找到,这时才提示用户
        print('抱歉,该省份暂不支持查看下辖区情况。')
作者的这个爬虫写得很好,已收藏学习。本人的观点可能有不足之处,敬请批评指正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-19 17:57:06 From FishC Mobile | 显示全部楼层
能告诉我怎么在手机上运行的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 20:53:01 From FishC Mobile | 显示全部楼层
_2_ 发表于 2020-2-19 17:57
能告诉我怎么在手机上运行的吗?

下载pydroid 3 和一个数据包,就可以了,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 21:26:26 From FishC Mobile | 显示全部楼层
烟肖雨晨 发表于 2020-2-19 15:19
呼叫作者呼叫作者!
本人萌新发现了一个能更好完善的地方:
按理来说,如果用户查询 ...

多谢指正,都没有消息通知,现在才看到,
你的意见挺不错,我的解决方案是,
在输入了NO后,直接结束函数,
                if a == 'Y' or a == 'y' and r['cities'] != []:
                        for i in r['cities']:
                                print('%s累计确诊病例%d例,现有确诊%d例,现有疑似患者%d例,\n累计治愈出院%d例,累计死亡病例%d例。\n====================================' % ((i['cityName']+'市',)+get_info(i)))
                elif a=='n' or a=='N':
                        return 
                print('抱歉,该省份暂不支持查看下辖区情况。')
这样就可以解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-22 12:22:43 | 显示全部楼层
拉了盏灯 发表于 2020-2-20 21:26
多谢指正,都没有消息通知,现在才看到,
你的意见挺不错,我的解决方案是,
在输入了NO后, ...

代码很简洁,不愧是大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-23 11:28:27 | 显示全部楼层
Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/python练习/爬取新冠肺炎疫情最新情况.py", line 71, in <module>
    main()
  File "C:/Users/Administrator/Desktop/python练习/爬取新冠肺炎疫情最新情况.py", line 56, in main
    r['confirmedIncr'],
KeyError: 'confirmedIncr'

Process finished with exit code 1


为什么我现在运行会报错,之前运行都是对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 07:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表