import time
import requests #发送数据
import parsel #解析数据
import csv
'''
网站:
https://tianqi.2345.com/
目的:北上广深历史天气采集,爬取天气数据
北京历史天气网页
https://tianqi.2345.com/wea_history/54511.htm
找数据
静态:网页html代码
动态:network(网页变化就会产生新的数据)
在页面的network中的Disable cache(勾选)和AII(勾选),找到Name里面的GetHistory开头的就是请求的,点击Headers,复制General里面Request URL的链接并在pycharm中赋值给变量url
https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=54511&areaInfo%5BareaType%5D=2&date%5Byear%5D=2023&date%5Bmonth%5D=5
代码实现
发送请求
获取数据
解析数据
保存数据
在页面的network中的Disable cache(勾选)和AII(勾选),找到Name里面的GetHistory开头的字符串,点击Payload,看到4个数据,从上到下依次是
areaInfo[areaId]: 54511 --》城市代码
areaInfo[areaType]: 2 --》
date[year]: 2023 --》年份
date[month]: 5 --》月份
'''
'''
要爬全国城市的历史数据的话需要先爬取相关城市代码,下面只演示4个城市
'''
f = open('爬虫-天气数据.csv',mode='a',encoding='utf-8',newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(['日期','最高温度','最低温度','天气','风向','城市'])
city_list = [54511,58362,59287,59493]#北京、上海、广州、深圳
for city in city_list:
city_name = ''
if city == 54511:
city_name = '北京'
elif city == 58362:
city_name = '上海'
elif city == 59287:
city_name = '广州'
elif city == 59493:
city_name = '深圳'
print(f'-----获取{city_name}城市的数据-----')
time.sleep(1)
for year in range(2013,2023):#获取2013年到2022年北京的历史天气
print(f'-----获取{city_name}城市{year}年的数据-----')
time.sleep(1)
for month in range(1,13):#获取一年的数据
# 发送请求
url = f'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D={city}&areaInfo%5BareaType%5D=2&date%5Byear%5D={year}&date%5Bmonth%5D={month}'
#上面的url设置了三个变量来改变url数据,以达到爬取不同数据的目的
response = requests.get(url=url)
# 获取数据
json_data = response.json()['data']
# 解析数据
select = parsel.Selector(json_data)
tr_css = select.css('.history-table tr') # 用css的语法提取数据,解析了网页源代码后会发现数据在.history-table tr里面
for tr in tr_css[1:]:
td_css = tr.css('td::text').getall()
'''
td_css = tr.css('td').getall()获取到的数据是:
['<td>2023-05-25 周四</td>', '<td style="color:#ff5040;">25°</td>', '<td style="color:#3097fd;">16°</td>',
'<td>多云</td>', '<td>西南风2级</td>', '<td><span class="history-aqi wea-aqi-2">65 良</span></td>']
'''
td_css.append(city_name)#在列表尾部添加所在城市
print(td_css)
'''
td_css = tr.css('td::text').getall()获取到的数据是:
['2023-05-25 周四', '25°', '16°', '多云', '西南风2级']
'''
csv_writer.writerow(td_css)
print('爬取完成!请在相应文档查看数据。')
北上广深历史天气采集,爬取天气数据
原创wx653b06e0b910b 博主文章分类:Python ©著作权
©著作权归作者所有:来自51CTO博客作者wx653b06e0b910b的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
近段时间天气暴热,所以采集北上广深去年天气数据,制作可视化图看下
最近天气异常暴热,看到某些地方地表温度居然达到70°,这就离谱所以就想采集一下天气的数据,做个可视化图,回忆一下去年的天气情况
python 开发语言 json 数据 html -
Java爬取中国天气网实况天气数据
因实验室需求,需要找一个实况天气API。百度云、阿里云、腾讯云上边我都去找了,很多平台要么没有,要么要收费(免费的可调...
Java 爬虫 天气 API System