用python写了个全国疫情中高风险地区查询

最近用python写了个全国疫情中高风险地区查询的爬虫代码,分享给大家一起交流,希望得到不同思路的指教,让代码更简洁,运行效率更高。

总体思路

1、找到可供查询的源网站
2、分析、获取查询的API
3、构造API
4、获取全国中高风险地区信息
5、对信息按“省、市、街道”进行整理
6、构造查询匹配语句,判断输入的“省、市、县”是否在获取的信息中

注:输入匹配部分的代码自己总觉得不是最优解,希望能有大佬看到,指点一二。

代码部分

# -*- coding: utf-8 -*-
# @Time    : 2022/5/12 11:08
# @Author  : Kyln.Wu
# @Email   : kylnwu@qq.com
# @File    : 疫情风险地区查询.py
# @Software: PyCharm
import hashlib
import json
import difflib
import requests
import time# 获取当前时间戳
timestamp = str(int((time.time())))
# print(timestamp)# 定义几个解密需要用到的常量
token = '*********************' # 这里不让写全部密钥,写在注释里了:23y0ufFl5YxIyGrI8hWRUZmKkvtSjLQA
nonce = '123456789abcdefg'
passid = 'zdww'
key = "3C502C97ABDA40D0A60FBEE50FAAD1DA"# 用python逆向Headers里要插入的zdwwsignature变量的值
def get_zdwwsignature():zdwwsign = timestamp + 'fTN2pfuisxTavbTuYVSsNJHetwq5bJvC' + 'QkjjtiLM2dCratiA' + timestamphsobj = hashlib.sha256()hsobj.update(zdwwsign.encode('utf-8'))zdwwsignature = hsobj.hexdigest().upper()# print(zdwwsignature)return zdwwsignature# 用python逆向Params里要插入的signatureheader变量的值
def get_signatureheader():has256 = hashlib.sha256()sign_header = timestamp + token + nonce + timestamphas256.update(sign_header.encode('utf-8'))signatureHeader = has256.hexdigest().upper()# print(signatureHeader)return signatureHeader# 这里才是主函数,通过api接口,带入需要的参数,获取全国的数据
def get_datas():url = 'https://bmfw.www.gov.cn/bjww/interface/interfaceJson'headers = {"Accept": "application/json, text/javascript, */*; q=0.01","Accept-Encoding": "gzip, deflate, br","Accept-Language": "zh-CN,zh;q=0.9","Connection": "keep-alive",# "Content-Length": "235","Content-Type": "application/json; charset=UTF-8","Host": "bmfw.www.gov.cn","Origin": "http://bmfw.www.gov.cn","Referer": "http://bmfw.www.gov.cn/yqfxdjcx/risk.html",# "Sec-Fetch-Dest": "empty",# "Sec-Fetch-Mode": "cors",# "Sec-Fetch-Site": "cross-site","User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0","x-wif-nonce": "QkjjtiLM2dCratiA","x-wif-paasid": "smt-application","x-wif-signature": get_zdwwsignature(),"x-wif-timestamp": timestamp}params = {'appId': "NcApplication",'paasHeader': "zdww",'timestampHeader': timestamp,'nonceHeader': "123456789abcdefg",'signatureHeader': get_signatureheader(),'key': "3C502C97ABDA40D0A60FBEE50FAAD1DA"}resp = requests.post(url, headers=headers, json=params)datas = resp.text# 在线获取后,保存到本地,再进行本地整理操作,减少在线访问,以免被封IPwith open('./risk_data.log', 'w', encoding='utf-8') as f:f.write(datas)# 获取data中highlist部分数据,即高风险地区数据
def get_highlist(data):highlist = data['data']['highlist']return highlist# 获取data中middlelist部分数据,即中风险地区数据
def get_middlelist(data):middlelist = data['data']['middlelist']return middlelist# 查询中高风险地区的函数。这部分的算法不是很严谨,有待改进。
def chaxun(high_list, middle_list):# 用列表推导式从high_list中取出province的值,然后用set()去重,再转换成列表high_provinces = list(set([x['province'] for x in high_list]))high_citys = list(set([x['city'] for x in high_list]))high_countys = list(set([x['county'] for x in high_list]))print(f'高风险省/直辖市:{high_provinces}')print(f'高风险市/区:{high_citys}')print(f'高风险县/街道:{high_countys}')middle_provinces = list(set([x['province'] for x in middle_list]))middle_citys = list(set([x['city'] for x in middle_list]))middle_countys = list(set([x['county'] for x in middle_list]))print(f'中风险省/直辖市:{middle_provinces}')print(f'中风险市/区:{middle_citys}')print(f'中风险县/街道:{middle_countys}')while True:province_in = input('请输入来自省/直辖市:')if len(province_in) == 0:print('输入省/直辖市不能为空!')breakcity_in = input('请输入来自市/区:')if len(city_in) == 0:print('输入市/区不能为空!')breakcounty_in = input('请输入来自县/街道:')if len(county_in) == 0:print('输入县/街道不能为空!')break# 用difflib.get_close_matches()方法从high_provinces中取出1个与province_in最匹配的值,近似度0.6high_province = difflib.get_close_matches(province_in, high_provinces, 1, cutoff=0.6)# print(f'high_province:{high_province}')high_city = difflib.get_close_matches(city_in, high_citys, 1, cutoff=0.6)# print(f'high_city:{high_city}')high_county = difflib.get_close_matches(county_in, high_countys, 1, cutoff=0.6)# print(f'high_county:{high_county}')middle_province = difflib.get_close_matches(province_in, middle_provinces, 1, cutoff=0.6)# print(f'middle_province:{middle_province}')middle_city = difflib.get_close_matches(city_in, middle_citys, 1, cutoff=0.6)# print(f'middle_city:{middle_city}')middle_county = difflib.get_close_matches(county_in, middle_countys, 1, cutoff=0.6)# print(f'middle_county:{middle_county}')# 构造所有可能的中高风险条件# 高、高、高if high_province and high_city and high_county:print(f'{province_in}{city_in}{county_in} 为高风险省/直辖市,市/区,县/街道!!')# 高、高、中elif high_province and high_city and not high_county and not middle_province and not middle_city and middle_county:print(f'{province_in} 为高风险省/直辖市,{city_in} 为高风险市/区,{county_in} 为中风险县/街道。')# 高、高、低elif high_province and high_city and not high_county and not middle_province and not middle_city and not middle_county:print(f'{province_in} 为高风险省/直辖市,{city_in} 为高风险市/区,{county_in} 为低风险县/街道。')# 高、低、低elif high_province and not high_city and not high_county and not middle_province and not middle_city and not middle_county:print(f'{province_in} 为高风险省/直辖市,{city_in} 为低风险市/区,{county_in} 为低风险县/街道。')# 高、中、中elif high_province and not high_city and not high_county and middle_province and middle_city and not middle_county:print(f'{province_in} 为高风险省/直辖市,{city_in} 为中风险市/区,{county_in} 为中风险县/街道。')# 高、中、低elif high_province and not high_city and not high_county and not middle_province and middle_city and not middle_county:print(f'{province_in} 为高风险省/直辖市,{city_in} 为中风险市/区,{county_in} 为低风险县/街道。')# 中、中、中elif not high_province and not high_city and not high_county and middle_province and middle_city and middle_county:print(f'{province_in} 为中风险省/直辖市,{city_in} 为中风险市/区,{county_in} 为中风险县/街道。')# 中、中、低elif not high_province and not high_city and not high_county and middle_province and middle_city and not middle_county:print(f'{province_in} 为中风险省/直辖市,{city_in} 为中风险市/区,{county_in} 为低风险县/街道。')# 中、低、低elif not high_province and not high_city and not high_county and middle_province and not middle_city and not middle_county:print(f'{province_in} 为中风险省/直辖市,{city_in} 为低风险市/区,{county_in} 为低风险县/街道。')# 低、低、低elif not high_province and not high_city and not high_county and not middle_province and not middle_city and not middle_county:print(f'{province_in}{city_in}{county_in} 为低风险省/直辖市,市/区,县/街道。')else:print(f'不在中高风险列表中,或行政区域不匹配,请检查!!')loop = int(input('是否继续查询?1-继续,0-退出。'))if loop == 0:breakif __name__ == '__main__':# 第一次运行时需要打开下面的注释,这样才能先从网上获取到数据# get_datas()# 以下是读取本地数据来进行查询的,前提是要先运行一次上一行get_datas()with open('./risk_data.log', 'r', encoding='utf-8') as f:datas_dic = json.loads(f.read())high_lst = get_highlist(datas_dic)# print(high_list)middle_lst = get_middlelist(datas_dic)# print(middle_list)chaxun(high_lst, middle_lst)

运行结果

全国中高风险地区查询结果
以上是运行结果,输入信息支持模糊查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20556.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何查询澳大利亚药监局(TGA)药品信息数据

澳大利亚医疗用品管理局(Therapeutic Goods Administration),简称TGA,是澳洲医疗用品的监管机构,负责一系列评估和监管确保澳洲药品保质保量。TGA监管的产品范围包括药品,医疗器械,血液及血液产品等。 澳大利亚药品分…

文字识别核酸检测结果并导出Excel

python下文字识别核酸检测报告信息并生成Excel数据表 前言:疫情下,隔几天就需要做一次核酸检测,核酸检测截图的收取工作称为部门工作的难点,参考最近热搜话题复旦大学辅导员用python搞定核酸检测核查难的问题,也自己动…

新库上线 | CnOpenData中国核酸检测机构及采样点数据

中国核酸检测机构及采样点数据 一、数据简介 2020年1月21日,国家卫健委发布1号公告,将新型冠状病毒感染的肺炎纳入《中华人民共和国传染病防治法》规定的乙类传染病,并采取甲类传染病的预防、控制措施。目前,新型冠状病毒肺炎防控…

电脑蓝牙与蓝牙适配器使用

这篇文章一开始写的很水,但最近重装电脑还是遇到了这个问题。下面更新一下,解决搜不到的问题。 ------------------------------------------------------------------------------------------------------ 1.确保你的手机能够蓝牙连接到耳机&#xf…

chatgpt赋能python:Python设置画布背景图——让你的图像更具美感

Python设置画布背景图——让你的图像更具美感 Python是一门流行的编程语言,被广泛使用于数据分析、科学计算和图像处理等多个领域。在图像处理方面,Python使用matplotlib作为主要的作图工具,matplotlib带来了许多方便易用的工具,…

为什么ChatGPT用强化学习而非监督学习?

为什么ChatGPT非得用强化学习,而不直接用监督学习?原因不是那么显而易见。在上周发布的《John Schulman:通往TruthGPT之路》一文中,OpenAI联合创始人、ChatGPT主要负责人John Schulman分享了OpenAI在人类反馈的强化学习&#xff0…

适配PyTorch FX,OneFlow让量化感知训练更简单

作者 | 刘耀辉 审稿 | BBuf、许啸宇 1 背景 近年来,量化感知训练是一个较为热点的问题,可以大大优化量化后训练造成精度损失的问题,使得训练过程更加高效。 Torch.fx在这一问题上走在了前列,使用纯Python语言实现了对于Torch.nn.M…

mongodb charts对mongodb数据进行分析和展示

mongodb charts 安装教程 安装环境什么是mongodb charts下载mongodb charts等准备工作配置mongodb charts创建用户启动和停止MongoDB图表故障排除web展示 安装环境 系统环境:ubuntu 16.04 docker 版本:Docker version 18.09.0 mongo 版本:Mo…

小白量化彩票实战(4)彩票特征号码重号、邻号、连号和表格展示

小白量化彩票实战(4)彩票特征号码重号、邻号、连号和表格展示 我写彩票的博客,不是鼓励大家去买彩票,读者要以学习编程和娱乐的思想来看待。兴趣是学习最大的动力! 彩票的号码特征很多,我们本篇介绍几个简单的号码特征…

一个小把戏算法,获取大乐透,并且计算出最佳的结果(Qt C++ 和Android共用)

无聊的国庆,总得做点什么好玩的是不是,那就写代码获取大乐透,让后按照自己的算法推测下一期的结果吧。 话不多说,上代码 Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);initDat…

