logo资料库

python实现网络爬虫 爬取北上广深的天气数据报告 python.docx

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
1 引言
1.1 选题背景及意义
1.2 开发目标
2 技术简介
2.1 开发环境
2.2 Python
3 需求分析
3.1 功能性需求分析
3.1.1 功能描述
4 系统设计
5 系统实现
6 系统测试
6.1 测试目的
6.2 测试技术
6.3 测试模块
6.4 测试结果
参考文献
《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
分享到:
收藏