通过爬取历史天气页面,对数据进行清洗,再形成折线图
一、用到的库
import datetime
from lxml import etree
import requests
import pandas as pd
二、目标网站
https://lishi.tianqi.com/beijing/202312.html
三、基础用法
# period_range的用法例子----返回固定的日期
pd.period_range(start='2017-01-01', end='2018-01-01', freq='M')
PeriodIndex(['2017-01', '2017-02', '2017-03', '2017-04', '2017-05', '2017-06',
'2017-07', '2017-08', '2017-09', '2017-10', '2017-11', '2017-12',
'2018-01'],
dtype='period[M]')
Python内置的strftime( )函数:实现本地时间\日期的格式化(将任意格式的日期字符串按要求进行格式化)
四、爬取网页
因为要获取多个月份的数据,所以用def()函数
def get_html(month):
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
}
url=f'https://lishi.tianqi.com/beijing/{month}.html'
res=requests.get(url,headers=headers)
data=res.text
# print(data)
# xpath解析
r_html=etree.HTML(data)
return r_html
五、固定日期
month_list=pd.period_range(start='2020-01',end='2023-12',freq='M').strftime('%Y%m')
print(month_list)
六、加入列名
# 列名
df=pd.DataFrame(columns=['日期','最高气温','最低气温','天气','风向'])
print(df)
七、首次获取
for month in month_list:
# 利用获取到的日期放入url中
r_html=get_html(month)
# print(tree)
lis=r_html.xpath('.//div[@class="tian_three"]/ul/li//text()')
print(lis)
break
效果:
八、循环获取
lists=[]
for month in month_list:
# 利用获取到的日期放入url中
r_html=get_html(month)
# print(tree)
lis=r_html.xpath('.//div[@class="tian_three"]/ul/li')
# print(lis)
# break
for i in lis:
item={
'日期':i.xpath('./div[@class="th200"]/text()')[0],
'最高气温':i.xpath('./div[@class="th140"]/text()')[0],
'最低气温':i.xpath('./div[@class="th140"]/text()')[1],
'天气':i.xpath('./div[@class="th140"]/text()')[2],
'风向':i.xpath('./div[@class="th140"]/text()')[3],
}
lists.append(item)
print(f'{month}已采集')
df=pd.DataFrame(lists)
print(df)
九、保存数据
# 存入excel表中,命名sheet名
df.to_excel('历史天气.xlsx',sheet_name='历史天气')
十、数据清洗
# 把日期列展开为多列
# 如果不是三列,那就会报错ValueError: Columns must be same length as key
data[['具体日期','星期','必备列']]=data['日期'].str.split(' ',expand=True)
print(data)
十一、转换格式
# 把最高气温的单位去掉
# 替换replace(旧值,新值)
data['最低气温']=data['最低气温'].str.replace('℃',' ').astype('float')
print(data)
# print(data.drop('日期',axis=1))
data.to_excel('历史天气.xlsx',sheet_name='表1')