算力军备竞赛白热化 “卖铲人”联想集团竞争力如何?

继微软通过OpenAI推出GPT系列、谷歌推出Bard和PaLM-E2之后,国内AI大模型也呈百家争鸣态势,年初至今,国内科技巨头几乎都发布了自研AI大模型产品,AI竞赛全面升级的背后,是全球科技巨头们对算力的争夺,作为算…

chatgpt赋能python:Python制图中如何添加文字

Python 制图中如何添加文字 介绍 制图通常不仅需要展示数据,还需要向读者传递信息。而添加文字是一种直接有效的方式,可以帮助读者更好地理解图表。 Python 图形库众多,如 Matplotlib、Seaborn、Plotly 等,它们都提供了向图表中…

【送书福利-第八期】《硅基物语.AI大爆炸: ChatGPT→AIGC→GPT-X→AGI进化→魔法时代→人类未来》

大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我! 本文目录 一、前言二、内容介绍三、作者介…

算法工程师体验了一下chatGPT,已经上瘾了!

chatGPT持续刷屏,作为能写代码,能修bug的超级工具,CV君必须体验一把! 首先来一个基本操作,让chatGPT写一段Python程序,使用YOLOv5对图像中的目标进行检测,找出有狗没有猫的图片: 对YOLOv5这种公…

