Flask全国气象数据采集及可视化系统(爬虫)Python源码下载

Flask全国气象数据采集及可视化系统(爬虫)Python源码下载


一、项目前置条件

①具备 python 环境,并且可以通过 pip 进行安装项目

②具备 Pycram 工具,推荐专业版

③具备 Mysql 数据库

④具备 Navicat 数据库可视化管理工具

⑤推荐使用 Google Chrome、Firefox 浏览器

项目简介

项目通过爬取中国天气网的各个城市数据,然后保存到自己的数据库,然后

通过python 以及echart 技术对这些数据进行初步分析以及可视化。项目采用B/S

架构,通过浏览器即可访问。完善版本实现了所有可视化与后台数据进行关联,

并且爬虫也进行了优化处理。

项目技术

python 爬虫技术、Flask 后端框架、python、mysql 数据库、echart 大数据可

视化、layui 后台管理前端框架。

项目功能

系统拥有五大功能模块,应付各种设计场景,其中有可视化功能模块、版本管理

功能模块、用户管理功能模块、实时气象数据管理功能模块、爬虫管理功能模

。同时我们针对管理员和普通用户有着不同菜单权限的控制

爬虫简述

自动爬虫:项目启动,定时间隔1 小时爬取一次数据(可以自定义修改)。如下图。

项目手动启动爬虫:通过后台控制台,点击启动爬虫,后台静默爬取实时天气数据,智能跳

过已经获取到的数据。

python 文件手动启动爬虫:手动运行python 文件,获取最新天气数据。



flask

flask_apscheduler

pymysql

requests

xlwt

selenium



Navicat软件将weathers数据库文件导入

pytcharm打开项目,配置Python环境(安装need文件的依赖包)

运行app.py文件启动项目

账号  admin  密码123456


爬取的网站(天气网)http://www.weather.com.cn/

管理员账号admin   密码123456

依赖的Python包:

flask

flask_apscheduler

pymysql

requests

xlwt

Selenium









爬虫核心代码:


class GetWeather:

def __init__(self):

self.baseUrl = r"http://d1.weather.com.cn/sk_2d/"

self.headers = {'Accept': "*/*",

'Accept-Encoding': 'gzip, deflate',

'Accept-Language': 'keep-alive',

'Connection': '',

'Cookie': 'f_city=北京|101010100|; Hm_lvt_080dabacb001ad3dc8b9b9049b36d43b=1637305568,1637734650,1639644011,1639710627; Hm_lpvt_080dabacb001ad3dc8b9b9049b36d43b=1639723697'.encode(

"utf-8").decode("latin1"),

'Host': 'd1.weather.com.cn',

'Referer': 'http://www.weather.com.cn/',

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36', }

self.loadList = []

self.cityList = []  # 格式为:列表里面的子列表都是一个省份的所有城市,子列表里所有元素都是字典,每个字典有两项

self.cityDict = {}

self.result = xlwt.Workbook(encoding='utf-8', style_compression=0)

self.sheet = self.result.add_sheet('result', cell_overwrite_ok=True)

self.cityRow = 0

self.totalGet = 0


current_path = os.path.dirname(__file__)

with open(current_path + "/CITY.txt", 'r', encoding='UTF-8') as load_f:

loadList = json.load(load_f)  # 34个省份

for i in range(0, 4):

self.cityList.append(loadList[i])

for i in range(4, 34):

for j in loadList[i]['cityList']:

self.cityList.append(j)

for i in self.cityList:

if 'districtList' in i.keys():

self.cityDict.setdefault(i['cityName'], i['cityId'] + "01")  # 省

else:

self.cityDict.setdefault(i['provinceName'], i['id'] + "0100")  # 直辖市

print(len(self.cityDict))


def __getWeatherInfo__(self):

db = dbUtil()

count = 0

for city, id in self.cityDict.items():

try:

self.totalGet = self.totalGet + 1

self.sheet.write(self.cityRow, 0, city)  # 写当前城市名

PageUrl = self.baseUrl + id + ".html?_" + str(int(time.time() * 1000))

response = requests.get(PageUrl, headers=self.headers, allow_redirects=False)

response.encoding = "utf-8"

self.htmlResult = response.text

data = json.loads(self.htmlResult.replace("var dataSK=", ""))

nameen = data["nameen"]  # 城市拼音

cityname = data["cityname"]  # 城市名称

temp = data["temp"]  # 当前温度

WD = data["WD"]  # 风向

WS = data["WS"].replace("级", "")  # 风力

wse = data["wse"].replace("km/h", "")  # 风速

sd = data["sd"].replace("%", "")  # 湿度

weather = data["weather"]  # 天气

record_date = data["date"]  # 时间

record_time = data["time"]  # 时分

aqi = data["aqi"]  # 时分

judge_sql = "select count(id) from `weather` where nameen = '" + nameen + "' and cityname='" + cityname + "' and record_date='" + record_date + "' and record_time='" + record_time + "'";

sql = "INSERT INTO `weather` VALUES (null, '" + nameen + "', '" + cityname + "', '" + record_date + "', '" + record_time + "', " + str(

temp) + ", '" + WD + "', " + WS + ", " + wse + ", " + sd + ", '" + weather + "', " + aqi + ", '" + time.strftime(

"%Y-%m-%d %H:%M:%S", time.localtime()) + "',0);"

i = db.query_noargs(judge_sql)[0][0]

if int(i) > 0:

print("跳过:", judge_sql)

continue

update_sql = "update `weather` set is_old=1 where nameen = '" + nameen + "' and cityname='" + cityname + "'";

print("插入:", sql)

count += 1

db.query_noargs(update_sql)

db.query_noargs(sql)

except Exception as e:

print(e)

continue

t = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

sql = "insert into slog VALUES (NULL, \"【爬虫启动】爬取数据全国天气数据运行成功,获取数据:" + str(count) + "条\",\"" + t + "\")"

db.query_noargs(sql)

db.close_commit()


def __main__(self):

print(datetime.datetime.now())

self.__getWeatherInfo__()

print(datetime.datetime.now())



# 后台调用爬虫

def online():

weather = GetWeather()

weather.__main__()

return 200

你可能感兴趣的:(Flask全国气象数据采集及可视化系统(爬虫)Python源码下载)