9. 10月10日 天气预测-1.爬虫

数据来源

做机器学习我们需要尽量多和准确的数据,本次实例从www.meteomanz.com获取免费的天气数据

分析数据源网址规则

我们访问上一步的网站,可以发现有选择城市和时间的接口(PS:右上角的链接可以切换成英文)

image-rvkq.png

这个就是我们要取到的数据了的地址,接下来解析这个网址的规则,如

http://www.meteomanz.com/sy2?cou=2250&ind=58362&d1=10&m1=09&y1=2024&d2=09&m2=10&y2=2024&so=002

这里面

  • ?前的分别是 http://网络协议,www.meteomanz.com域名,/sy2地址,我们主要关注 ?后的参数
  • couind是地区和城市代码
  • d1m1y1是时间段的开始年月日
  • d2m2y2是时间段的结束年月日

最多给30天的数据

分析页面规则

爬虫

from DrissionPage import SessionPage
# 创建会话页面
page = SessionPage()
# 访问指定的 URL
page.get('http://www.meteomanz.com/sy2?cou=2250&ind=58362&d1=10&m1=09&y1=2024&d2=09&m2=10&y2=2024&so=002')
table = page.ele('xpath:/html/body/div[1]/div/table')
print(table.text)

以上能正常访问,但不便于解析数据

from DrissionPage import SessionPage
# 创建会话页面
page = SessionPage()
# 访问指定的 URL
page.get('http://www.meteomanz.com/sy2?cou=2250&ind=58362&d1=10&m1=09&y1=2024&d2=09&m2=10&y2=2024&so=002')
table = page.ele('xpath:/html/body/div[1]/div/table')

rows = table.eles('xpath:.//tr')  # 使用相对xpath查找所有行
for row in rows:
    # 遍历每行中的每个单元格
    cells = row.eles('xpath:.//td')
    for c in cells:
        print(c.text)

现在能正常获取到每一个值了,但是需要对值进行归类

定义以下变量

t_date = t_ave = t_max = t_min = t_prec = t_press = t_wind_dir = t_wind_sp = ''

  • t_date 日期
  • t_ave 平均温度
  • t_max 最高温度
  • t_min 最低温度
  • t_prec 降雨量
  • t_press 大气压
  • t_wind_dir 风向
  • t_wind_sp 风力
if cells:
        t_date = t_ave = t_max = t_min = t_prec = t_press = t_wind_dir = t_wind_sp = ''
        for i in range(0, len(cells)):
            if i==0:
                t_date=cells[i].text
            if i==1:
                t_ave=cells[i].text
            if i==2:
                t_max=cells[i].text
            if i==3:
                t_min=cells[i].text
            if i==4:
                t_prec=cells[i].text
            if i==5:
                t_press=cells[i].text
            if i==6:
                t_wind_dir=cells[i].text
            if i==7:
                t_wind_sp=cells[i].text
        print(t_date,t_ave,t_max,t_min,t_prec,t_press,t_wind_dir,t_wind_sp)

image-fljq.png

这些不要,进行修改

t_press=cells[i].text.replace(" Hpa", "")

import re

t_wind_dir= re.sub(u"[º(.*?|N|W|E|S)]", "", cells[i].text)

image-cyjg.png

存到csv中

import csv

with open('weather_data.csv', mode='w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['Date', 'Ave Temp', 'Max Temp', 'Min Temp', 'Precipitation', 'Pressure (Hpa)', 'Wind Direction', 'Wind Speed'])
with open('weather_data.csv', mode='a', newline='', encoding='utf-8') as file:
            writer = csv.writer(file)
            writer.writerow([t_date, t_ave, t_max, t_min, t_prec, t_press, t_wind_dir, t_wind_sp])

image-umqo.png