爬虫学习——爬取台风数据存入数据库

最近因为某些需求需要台风数据的数据库,因此想利用python写一个相关的程序~

因为台风的数据77年之前是没有风圈等数据,所以台风在77年前只有一张数据表,在77年之后多了一张关于风圈风力的表。但是我想把两张表整合到一张去。

import re
import requests
import pymysql


url = "http://agora.ex.nii.ac.jp/cgi-bin/dt/search_name2.pl?lang=en&basin=wnp&smp=1&sdp=1&emp=12&edp=31"
response = requests.get(url)
response.encoding = 'utf8'
html = response.text
d = re.findall(r'<td><a href="/digital-typhoon/summary/wnp/s/(.*?)">',html,re.S) # 搜索所有的台风信息
for p in d: # 遍历所有的台风网页
    id =p[:6] # 获取台风的ID
    print(id)
    p_url = 'http://agora.ex.nii.ac.jp/digital-typhoon/summary/wnp/l/'+p # 台风轨迹信息
    response_1 = requests.get(p_url)
    html_1 = response_1.text
    name = re.findall(r'<div class="TYNAME">(.*?)</div>', html_1, re.S)[0] #  获取台风名字
    name = ''.join(re.findall(r'[A-Za-z]',name))[7:] #  从字符串中获取台风名字(过滤数字)
    info_1 = re.findall(r'<tr class="ROW(.*?)<td><a',html_1, re.S) # 台风第一张表的信息
    flag = 1;
    year_list = []
    month_list = []
    day_list = []
    hour_list = []
    lat_list = []
    long_list = []
    pressure_list = []
    wind_list = []
    level_class_list = []
    gust_list=[]
    direc_major_storm_list=[]
    rad_major_storm_list=[]
    rad_minor_storm_list = []
    direc_major_gale_list = []
    rad_major_gale_list = []
    rad_minor_gale_list = []
    for pp in info_1: # 遍历每一条记录,并提取值
        year = re.findall(r'<td>(.*?)</td>',pp, re.S)[0]
        year_list.append(year)
        month = re.findall(r'<td>(.*?)</td>', pp, re.S)[1]
        month_list.append(month)
        day = re.findall(r'<td>(.*?)</td>', pp, re.S)[2]
        day_list.append(day)
        hour = re.findall(r'<td>(.*?)</td>', pp, re.S)[3]
        hour_list.append(hour)
        lat = re.findall(r'<td>(.*?)</td>', pp, re.S)[4]
        lat_list.append(lat)
        long = re.findall(r'<td>(.*?)</td>', pp, re.S)[5]
        long_list.append(long)
        pressure = re.findall(r'<td>(.*?)</td>', pp, re.S)[6]
        pressure_list.append(pressure)
        wind = re.findall(r'<td>(.*?)</td>', pp, re.S)[7]
        wind_list.append(wind)
        level_class = re.findall(r'<td>(.*?)</td>', pp, re.S)[8]
        level_class_list.append(level_class)

    l =  'http://agora.ex.nii.ac.jp/digital-typhoon/summary/wnp/k/'+p
    response_2 = requests.get(l)
    html_2 = response_2.text
    info_2 = re.findall(r'<tr class="ROW(.*?)</tr>', html_2, re.S)
    if info_2: # 第二张表是否为空
         for pp in info_2:# 遍历每一条记录,并提取值
            gust = re.findall(r'<td>(.*?)</td>', pp, re.S)[7]
            gust_list.append(gust)
            direc_major_storm= re.findall(r'<td>(.*?)</td>', pp, re.S)[8]
            direc_major_storm_list.append(direc_major_storm)
            rad_major_storm = re.findall(r'<td>(.*?)</td>', pp, re.S)[9]
            rad_major_storm_list.append(rad_major_storm)
            rad_minor_storm = re.findall(r'<td>(.*?)</td>', pp, re.S)[10]
            rad_minor_storm_list.append(rad_minor_storm)
            direc_major_gale = re.findall(r'<td>(.*?)</td>', pp, re.S)[11]
            direc_major_gale_list.append(direc_major_gale)
            rad_major_gale = re.findall(r'<td>(.*?)</td>', pp, re.S)[12]
            rad_major_gale_list.append(rad_major_gale)
            rad_minor_gale = re.findall(r'<td>(.*?)</td>', pp, re.S)[13]
            rad_minor_gale_list.append(rad_minor_gale)
    else:
          flag=0
    conn = pymysql.connect(host='127.0.0.1', user='root', passwd='', db='typhoon', charset='utf8') # 连接数据库
    cur = conn.cursor()
    sql = "create table `" + id + "`(Number VARCHAR(255),Name VARCHAR(255),Year VARCHAR(255),Month VARCHAR(255),Day VARCHAR(255),Hour VARCHAR(255),Lat VARCHAR(255),Lon VARCHAR(255),Pressure VARCHAR(255),wind VARCHAR(255),class VARCHAR(255),"+\
          "gust VARCHAR(255),Direc_of_Major_Storm_Axis VARCHAR(255),Radius_of_Major_Storm_Axis VARCHAR(255),Radius_of_Minor_Storm_Axis VARCHAR(255)," + \
          "Direc_of_Major_Gale_Axis VARCHAR(255),Radius_of_Major_Gale_Axis VARCHAR(255),Radius_of_Minor_Gale_Axis VARCHAR(255))"
    # 注意当table名字用纯数字命名时,用`数字`,这个符号不是单引号,是感叹号左边的符号
    cur.execute(sql) # 创建新表
    for i in range(0,len(year_list)): # 遍历数组写入记录
     query = "insert into `" + id + "`(Number,Name,Year,Month,Day,Hour,Lat,Lon,Pressure,wind,class,Gust,Direc_of_Major_Storm_Axis," + \
                "Radius_of_Major_Storm_Axis,Radius_of_Minor_Storm_Axis,Direc_of_Major_Gale_Axis," + \
                "Radius_of_Major_Gale_Axis,Radius_of_Minor_Gale_Axis) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
     # 插入记录
     if flag == 1: #是否存在第二张表
         newsObjs = [id, name, year_list[i], month_list[i], day_list[i], hour_list[i], lat_list[i], long_list[i],
                     pressure_list[i], wind_list[i], level_class_list[i], gust_list[i], direc_major_storm_list[i],
                     rad_major_storm_list[i], rad_minor_storm_list[i], direc_major_gale_list[i], rad_major_gale_list[i],rad_minor_gale_list[i]]
     else:
         newsObjs = [id, name, year_list[i], month_list[i],day_list[i], hour_list[i],lat_list[i], long_list[i],
                     pressure_list[i], wind_list[i], level_class_list[i],'-','-','-','-','-','-','-']
     cur.execute(query,newsObjs)
    conn.commit()
    cur.close()
    conn.close()

