首页 > 编程语言 > 详细

Python高级应用程序设计任务

时间:2019-12-21 14:48:30      阅读:134      评论:0      收藏:0      [点我收藏+]

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.对本次程序设计任务完成的情况做一个简单的小结。  

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

Python高级应用程序设计任务

原文:https://www.cnblogs.com/Oumeifang/p/12076742.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!