还有人不懂 ChatGPT,不焦虑吗?(文末赠书)

,不 如果有一本书 可以让人理解“AI大爆炸”新纪元 那就是《碳基物语》 半年以来,ChatGPT点燃文明新火把 对AIGC和AGI的讨论也甚嚣尘上‍‍‍‍ AI会取代人类吗? 人工智能会拥有智慧吗? ChatGPT到底该怎么玩? 我该如何…

一想到还有95%的人不懂ChatGPT,我就焦虑了

如果有一本书 可以让人理解“AI大爆炸”新纪元 那就是《碳基物语》 半年以来,ChatGPT点燃文明新火把 对AIGC和AGI的讨论也甚嚣尘上‍‍‍‍ AI会取代人类吗? 人工智能会拥有智慧吗? ChatGPT到底该怎么玩? 我该如何利用AIGC提升生产…

5月书讯 | 《这就是ChatGPT》来了!

叮~又到了书讯时间,本月好书众多,姗姗来迟。 在这个数字化的时代,我们仍然相信纸质书的魅力,可以让人沉静下来,回归到阅读的本质。五月盛夏伊始,炎炎夏日,我们精心挑选了 10 本好书,…

通过AI的自白,开启ChatGPT学习之旅!

如果有一本书 可以让人理解“AI大爆炸”新纪元 那就是《碳基物语》 半年以来,ChatGPT点燃文明新火把 对AIGC和AGI的讨论也甚嚣尘上‍‍‍‍ AI会取代人类吗? 人工智能会拥有智慧吗? ChatGPT到底该怎么玩? 我该如何利用AIGC提升生产…

Anaconda安装的python环境中“No module named pip” 和 “ ‘pip‘ is a package and cannot be directly executed”问题

一. 没有pip3问题 找到安装anaconda的文件夹,点击Scripts(利用anaconda安装的python虚拟环境都在这里),确定是否存在一个easy_install.exe的程序,如果有请往下看,如果没有进入直接进入第4步。 打开 Anaconda Prompt 或 cmd &…

chatgpt赋能python:Python.head()方法:介绍和使用

Python .head()方法:介绍和使用 在Python编程中,我们经常需要处理大型数据集。为了更好地理解和使用这些数据,我们需要查看开头部分的数据。在这种情况下,.head()方法是非常有用的。 什么是.head()方法? .head()方法…