利用Python爬取中国气象局天气预报数据
在这篇博客中,我们将介绍一段使用Python编写的代码,它能够从中国气象局的网站上爬取天气预报数据,并将这些数据存储到数据库中。这段代码不仅展示了如何利用Python进行网页数据抓取,还涉及到数据处理和数据库操作等多方面的知识。
一、功能概述
这段代码的主要功能是从中国气象局的网站(https://weather.cma.cn/)获取特定地区(如大理市及周边多个县)的天气预报信息,包括每天的天气描述、风向、风力、最高最低气温,以及最近预报时间的详细气象数据(如气温、降水量、风速、风向、气压、湿度、云量等),然后将这些数据存储到数据库中。同时,代码还会记录每次运行的状态(成功或失败)以及相关日志信息。
二、代码结构分析
- 导入模块:代码开头导入了多个常用模块,包括
datetime
和time
用于处理时间相关操作,requests
用于发送HTTP请求获取网页内容,json
用于处理JSON数据格式,re
用于正则表达式操作,BeautifulSoup
用于解析HTML页面,random
用于生成随机数(虽然在当前代码中未使用到)。此外,还导入了自定义模块GqxjDao
和mxt_yxqk
,从命名推测GqxjDao
可能用于数据库操作,mxt_yxqk
可能用于记录任务运行情况。
python">import datetime
import time
import tracebackimport requests
import json
import re
from bs4 import BeautifulSoup
import randomfrom GqxjDao import GqxjDao
from mxt_yxqk import mxt_yxqk
- 定义获取表结构的函数
getTableWeatherForecast
:这个函数定义了要存储数据的表名和列名。表名是一个包含实际表名和表描述的元组,列名是一个包含多个元组的列表,每个元组包含列名和列描述。通过这种方式,将表结构信息集中管理,方便后续数据库操作。
python">def getTableWeatherForecast():""":return:"""# 表名tablename = ('weather_forecast', '中国气象局_天气预报')# 列名fields = [('xs','县市'), ('xq', '星期'), ('date_day', '日期'), ('tqms', '白天天气描述'), ('fx', '白天风向'),('fl', '白天风力'), ('zgqw', '最高气温'), ('zdqw', '最低气温'), ('night_tqms', '夜间天气描述'),('night_fx', '夜间风向'), ('night_fl', '夜间风力'), ('next_time', '最近预报时间'),('next_qw', '最近预报气温'), ('next_jsl', '最近预报降水量'), ('next_fs', '最近预报风速'),('next_fx', '最近预报风向'), ('next_qy', '最近预报气压'), ('next_sd', '最近预报湿度'),('next_yl', '最近预报云量')]return tablename, fields
- 定义请求头函数
urlHeaders
:该函数根据传入的参数num
返回不同的请求头信息。目前代码中只定义了num == 1
时的请求头,请求头中包含了浏览器标识、接受的内容类型、语言偏好等信息,模拟了一个真实浏览器访问网页的请求头,有助于避免网站反爬虫机制。
python">def urlHeaders(num):if num == 1:headers1 = {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","Accept-Encoding": "gzip, deflate, br","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6","Cache - Control": "max - age = 0","Connection": "keep-alive","Cookie": "Hm_lvt_c758855eca53e5d78186936566552a13=1658996987,1659058143; Hm_lpvt_c758855eca53e5d78186936566552a13=1659058158","Host": "weather.cma.cn","If - Modified - Since": "Fri, 29 Jul 2022 01:05: 43 GMT","If-None-Match": '"62e33267-14922"',"sec-ch-ua": '" Not;A Brand";v="99", "Microsoft Edge";v="103", "Chromium";v="103"',"sec-ch-ua-mobile": "?0","sec-ch-ua-platform": '"Windows"',"Sec-Fetch-Dest": "document","Sec-Fetch-Mode": "navigate","Sec-Fetch-Site": None,"Sec-Fetch-User": "?1","Upgrade-Insecure-Requests": "1","User-Agent"