最近用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)

运行结果


以上是运行结果,输入信息支持模糊查询

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

  1. python可视化来分析全国疫情

    很长一段时间在python下出图都是使用matplotlib,其好处就是应用比较广泛,文档很容易找,不过出的图微显丑陋.pyecharts 是百度的echarts基于python的实现,可以很方便的直 ...

  2. 疫情风险地区查询数据库

    最近疫情防控局势较为严峻,正好这学期学习了sqlserver的相关知识,利用课余时间设计了一个 可以实现疫情风险地区查询的数据库·,限于自身水平和时间有限难免有所疏漏,还请读者海涵与斧正. 一.数据库 ...

  3. 写代码获取全国疫情地图

    今天在朋友圈看到一个同学写的python获取全国疫情地图,我觉得挺有意思的,这个分享给大家,如果喜欢python的,可以通过这个作为入门手段. 1.安装python 看这个链接来安装,非常的小白 ht ...

  4. #榜样的力量#中诚信征信新冠肺炎全国疫情感染场所实时查询平台丨数据猿新冠战“疫”公益策划...

    "该项目案例由中诚信征信提交申报,参与数据猿推出的<寻找新冠战"疫",中国数据智能产业先锋力量>的公益主题策划活动. 大数据产业创新服务媒体 --聚焦数据 · ...

  5. 采集全国疫情数据(Python)

    题外话 可有好久没写东西了.目前跳槽啦,上岸啦.公司要做疫情大屏,需要抓取疫情数据. 本来想用爬虫去抓的,奈何我不懂写啊,时间还紧.就直接调用接口这种最简单的方式去实现. 进入主题: 我调用的是腾讯的 ...

  6. 我用Python制作了全国疫情地图,其实一点都不难!

    点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...

  7. Python基于百度OCR的疫情防控截图自动分析检查

    通过腾讯文档收集人员信息,下载后,使用Python基于百度OCR对填报的疫情防控截图信息进行识别和统计分析,5分钟搞定每天人工1小时的检查工作量,提高效率,还提高准确率. 前言 疫情期间,各地.各单位 ...

  8. python编写数据库连接工具_详解使用Python写一个向数据库填充数据的小工具(推荐)...

    一. 背景 公司又要做一个新项目,是一个合作型项目,我们公司出web展示服务,合作伙伴线下提供展示数据. 而且本次项目是数据统计展示为主要功能,并没有研发对应的数据接入接口,所有展示数据源均来自数据库 ...

  9. python 绘制新冠肺炎疫情地图

    参考链接: (1)实时更新|新冠肺炎疫情地图 https://news.sina.cn/zt_d/yiqing0121 (2)实时的可视化疫情地图 https://blog.csdn.net/weix ...

最新文章

  1. 数据治理(Data Governance)
  2. android服务器压力测试,Android压力测试Monkey工具
  3. purdue university some course and papers
  4. Simulink之电网电压换流式有源逆变电路
  5. [Android1.6]横竖屏切换时自动弹出键盘的问题
  6. mysql 图片转为二进制_php 图片转为二进制数据的方法
  7. sql server 别名_SQL Server别名概述
  8. [Swift]LeetCode874. 模拟行走机器人 | Walking Robot Simulation
  9. java实现生成pdf_详解Java生成PDF文档方法
  10. c语言编程洛谷评测得零分,洛谷试炼场题解记录——洛谷的第一个任务
  11. DID会固定年份吗_双重差分方法(DID)解析、影响机制分析与三重差分方法(DDD)...
  12. Snapper 1.3, FireFox截屏插件
  13. 为什么邮箱网页登录正常,但是客户端总是设置不成功,提示帐号密码不匹配?
  14. 利用Echarts制作地图(一)
  15. C#实现将Chart图表生成JPG图片的方法
  16. 数据结构与算法实验6——图论 7-10 公路村村通
  17. Verilog中#的使用与理解
  18. 【PDF报表】Jasperreports+jaspersoft studio快速入门
  19. 【linux教程(一)】Linux shell入门
  20. 自动控制原理01 基本概念

热门文章

  1. 平台经济反垄断,未来三年开放式金融创新机会在何处?
  2. 科大讯飞杯第十七届网络友谊赛 部分题解(ABDF)
  3. android多文件上传错误,微信多图上传解决android多图上传失败问题
  4. 英雄联盟手游发布!我却从中总结了4个万能PPT公式
  5. Java集合题目练习
  6. 人工智能数学基础--导数3:隐函数求导、对数求导法、参数方程求导法
  7. Matplotlib 绘制圆环图的两种方法!
  8. 爬虫----js逆向某宝h5的sign参数
  9. 分析Crash 日志一
  10. 【案例教程】GEE遥感云大数据在林业中的应用