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.对本次程序设计任务完成的情况做一个简单的小结。
经过这次的爬虫任务,复习了学过的知识,并运用到实际中,收获很多,还有很多内容需要继续学习的,爬取数据太少,还有待提高。