知识点:
动态数据抓包
requests发送请求
结构化+非结构化数据解析
开发环境:
python 3.8 运行代码
pycharm 2021.2 辅助敲代码
requests
如果安装python第三方模块:
- win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车
- 在pycharm中点击Terminal(终端) 输入安装命令
代码实现:
- 发送请求
- 获取数据
- 解析数据
- 保存数据
采集天气数据代码
导入模块
import requests # 第三方模块 提前安装 发送请求 (Python里面浏览器) 爆红是因为你没有安装模块
# 如果安装了 但还是爆红是因为什么呢? 解释器在pycharm里面配置的不对
import parsel
import csv
# 翻译插件
with open('天气.csv', mode='a', encoding='utf-8', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(["日期", "最高温度", "最低温度", "天气", "风向", "城市"])
city_list = [54511, 58362, 59287, 59493]
for city in city_list:
for year in range(2011, 2022):
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}'
1. 发送请求
response = requests.get(url=url)
# <Response [200]>: 请求成功
2. 获取数据
# json数据传输格式
json_data = response.json()
# 字典类型数据
3. 解析数据
# 结构化数据解析
html_data = json_data['data']
selector = parsel.Selector(html_data)
# 正则 css xpath json字典数据解析
tr_list = selector.css('.history-table tr')
# tr_list[1:] 从列表的第二个元素开始取
for tr in tr_list[1:]:
# <X>fhwaeuifhwiuf</X>
td = tr.css('td::text').getall()
if td[2] == '°':
td[2] = td[1]
if city == 54511:
td.append("北京")
elif city == 58362:
td.append("上海")
elif city == 59287:
td.append("广州")
elif city == 59493:
td.append("深圳")
print(td)
# 文件名 写入方式 追加写入 编码方式 utf-8 数据空行
with open('天气.csv', mode='a', encoding='utf-8', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(td)
数据分析代码
导入包
import pandas as pd
import datetime
from pyecharts import options as opts
from pyecharts.charts import *
from pyecharts.commons.utils import JsCode
读入数据
data = pd.read_csv('天气.csv')
data
数据预览
data.sample(5)
data.info()
分割日期/星期
data[['日期','星期']] = data['日期'].str.split(' ',expand=True,n=1)
data
去除多余字符
data[['最高温度','最低温度']] = data[['最高温度','最低温度']].apply(lambda x: x.str.replace('°',''))
data.head()
计算下雪天气
data.loc[data['天气'].str.contains('雪'),'下雪吗']='是'
data.fillna('否',inplace=True)
分割日期时间
data['日期'] = pd.to_datetime(data['日期'])
data[['最高温度','最低温度']] = data[['最高温度','最低温度']].astype('int')
data['年份'] = data['日期'].dt.year
data['月份'] = data['日期'].dt.month
data['日'] = data['日期'].dt.day
# 预览
data.sample(5)
各城市初雪的时间
s_data = data[data['下雪吗']=='是']
s_data[(s_data['月份']>=9)].groupby('年份').first().reset_index()