您的位置:首页 > 编程语言 > Python开发

python实现空气质量指数爬取,输出csv文件

2019-09-20 21:36 204 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_42118531/article/details/101079987
"""
空气质量指数计算方法

定量描述空气质量状况的无量纲指数

版本7.0
智能爬取网页数据
获取所有城市的AQI

bs = BeautifulSoup(
url,
html_parser,      指定解析器
enoding           指定编码格式(确保和网页编码一致)
)

bs.find_all('a')   按照类型查找节点

按照属性查找节点
bs.find_all('a',href = ‘a.html')
bs.find_all('a', href = ‘a.html',string = "next page' )
bs.find_all('a',class_ =‘a_link')    注意是,class_ 需要带下划线,class是特殊字符
bs.find_all('a',{‘class’ :‘a_link'})    或者这样的写法{ ‘’ }

"""
import requests
import bs4   # 导入beautifulsoup4
from bs4 import BeautifulSoup

def get_city_pm(city_pinyin):
url = 'http://www.pm25x.com/' + city_pinyin
r = requests.get(url, timeout=30)
soup = BeautifulSoup(r.text, 'lxml')
div_list = soup.find_all('td')
pm25 = div_list[3].text.strip()
#  很多城市没有那么多测量数据
pm = []
pm.append(pm25 [:])
pm25 = div_list[8].text.strip()
pm.append(pm25[:])
pm25 = div_list[13].text.strip()
pm.append(pm25[:])
pm25 = div_list[18].text.strip()
pm.append(pm25[:])
pm25 = div_list[23].text.strip()
pm.append(pm25[:])
pm25 = div_list[28].text.strip()
pm.append(pm25[:])

pm_ev = 0
for i in range(len(pm)):
if pm[i] == '--':
pass
else:
pm_ev += int(pm[i])      # 总共的PM2.5的值

return pm, pm_ev

def get_city_aqi(city_pinyin):
"""
获取城市的AQI
"""
url = 'http://www.pm25x.com/' + city_pinyin
r = requests.get(url, timeout=30)
soup = BeautifulSoup(r.text, 'lxml')    # 'lxml'解码方式
div_list = soup.find_all('div', {'class': "aqivalue"})                 # 这里得到的是列表,即使只有一个数据,也是列表,所以后面要注意角标的问题
aqi = div_list[0].text.strip()                                         # div_list如果不加[0],会一直报错
aqileveltext = soup.find_all('div', {'class': "aqileveltext"})
aqilevel = aqileveltext[0].text.strip()

return aqi, aqilevel

def get_all_cities():
"""
获取所有城市
"""
url = 'http://www.pm25x.com'
city_list = []
r = requests.get(url, timeout=30)
soup = BeautifulSoup(r.text, 'lxml')
div_list = soup.find_all("dl", {"class": "citylist"})
citys_div = div_list[0].find_all("a")
for city_div in citys_div:
city_name = city_div.text
city_pinyin = city_div['href'][1:]          # 在网页源代码中能够获取到   城市拼音.htm
city_list.append((city_name, city_pinyin))

return city_list
def main():
"""
主函数

"""
city_list = get_all_cities()
for city in city_list:
city_name = city[0]
city_pinyin = city[1]
city_aqi = get_city_aqi(city_pinyin)
# 不断循环输出  跳出循环的话只有最后一个结果
city_pm = get_city_pm(city_pinyin)
print(city_name, city_aqi, city_pm)

if __name__ == '__main__':
main()
"""
空气质量指数计算方法

定量描述空气质量状况的无量纲指数

版本8.0
智能爬取网页数据
获取所有城市的AQI
输出csv文件
"""
import requests
import bs4   # 导入beautifulsoup4
from bs4 import BeautifulSoup
import csv
def get_city_pm(city_pinyin):
url = 'http://www.pm25x.com/' + city_pinyin
r = requests.get(url, timeout=30)
soup = BeautifulSoup(r.text, 'lxml')
div_list = soup.find_all('td')
pm25 = div_list[3].text.strip()

#  很多城市没有那么多测量数据
pm = []
pm.append(pm25[:])

return pm

def get_city_aqi(city_pinyin):
"""
获取城市的AQI
"""
url = 'http://www.pm25x.com/' + city_pinyin
r = requests.get(url, timeout=30)
soup = BeautifulSoup(r.text, 'lxml')    # 'lxml'解码方式
div_list = soup.find_all('div', {'class': "aqivalue"})                 # 这里得到的是列表,即使只有一个数据,也是列表,所以后面要注意角标的问题
aqi = div_list[0].text.strip()                                         # div_list如果不加[0],会一直报错
# aqileveltext = soup.find_all('div', {'class': "aqileveltext"})
# aqilevel = aqileveltext[0].text.strip()

return aqi

def get_all_cities():
"""
获取所有城市
"""
url = 'http://www.pm25x.com'
city_list = []
r = requests.get(url, timeout=30)
soup = BeautifulSoup(r.text, 'lxml')
div_list = soup.find_all("dl", {"class": "citylist"})
citys_div = div_list[0].find_all("a")
for city_div in citys_div:
city_name = city_div.text
city_pinyin = city_div['href'][1:]          # 在网页源代码中能够获取到   城市拼音.htm
city_list.append((city_name, city_pinyin))

