鱼C论坛

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

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

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

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

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

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

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

  14. def get_info(r):
  15.         return (r['confirmedCount'],
  16.         r['currentConfirmedCount'],
  17.         r['suspectedCount'],
  18.         r['curedCount'],
  19.         r['deadCount'])

  20. def get_p(de):
  21.         j=get_json(url2+str(de))
  22.         if j['results'] == []:
  23.                 print('哎呀,你输入的地址有误啊,再输一遍吧')
  24.         else:
  25.                 r=j['results'][0]
  26.                 t=get_time(r['updateTime'])
  27.                 print('截止至%d年%d月%d日%d时%d分时许,\n%s累计确诊病例%d例,现有确诊%d例,现有疑似患者%d例,\n累计治愈出院%d例,累计死亡病例%d例。\n#######################' % (t+(r['provinceName'],)+get_info(r)))
  28.                 a=input('是否查看下辖区详细情况?Y/N: ')
  29.                 if a == 'Y' or a == 'y' and r['cities'] != []:
  30.                         for i in r['cities']:
  31.                                 print('%s累计确诊病例%d例,现有确诊%d例,现有疑似患者%d例,\n累计治愈出院%d例,累计死亡病例%d例。\n====================================' % ((i['cityName']+'市',)+get_info(i)))
  32.                 elif r['cities'] == []:
  33.                         print('抱歉,该省份暂不支持查看下辖区情况。')
  34.        
  35. def main():
  36.         j=get_json(url)
  37.         r=j['results'][0]
  38.         t=get_time(r['updateTime'])
  39.         print('截止至%d年%d月%d日%d时%d分时许,\n我国累计确诊病例%d例,较昨日新增%d例,\n现有确诊%d例,现有疑似患者%d例,较昨日新增%d例,\n累计治愈出院%d例,较昨日新增%d例,\n现有重症%d例,累计死亡病例%d例,较昨日新增%d例。\n$$$$$$$$$$$$$$$$$$$$$$$$$$' % (t[:5]+(
  40.         r['confirmedCount'],
  41.         r['confirmedIncr'],
  42.         r['currentConfirmedCount'],
  43.         r['suspectedCount'],
  44.         r['suspectedIncr'],
  45.         r['curedCount'],
  46.         r['curedIncr'],
  47.          r['seriousCount'],
  48.         r['deadCount'],
  49.         r['deadIncr'])))
  50.        
  51.         while 1:
  52.                 de=input('请输入要查看的省份(一定要全称,例如"湖北省"): ')
  53.                 get_p(de)
  54. main()
  55. [/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行代码,即那个判断语句)
  1. if a == 'Y' or a == 'y' and r['cities'] != []:
  2.     for i in r['cities']:
  3.         print('%s累计确诊病例%d例,现有确诊%d例,现有疑似患者%d例,\n累计治愈出院%d例,累计死亡病例%d例。\n====================================' % ((i['cityName']+'市',)+get_info(i)))
  4. elif r['cities'] == []:#如果用户选择不查询香港下面的市级行政区(香港是没有下辖区的),那么上面那个判断语句没有全部满足条件,就来到了此处。来到此处后马上又满足了条件,所以即使用户输入不查询这条提示也会跳出来
  5.     print('抱歉,该省份暂不支持查看下辖区情况。')
复制代码


用户在不需要进行查询下辖区的情况下,不应提示给用户不支持查看,应该照常回到那个循环中。所以我认为这个判断语句可以这样改:

  1. if a == 'Y' or a == 'y':#分离了那一条长的判断语句,可以保证n则重新循环;y则进入如下判断
  2.     if r['cities'] != []:#如果用户既想查看,又能查找到,就进行输出
  3.         for i in r['cities']:
  4.             print('%s累计确诊病例%d例,现有确诊%d例,现有疑似患者%d例,\n累计治愈出院%d例,累计死亡病例%d例。\n====================================' % ((i['cityName']+'市',)+get_info(i)))
  5.     else:#如果用户想查看,但不能查找到,这时才提示用户
  6.         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后,直接结束函数,

  1.                 if a == 'Y' or a == 'y' and r['cities'] != []:
  2.                         for i in r['cities']:
  3.                                 print('%s累计确诊病例%d例,现有确诊%d例,现有疑似患者%d例,\n累计治愈出院%d例,累计死亡病例%d例。\n====================================' % ((i['cityName']+'市',)+get_info(i)))
  4.                 elif a=='n' or a=='N':
  5.                         return
  6.                 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-4-23 18:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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