《Python 编程》大作业
学院(系):
软件学院
专 业:
软件工程
学 生:
指导教师:
完成日期 2018 年 12 月
目录
1 引言........................................................................................................................................ 1
1.1 选题背景及意义......................................................................................................... 1
1.2 开发目标..................................................................................................................... 1
2 技术简介................................................................................................................................ 1
2.1 开发环境..................................................................................................................... 1
2.2 Python..........................................................................................................................1
3 需求分析................................................................................................................................ 1
3.1 功能性需求分析......................................................................................................... 1
3.1.1 功能描述.......................................................................................................... 1
4 系统设计................................................................................................................................ 2
5 系统实现................................................................................................................................ 4
6 系统测试................................................................................................................................ 8
6.1 测试目的..................................................................................................................... 8
6.2 测试技术..................................................................................................................... 9
6.3 测试模块..................................................................................................................... 9
6.4 测试结果..................................................................................................................... 9
参考文献.................................................................................................................................. 11
1 引言
爬虫就是一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信
息,python 作为当前比较火热的语言
1.1 选题背景及意义
现如今空气质量已经成为了全国人民共同关注的问题,随着社会的不断进步与发展,
越来越多的人开始选择去北京、上海、广州、深圳这几个城市去发展,所以我用网络爬
虫,爬取了 2018 年截至到目前为止,北上广深这四个城市的空气质量的数据,并对此
做出了分析,全方位比较这四个城市空气质量的差异。为将要去北上广深工作的人们,
提供一些关于这些城市空气质量的参考。
1.2 开发目标
本文设计的是基于 window10 开发的,本应用的功能主要是爬取了 2018 年截至到目
前为止,北上广深这四个城市的空气质量的数据,并对此做出了分析,全方位比较这四
个城市空气质量的差异本文对应用进行了开发设计。
2 技术简介
网络爬虫(又被称为网页蜘蛛,网络机器人,在 FOAF 社区中间,更经常的称为网页追
逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不
常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
2.1 开发环境
操作系统:window10;
开发语言:Python
2.2 Python
Python 是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言,最初被
设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越
多被用于独立的、大型项目的开发。
3 需求分析
3.1 功能性需求分析
3.1.1 功能描述
网络爬虫是从 web 中发现,下载以及存储内容,是搜索引擎的核心部分。传统爬虫
从一个或若干初始网页的 URL 开始,获得初始网页上的 URL,在抓取网页的过程中,不断
从当前页面上抽取新的 URL 放入队列,直到满足系统的一定条件为止。对于此次空气质
1
量数据的爬取,我选择了天气后报这个网站(http://www.tianqihoubao.com/),主要
爬取 2018 年一月到十二月,北上广深这四个城市的空气质量等级,AQI 指数,当天 AQI
排名,PM2.5 指数。然后利用 python 进行数据分析,将数据以可视化的形式展现出来。
4 系统设计
4.1 总体设计
在本爬虫程序中共有三个模块:
1. 爬虫调度端:启动爬虫,停止爬虫,监视爬虫的运行情况
2. 爬虫模块:包含三个小模块,URL 管理器,网页下载器,网页解析器。
(1)URL 管理器:对需要爬取的 URL 和已经爬取过的 URL 进行管理,可
以从 URL 管理器中取出一个带爬取的 URL,传递给网页下载器。
(2)网页下载器:网页下载器将 URL 指定的网页下载下来,存储成一个
字符串,传递给网页解析器。
(3)网页解析器:网页解析器解析传递的字符串,解析器不仅可以解析出
需要爬取的数据,而且还可以解析出每一个网页只想其他网页的 URL,这
些 URL 被解析出来会补充进 URL 管理器
3、数据输出模块:存储爬取的数据
4.2 设计环境和目标分析
设计环境
IDE:pycharm
Python 版本:python3
目标分析
1、初始 URL:www.tianqihoubao.com/aqi 先通过 url 获取到网页。
2、数据格式
2
3、页面编码:UTF—8
4.3 爬虫运行流程分析
爬虫基本流程
发起请求
通过 HTTP 库向目标服务器发送 Request,Request 内可以包含额外的
headers 信息。
获取响应内容
如果服务器正常响应,会返回 Response, 里面包含的就是该页面的内容。
解析数据
内容或许是 HTML,可以用正则表达式、网页解析库进行解析。
或许是 Json,可以直接转换为 Json 对象解析。
保存数据
可以存储为文本,也可以保存至数据库,或其他特定类型文件。
Request 和 Response
Request
主机向服务器发送数据请求时的过程叫做 HTTP Request
Response
服务器向主机返回数据的过程叫做 HTTP Response
Request 中包含的内容
请求方式
常用的有 GET,POST 两种类型。
GET
这种请求方式的参数都包含在网址里面。
POST
这种请求方式的参数包含在请求体中的 form data 中。相对安全。
URL
请求的网络链接。
请求头
包含请求时的头部信息。如:User-Agent、Host、Cookies 等。
User-Agent
3
指定浏览器。
请求体
GET 请求下一般情况请求体中不会包含重要信息。
POST 请求中包含重要信息。
Response 中包含的内容
响应状态
Status Code:200
即状态码,一般 200 表示响应成功。
响应头
Response Headers
内容类型,内容长度,服务器信息,设置 Cookie 等。
响应体
请求资源的内容,如网页源代码,二进制数据等。
5 系统实现
爬取代码
import time
import requests
from bs4 import BeautifulSoup
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
for i in range(len(citys)):
time.sleep(5)
for j in range(1, 13):
time.sleep(5)
# 请求 2018 年各月份的数据页面
url = 'http://www.tianqihoubao.com/aqi/' + citys[i] + '-2018' + str("%02d" % j) +
'.html'
# 有请求头(键值对形式表示请求头)
response = requests.get(url=url, headers=headers)
# html 字符串创建 BeautifulSoup 对象
soup = BeautifulSoup(response.text, 'html.parser')
tr = soup.find_all('tr')
4
for k in tr[1:]:
td = k.find_all('td')
# 日期
Date = td[0].get_text().strip()
# 质量等级
Quality_grade = td[1].get_text().strip()
# AQI 指数
AQI = td[2].get_text().strip()
# 当天 AQI 排名
AQI_rank = td[3].get_text().strip()
# PM2.5
PM = td[4].get_text()
# 数据存储
filename = 'air_' + citys[i] + '_2018.csv'
with open(filename, 'a+', encoding='utf-8-sig') as f:
f.write(Date + ',' + Quality_grade + ',' + AQI + ',' + AQI_rank + ',' + PM +
'\n')
分析代码
import numpy as np
import pandas as pd
from pyecharts import Line
citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
v = []
for i in range(4):
filename = 'air_' + citys[i] + '_2018.csv'
df = pd.read_csv(filename, header=None, names=["Date", "Quality_grade", "AQI",
"AQI_rank", "PM"])
dom = df[['Date', 'AQI']]
list1 = []
for j in dom['Date']:
time = j.split('-')[1]
list1.append(time)
df['month'] = list1
month_message = df.groupby(['month'])
month_com = month_message['AQI'].agg(['mean'])
month_com.reset_index(inplace=True)
month_com_last = month_com.sort_index()
v1 = np.array(month_com_last['mean'])
v1 = ["{}".format(int(i)) for i in v1]
v.append(v1)
attr = ["{}".format(str(i) + '月') for i in range(1, 12)]
line = Line("2018 年北上广深 AQI 全年走势图", title_pos='center', title_top='0', width=800,
5
height=400)
line.add("北京", attr, v[0], line_color='red', legend_top='8%')
line.add("上海", attr, v[1], line_color='purple', legend_top='8%')
line.add("广州", attr, v[2], line_color='blue', legend_top='8%')
line.add("深圳", attr, v[3], line_color='orange', legend_top='8%')
line.render("2018 年北上广深 AQI 全年走势图.html")
import numpy as np
import pandas as pd
from pyecharts import Pie, Grid
citys = ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
v = []
attrs = []
for i in range(4):
filename = 'air_' + citys[i] + '_2018.csv'
df = pd.read_csv(filename, header=None, names=["Date", "Quality_grade", "AQI",
"AQI_rank", "PM"])
rank_message = df.groupby(['Quality_grade'])
rank_com = rank_message['Quality_grade'].agg(['count'])
rank_com.reset_index(inplace=True)
rank_com_last = rank_com.sort_values('count', ascending=False)
attr = rank_com_last['Quality_grade']
attr = np.array(rank_com_last['Quality_grade'])
attrs.append(attr)
v1 = rank_com_last['count']
v1 = np.array(rank_com_last['count'])
v.append(v1)
pie1 = Pie("北京", title_pos="28%", title_top="24%")
pie1.add("",
legend_top="51%", legend_orient="horizontal",)
radius=[25,
attrs[0],
v[0],
40],
center=[30,
27],
legend_pos="27%",
pie2 = Pie("上海", title_pos="58%", title_top="24%")
pie2.add("",
is_legend_show=False)
radius=[25, 40],
attrs[1], v[1],
center=[60, 27],
is_label_show=False,
pie3 = Pie("广州", title_pos='28%', title_top='77%')
pie3.add("",
is_legend_show=False)
radius=[25, 40],
attrs[2], v[2],
pie4 = Pie("深圳", title_pos='58%', title_top='77%')
pie4.add("",
is_legend_show=False)
radius=[25, 40],
attrs[3], v[3],
center=[30, 80],
is_label_show=False,
center=[60, 80],
is_label_show=False,
grid = Grid("2018 年北上广深全年空气质量情况", width=1200)
6