后来还是觉得太麻烦了,调取pandas库搞定
import requests
import re
import pandas
from lxml import etree

url = "http://agora.ex.nii.ac.jp/cgi-bin/dt/search_name2.pl?lang=en&basin=wnp&smp=1&sdp=1&emp=12&edp=31"
response = requests.get(url)
response.encoding = 'utf8'
html = response.text
d = re.findall(r'<td><a href="/digital-typhoon/summary/wnp/s/(.*?)">',html,re.S) # 搜索所有的台风信息

print(d)
for p in d: # 遍历所有的台风网页
    id = p[:6]  # 获取台风的ID
    if int(id)>=197701:
        p_url = 'http://agora.ex.nii.ac.jp/digital-typhoon/summary/wnp/k/' + p  # 台风轨迹信息
        response_1 = requests.get(p_url)
        html_1 = etree.HTML(response_1.text)
        table = html_1 .xpath('//table[@class="TRACKINFO"]')
        table = etree.tostring(table[0], encoding='utf-8').decode()
        df = pandas.read_html(table, encoding='utf-8', header=0)[0]
        df.to_csv("E:\\typhoon\\"+id+".csv", mode='a', encoding='utf_8_sig', header=0, index=0)

好的!以下是一个简单的示例代码,展示了如何使用 Python 爬取台风数据并进行路径可视化处理。这里我们使用的是中国气象局的台风数据: ```python import requests from bs4 import BeautifulSoup import pandas as pd import matplotlib.pyplot as plt import cartopy.crs as ccrs # 爬取数据 url = 'http://www.nmc.cn/f/rest/passed/typhoon?userId=&timestamp=1627634548372' response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') # 解析数据 data = [] for item in soup.find_all('item'): typhoon_id = item.typhoonid.string typhoon_name = item.typhoonname.string typhoon_time = item.time.string typhoon_lat = item.lat.string typhoon_lon = item.lon.string typhoon_wind = item.wind.string typhoon_pressure = item.pressure.string data.append([typhoon_id, typhoon_name, typhoon_time, typhoon_lat, typhoon_lon, typhoon_wind, typhoon_pressure]) # 转换为 DataFrame 格式 df = pd.DataFrame(data, columns=['id', 'name', 'time', 'lat', 'lon', 'wind', 'pressure']) df['time'] = pd.to_datetime(df['time']) # 转换日期格式 df['lat'] = pd.to_numeric(df['lat']) / 10 # 转换纬度格式 df['lon'] = pd.to_numeric(df['lon']) / 10 # 转换经度格式 # 绘制地图 fig = plt.figure(figsize=(10, 10)) ax = plt.axes(projection=ccrs.PlateCarree()) ax.stock_img() ax.coastlines() # 绘制路径 for name, group in df.groupby('name'): ax.plot(group['lon'], group['lat'], label=name) # 添加图例 ax.legend(loc='upper left', fontsize='large') # 显示图形 plt.show() ``` 这段代码会爬取中国气象局的台风数据,并将台风的路径绘制在地图上。需要注意的是,这里使用了 cartopy 库进行地图投影和绘制,需要提前安装。另外,由于中国气象局的数据可能会有更新或者变动,这段代码的运行结果可能与实际情况略有出入。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值