Python高级应用程序设计任务

一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称

  中国天气网的数据爬取与分析


2.主题式网络爬虫爬取的内容与数据特征分析

  爬取全国所有的城市白天天气, 晚上天气, 白天温度, 晚上温度, 日出时间, 日落时间, 平均温度, 风力等级, 降水量, 平均湿度的信息并加以分析

 

3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)

  通过对整个网页的爬取获得的数据进行费雷和分析,然后总结出全国各地各个地方的天气情况

 

二、主题页面的结构特征分析(15分)
1.主题页面的结构特征

Python高级应用程序设计任务_第1张图片

对中国所有地区共2919个数据进行爬取分析


2.Htmls页面解析

Python高级应用程序设计任务_第2张图片

Python高级应用程序设计任务_第3张图片


3.节点(标签)查找方法与遍历方法
(必要时画出节点树结构)

  根据F12中的数据查找到相应位置并requests.get(),再利用正则找到正确的数据并保存起来

 

三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集

import requests
import re
import pandas as pd


def mainpage():
    """
    http://www.weather.com.cn/weather1d/101140210.shtml
    打开城市列表及对应的id以便进行url获取
    "http://www.weather.com.cn/weather1d/" + 城市id + ".shtml"
    """
    with open('城市列表.txt', 'r', encoding='UTF-8') as f:
        sss = f.readlines()
    sss = sss[0]
    # 通过正则拿出城市的id以及城市名称
    req = r'name’: ‘(.*?)’, ‘id’: ‘(.*?)’'
    re1 = re.findall(req, sss)
    # print(re1[0][1])
    # 逐个打开城市的天气页面获取数据
    for n in range(len(sss)):
        url = "http://www.weather.com.cn/weather1d/" + re1[n][1] + ".shtml"
        # 获取页面
        url_html = requests.get(url)
        # 配置页面编码
        url_html.encoding = "utf-8"
        # print(url_html.text)
        # 获取天气信息
        re_weather = re.compile(r'(.*?)

') re_weather_search = re_weather.findall(url_html.text) try: # 白天天气 daytime_weather = re_weather_search[0] # 黑夜天气 daynight_weather = re_weather_search[1] except: pass #

3°C

# 获取温度信息 re_temperature = re.compile(r'\n(.*?)(.*?)\n

') re_temperature_search = re_temperature.findall(url_html.text) try: # 白天温度 daytime_temperature = re_temperature_search[0][0] + re_temperature_search[0][1] # 黑夜温度 daynight_temperature = re_temperature_search[1][0] + re_temperature_search[1][1] except: pass #

日出 07:27

# 获取太阳信息 re_sun = re.compile(r'\n.{3}(.*?)\n

') re_sun_search = re_sun.findall(url_html.text) # 日出时间 try: daytime_sunup = re_sun_search[0] # 日落时间 daynight_sundown = re_sun_search[1] except: pass # 温度,风力等级,降水量,湿度 re_mul = re.compile( r'{"od21":".*?","od22":"(.*?)","od23":".*?","od24":".*?","od25":"(.*?)","od26":"(.*?)","od27":"(.*?)",' r'"od28":".*?"}') re_mul_search0 = re_mul.findall(url_html.text) # 把空值或者null替换成0 re_mul_search = [] for each in re_mul_search0: each = list(each) for z in each: if z == '' or z == "null": q = each.index(z) each.pop(q) each.insert(q, 0) re_mul_search.append(each) sum0 = 0 # 获取当日的平均温度 for i in range(len(re_mul_search) - 1): sum0 = sum0 + int(re_mul_search[i][0]) eval_temperature = sum0 / (len(re_mul_search) - 1) sum1 = 0 # 获取当日的平均风力等级 for i in range(len(re_mul_search) - 1): sum1 = sum1 + int(re_mul_search[i][1]) eval_wind = sum1 / (len(re_mul_search) - 1) sum2 = 0.0 # 获取当日的平均降水量 for i in range(len(re_mul_search) - 1): sum2 = sum2 + float(re_mul_search[i][2]) eval_water = sum2 / (len(re_mul_search) - 1) sum3 = 0.0 # 获取当日的平均湿度 for i in range(len(re_mul_search) - 1): sum3 = sum3 + float(re_mul_search[i][3]) eval_humidity = sum3 / (len(re_mul_search) - 1) city_list.append(re1[n][0]) ever_city_list = [] ever_city_list.append(daytime_weather) ever_city_list.append(daynight_weather) ever_city_list.append(daytime_temperature) ever_city_list.append(daynight_temperature) ever_city_list.append(daytime_sunup) ever_city_list.append(daynight_sundown) ever_city_list.append(round(eval_temperature, 1)) ever_city_list.append(round(eval_wind, 1)) ever_city_list.append(round(eval_water, 1)) ever_city_list.append(round(eval_humidity, 1)) totle_city_list.append(ever_city_list) # 设置表格 pd.set_option('display.unicode.ambiguous_as_wide', True) pd.set_option('display.unicode.east_asian_width', True) columns_list = ["白天天气", "晚上天气", "白天温度", "晚上温度", "日出时间", "日落时间", "平均温度", "风力等级", "降水量", "平均湿度"] df = pd.DataFrame(totle_city_list, index=city_list, columns=columns_list) df.name = "城市气候总结" # 把表格打印出来 df.to_excel('城市气候总结.xlsx') # 所有城市列表 city_list = [] # 每个城市数据 totle_city_list = [] mainpage()

 


2.对数据进行清洗和处理

import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series
from pylab import mpl

# 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解决保存图像是负号'-'显示为方块的问题
mpl.rcParams['axes.unicode_minus'] = False
# 数据对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
# 读取爬到的数据
df = pd.read_excel(r'D:\pycharm\workspace\城市气候总结.xlsx')
df.shape
print(df.head())
# 查看是否有重复值
print(df.duplicated())
# 数据去重
df.drop_duplicates(['title', 'username']).shape
# 查看数据的整体分布
print(df.describe())

 

4.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)

 

# 可以观察此数据来选择适合自己居住的城市
#
平均湿度前十的城市 print(df.sort_values('平均湿度',ascending=False).head(10)) # 降水量前十的城市 print(df.sort_values('降水量',ascending=False).head(10)) # 风力等级前十的城市 print(df.sort_values('风力等级',ascending=False).head(10))

 

Python高级应用程序设计任务_第4张图片

Python高级应用程序设计任务_第5张图片

Python高级应用程序设计任务_第6张图片

 

# 了解这一天全国的白天天气和晚上天气的情况
daytime_list = []
for val in df['白天天气'].dropna():
    daytime_list.append(val)
daytime_series = Series(daytime_list).drop_duplicates()
print(daytime_series)
daynight_list = []
for val in df['晚上天气'].dropna():
    daynight_list.append(val)
daynight_series = Series(daynight_list).drop_duplicates()
print(daynight_series)

Python高级应用程序设计任务_第7张图片Python高级应用程序设计任务_第8张图片

# 观察风力等级和湿度之间的联系
plt.scatter(df['风力等级'], df['平均湿度'])
plt.show()

 

Python高级应用程序设计任务_第9张图片

 


5.数据持久化

# 把表格打印出来
df.to_excel('城市气候总结.xlsx')

Python高级应用程序设计任务_第10张图片

Python高级应用程序设计任务_第11张图片

 

四、结论(10分)

1.经过对主题数据的分析与可视化,可以得到哪些结论?

  根据以上的信息可以发现湿度高的城市基本位于河南地区,降水量大的地方大多数是山东地区,而风力大的地方都在台湾。根据散点图可以观察出大部分地区:风力等级1-2级,平均湿度40-100


2.对本次程序设计任务完成的情况做一个简单的小结。

  通过本次的作业我学到了很多的知识,发现这门课学的是真的有趣,也希望今后能够多多学习本课程。

你可能感兴趣的:(Python高级应用程序设计任务)