目录
本文将介绍如何使用Python编写一个简单的爬虫程序,以爬取珠海市2011年至2023年的天气数据,并将这些数据保存为CSV文件。我们将涉及到以下知识点:
- 使用
requests
库发送HTTP请求 - 使用
lxml
库解析HTML文档 - 使用
datetime
和dateutil
库处理日期 - 使用
pandas
库操作数据并将其保存为CSV文件
目标
爬取天气网中珠海地区的历史天气数据,将日期、最高气温、最低气温、天气、风向各个数据爬取下来,并存储为csv文件
预期结果展示
准备工作
首先,我们需要安装一些必要的库。在命令行中运行以下命令来安装它们:
pip install requests lxml pandas
接下来,我们导入所需的库:
import pandas as pd
import requests
from lxml import etree
from datetime import datetime
from dateutil.relativedelta import relativedelta
爬取数据的开始时间和结束时间
我们需要确定要爬取的日期范围。在这个例子中,由于我们爬取的网站https://lishi.tianqi.com/zhuhai/202407.html翻页是有明确的url,并且是按最后时间变更的,因此我们需要创建一个列表,用于存储我们的时间列表,后续使用循环将我们的url中日期数据进行替换,我们将爬取2011年1月1日至2023年12月31日的数据。
# 爬取数据的开始时间
start_date = datetime(2011, 1, 1)
# 爬取数据的结束时间
end_date = datetime(2023, 12, 31)
# 遍历间隔,1个月
step = relativedelta(months=1)
# 创建一个列表存放时间
date_list = []
while start_date <= end_date:
date_list.append(start_date.strftime('%Y%m'))
start_date += step
这里我们可以print(date_list)一下,查看我们的结果
爬取数据并解析
接下来,我们将遍历date_list
中的每个日期,发送HTTP请求到对应的URL,并解析返回的HTML文档以提取所需的天气数据。
# 创建一个列表存放所有数据
data_list = []
# 爬取的年份:2011-2023,12年的每一天的数据
for date in date_list:
# 爬取数据的网页
url = f"https://lishi.tianqi.com/zhuhai/{date}.html"
# 请求头信息,防爬虫操作
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0'
}
# 1、 发送请求
response = requests.get(url=url,headers=headers)
if response.status_code == 200:
# 2、解析数据
# 数据不是一个动态页面,页面变更时html也会跟着变更
# 获取到的数据不是json文件,使用xpath解析
html = etree.HTML(response.text)
# 获取到30天的数据信息,存放于lis中
lis = html.xpath('/html/body/div[7]/div[1]/div[4]/ul/li')
# 由于直接xpath获取到的元素是一个列表
# 这里我们需要定义一个功能函数,返回我们想要的数据文本
def get_frist_text(list):
return list[0]
# 使用for循环遍历lis,取到每一个li
# 因为实在lis中获取的信息,所以用 . 表示当前位置
for li in lis:
time = get_frist_text(li.xpath('./div[1]/text()'))
maxtemp = get_frist_text(li.xpath('./div[2]/text()'))
mintemp = get_frist_text(li.xpath('./div[3]/text()'))
weather = get_frist_text(li.xpath('./div[4]/text()'))
wind = get_frist_text(li.xpath('./div[5]/text()'))
data_list.append([time,maxtemp,mintemp,weather,wind])
else:
print("请求失败")
将数据转换为DataFrame并保存为CSV文件
最后,我们将收集到的数据转换为pandas
的DataFrame
对象,并将其保存为CSV文件。
# 将数据转换为pands DataFrame
df = pd.DataFrame(data_list,columns=['日期','最高温度','最低温度','天气','风向'])
# 将DataFrame保存为csv文件
df.to_csv('zhuhai_weather_data_csv',index=False,encoding='utf-8-sig')
爬取结果部分信息展示
至此,我们已经完成了整个爬虫程序。通过运行这段代码,你将得到一个名为zhuhai_weather_data_csv
的CSV文件,其中包含了珠海市2011年至2023年的天气数据。