Python高级应用程序设计任务

Python高级应用程序设计任务要求

用Python实现一个面向主题的网络爬虫程序,并完成以下内容:
(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台)

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

   爬取广州的2019第一季度天气

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

   爬取内容:最高气温,最低气温和天气状况。

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

  实现思路:1.确定目标   2.请求网页(requests库)   3.解析网页(BeautifulSoup库)   4.保存数据

  技术难点:会因为字符或符号错误,导致运行失败;split切片还得学习;数据格式化的相关代码格式

   

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

 

 

 


2.Htmls页面解析

 

 

 


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

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

import requests
from bs4 import BeautifulSoup
import pandas as pd

def get_data(url):
    #1.确定目标
    #url = 'http://www.tianqihoubao.com/lishi/guangzhou/month/201901.html'
    # 2.请求网页
    #文本形式返回网页源代码
    resp = requests.get(url)
    #print(resp.text)
    #二进制返回网页内容
    html = resp.content.decode('gbk')
    #3.解析网页
    soup = BeautifulSoup(html,'html.parser')
    #print(soup)
    tr_list = soup.find_all('tr')
    #print(tr_list)
    dates,conditions,temp = [],[],[]  #同步赋值
    for data in tr_list[1:]:          #切片
        sub_data = data.text.split()  #获取文字内容
        print(sub_data)
        #数据追加,放进列表
        dates.append(sub_data[0])
        conditions.append(''.join(sub_data[1:3])) #join两个字符串拼接
        print(conditions)
        temp.append(''.join(sub_data[3:6]))
        print(temp)
        
   
    #数据放进表格
    _data = pd.DataFrame() 
    _data['日期'] = dates
    _data['天气状况'] = conditions
    _data['气温'] = temp
    
    
    return _data

data_1_month = get_data('http://www.tianqihoubao.com/lishi/guangzhou/month/201901.html')
data_2_month = get_data('http://www.tianqihoubao.com/lishi/guangzhou/month/201902.html')
data_3_month = get_data('http://www.tianqihoubao.com/lishi/guangzhou/month/201903.html')

#把表格拼接在一起(默认上下拼接)
data = pd.concat([data_1_month,data_2_month,data_3_month]).reset_index(drop=True) 
#4.保存数据
data.to_csv('guangzhou.csv',index=False,encoding='utf-8')
#get_data()

 

 

 

 

 

 

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

#读取数据
pd.read_csv('guangzhou.csv')
data

 

 

 

#数据清洗
#空值检查
#data.isnull()
(data.isnull()).sum()

 

 

 

#异常值处理
data.describe()

 

 

 

#数据处理

data['最高气温']=data['气温'].str.split('/',expand=True)[0]
data['最低气温']=data['气温'].str.split('/',expand=True)[1]
data.head()

 

 

 

#字符串处理
data['最高气温'] = data['最高气温'].map(lambda x:int(x.replace('','')))
data['最低气温'] = data['最低气温'].map(lambda x:int(x.replace('','')))
data

 

 

 


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

import pandas as pd
from matplotlib import pyplot as plt
#解决中文问题
plt.rcParams['font.sans-serif'] = ['SimHei']
#解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False
%matplotlib inline

#数据可视化
dates = data['日期']
highs = data['最高气温']
lows = data['最低气温']


#根据数据绘画图形
fig = plt.figure(dpi=128,figsize=(10,6))

plt.plot(dates, highs, c='red', alpha=0.5)
plt.plot(dates, lows, c='blue', alpha=0.5)

#绘图表区域着色
plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.2)  #fill_etween(x, y, y,facecolor, alpha)
#alpha值指定颜色的透明度(0为完全透明,1为完全不透明)


#设置图形的样式
plt.title('2019第一季度天气', fontsize=24)
plt.xlabel('日期', fontsize=12)
fig.autofmt_xdate() #绘制斜的日期标签,以免重叠
plt.ylabel('气温', fontsize=12)
plt.tick_params(axis='both', which='major', labelsize=10)

#修改刻度
plt.xticks(dates[::20])

#显示2019年每日最高气温折线图
plt.show()

 

 

 

#图形样式
#显示大小,宽高
fig = plt.figure(dpi=128,figsize=(10,6))
plt.scatter(dates, highs)
plt.title('2019第一季度天气', fontsize=24)

plt.xlabel('日期', fontsize=12)
fig.autofmt_xdate() #绘制斜的日期标签,以免重叠
plt.ylabel('气温', fontsize=12)

#修改刻度
plt.xticks(dates[::20])

#显示气温与最高温度的散点图
plt.show()

 

 

 

import seaborn as sns
#小提琴图
sns.violinplot(data['最高气温'])
sns.violinplot(data['最低气温'])

 

 

 

 

 

 

 