return city_list

def main():
"""
主函数

"""
city_list = get_all_cities()
# CSV文件的第一行列表
header = ['City', 'AQI', 'PM2.5']
# with操作,建立csv文件
with open('China_city_csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerow(header)
for i, city in enumerate(city_list):
if (i+1) % 10 == 0:
print('已处理{}条记录。(共{}条记录)'.format(i+1,len(city_list)))

city_name = city[0]
city_pinyin = city[1]
city_aqi = get_city_aqi(city_pinyin)
city_pm = get_city_pm(city_pinyin)
row = [city_name] + [city_aqi] + city_pm
writer.writerow(row)

if __name__ == '__main__':
main()
"""
空气质量指数计算方法

定量描述空气质量状况的无量纲指数

版本9.0
智能爬取网页数据
获取所有城市的AQI
输出csv文件

Pandas模块学习

"""
import pandas as pd

def main():
"""
主函数
"""
aqi_data = pd.read_csv('China_city_csv')
print(aqi_data)   # 不填写读取效果不同于下面的语句
print(aqi_data.head(4))
print(aqi_data.tail(8))

print("******************************")
print('基本信息:', aqi_data.info())
print('^^^^^^^^^^^^^^^^^^^^^^^^^')
print(aqi_data["City"])
print('((((((((((())))))))))))))))))')
print(aqi_data[["City", "AQI"]].head(10))
print("__________________")

print('AQI最大值:', aqi_data['AQI'].max())
print("!!!!!!!!!!!!!!!!!!!!!")

print('AQI最小值:', aqi_data['AQI'].min())
print('############################')
print('AQI均值:', aqi_data['AQI'].mean())
print('%%%%%%%%%%%%%%%%%%%%%%%%%%%%')

# top10   排序
top10_cities = aqi_data.sort_values(by=['AQI']).head(10)
print(top10_cities)

# buttom10
Bottom10_cities = aqi_data.sort_values(by=['AQI'], ascending=False).head(10)
# Buttom10_cities = aqi_data.sort_values(by=['AQI']).tail(10)
# 与上面语句结果相同 数据顺序不同
print(Bottom10_cities)

# 保存csv文件 index=False 指不需要索引号码
top10_cities.to_csv('top10_aqi.csv', index=False)
Bottom10_cities.to_csv('Bottom10_cities.csv', index=False)

if __name__ == '__main__':
main()
"""
空气质量指数计算方法

定量描述空气质量状况的无量纲指数

版本10.0
智能爬取网页数据
获取所有城市的AQI
输出csv文件

Pandas模块学习
数据过滤

"""
import pandas as pd

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def main():
"""
主函数
"""
aqi_data = pd.read_csv('China_city_csv')
print(aqi_data)   # 不填写读取效果不同于下面的语句
print(aqi_data.head(4))
print(aqi_data.tail(8))

print("******************************")
print('基本信息:', aqi_data.info())

# 数据清洗,只保留AQI>0的数据
# filter_condition = aqi_data['AQI'] > 0
# clean_aqi_data = aqi_data[filter_condition]
clean_aqi_data = aqi_data[aqi_data['AQI'] > 0]
print(clean_aqi_data)
# aqi_data['PM2.5']的数据类型是str类型,无法进行比较大小
# clean_pm25_data = aqi_data[int(aqi_data['PM2.5']) > 0]
# print(clean_pm25_data)

print('^^^^^^^^^^^^^^^^^^^^^^^^^')
print(clean_aqi_data["City"])
print('((((((((((())))))))))))))))))')
print(clean_aqi_data[["City", "AQI"]].head(10))
print("__________________")

print('AQI最大值:', aqi_data['AQI'].max())
print("!!!!!!!!!!!!!!!!!!!!!")

print('AQI最小值:', aqi_data['AQI'].min())
print('############################')
print('AQI均值:', aqi_data['AQI'].mean())
print('%%%%%%%%%%%%%%%%%%%%%%%%%%%%')

# top50  排序
top50_cities = aqi_data.sort_values(by=['AQI']).head(50)
# plot函数是基于matploylib的pandas的模块函数
# plot(kind, x, y ,title, figsize)     kind 代表图的类型是柱状图、线图等  kind='bar'柱状图
# x,y  横纵坐标对应的数据列    title图像名称   figsize图像尺寸
# plt.savefig()
"""
#这个kind可以指定图表类型

‘line’ : line plot (default)
‘bar’ : vertical bar plot
‘barh’ : horizontal bar plot
‘hist’ : histogram
‘box’ : boxplot
‘kde’ : Kernel Density Estimation plot
‘density’ : same as ‘kde’
‘area’ : area plot
‘pie’ : pie plot
"""
top50_cities.plot(kind='bar', x='City', y='AQI', title='AQI水平最好的50个城市',
figsize=(20, 10))

# 保存图片:plt.savefig()
plt.savefig('top50_aqi_bar.png')   # 保存成图像
plt.show()

if __name__ == '__main__':
main()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: