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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容