#直方图
sns.distplot(data['最高气温'])
#最低气温直方图
sns.distplot(data['最低气温'])

 

 

 

 

 

 

 


5.数据持久化

 

 

 


6.附完整程序代码

import requests
from bs4 import BeautifulSoup
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns


def get_data(url):
    #1.确定目标
    #url = 'http://www.tianqihoubao.com/lishi/guangzhou/month/201901.html'
    # 2.请求网页
    #文本形式返回网页源代码
    resp = requests.get(url)
    #print(resp.text)
    #二进制返回网页内容
    html = resp.content.decode('gbk')
    #3.解析网页
    soup = BeautifulSoup(html,'html.parser')
    #print(soup)
    tr_list = soup.find_all('tr')
    #print(tr_list)
    dates,conditions,temp = [],[],[]  #同步赋值
    for data in tr_list[1:]:          #切片
        sub_data = data.text.split()  #获取文字内容
        print(sub_data)
        #数据追加,放进列表
        dates.append(sub_data[0])
        conditions.append(''.join(sub_data[1:3])) #join两个字符串拼接
        print(conditions)
        temp.append(''.join(sub_data[3:6]))
        print(temp)
        
   
    #数据放进表格
    _data = pd.DataFrame() 
    _data['日期'] = dates
    _data['天气状况'] = conditions
    _data['气温'] = temp
    
    
    return _data

data_1_month = get_data('http://www.tianqihoubao.com/lishi/guangzhou/month/201901.html')
data_2_month = get_data('http://www.tianqihoubao.com/lishi/guangzhou/month/201902.html')
data_3_month = get_data('http://www.tianqihoubao.com/lishi/guangzhou/month/201903.html')

#把表格拼接在一起(默认上下拼接)
data = pd.concat([data_1_month,data_2_month,data_3_month]).reset_index(drop=True) 
#4.保存数据
data.to_csv('guangzhou.csv',index=False,encoding='utf-8')
#get_data()

#读取数据
pd.read_csv('guangzhou.csv')
data

#数据清洗
#空值检查
#data.isnull()
(data.isnull()).sum()

#异常值处理
data.describe()

#数据处理

data['最高气温']=data['气温'].str.split('/',expand=True)[0]
data['最低气温']=data['气温'].str.split('/',expand=True)[1]
data.head()

#字符串处理
data['最高气温'] = data['最高气温'].map(lambda x:int(x.replace('','')))
data['最低气温'] = data['最低气温'].map(lambda x:int(x.replace('','')))
data



#解决中文问题
plt.rcParams['font.sans-serif'] = ['SimHei']
#解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False
%matplotlib inline

#数据可视化
dates = data['日期']
highs = data['最高气温']
lows = data['最低气温']


#根据数据绘画图形
fig = plt.figure(dpi=128,figsize=(10,6))

plt.plot(dates, highs, c='red', alpha=0.5)
plt.plot(dates, lows, c='blue', alpha=0.5)

#绘图表区域着色
plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.2)  #fill_etween(x, y, y,facecolor, alpha)
#alpha值指定颜色的透明度(0为完全透明,1为完全不透明)


#设置图形的样式
plt.title('2019第一季度天气', fontsize=24)
plt.xlabel('日期', fontsize=12)
fig.autofmt_xdate() #绘制斜的日期标签,以免重叠
plt.ylabel('气温', fontsize=12)
plt.tick_params(axis='both', which='major', labelsize=10)

#修改刻度
plt.xticks(dates[::20])

#显示2019年每日最高气温折线图
plt.show()

#图形样式
#显示大小,宽高
fig = plt.figure(dpi=128,figsize=(10,6))
plt.scatter(dates, highs)
plt.title('2019第一季度天气', fontsize=24)

plt.xlabel('日期', fontsize=12)
fig.autofmt_xdate() #绘制斜的日期标签,以免重叠
plt.ylabel('气温', fontsize=12)

#修改刻度
plt.xticks(dates[::20])

#显示气温与最高温度的散点图
plt.show()

#小提琴图
sns.violinplot(data['最高气温'])
sns.violinplot(data['最低气温'])

#直方图
sns.distplot(data['最高气温'])
#最低气温直方图
sns.distplot(data['最低气温'])

 

 

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

    (1)1月份中旬温差最大

    (2)广州即使是冬天温度也没有零下摄氏度

    (3)最高温度集中在20摄氏度到25摄氏度之间,最低气温在15摄氏度左右
2.对本次程序设计任务完成的情况做一个简单的小结。  

   经过这次的爬虫任务,复习了学过的知识,并运用到实际中,收获很多,还有很多内容需要继续学习的,爬取数据太少,还有待提高。

posted @ 2019-12-21 13:57  欧梅芳  阅读(497)  评论(0编辑  收藏  举报