Python高级应用程序设计任务
Python高级应用程序设计任务要求
用Python实现一个面向主题的网络爬虫程序,并完成以下内容:
(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台)
一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称
爬取最好大学网软科中国最好大学排名2019
2.主题式网络爬虫爬取的内容与数据特征分析
爬取的内容:排名、学校名称、省市、总分和指标得分【生源质量(新生高考成绩得分)】等信息。
数据特征分析:统计出每个省份各有几所学校。
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
实现思路:本次爬虫使用scrapy框架的downloader发送request请求并获取网页数据,通过spider清洗数据,使用item pipeline将获取的数据进行写入excel的操作。
技术难点:openpyxl、matplotlib、scrapy的综合使用。
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征
1.主题页面的结构特征
此页面如下:

2.Htmls页面解析
通过F12查看网页源代码,下面是部分源代码的截图,红色框是我们需要获取的具体数据。

通过Elements分析可知,每一个院校都放在了一个tr中,排名在tr标签的第一个td中,学校名称在tr标签的第二个td标签中,省市在tr标签的第三个td标签中,总分在tr标签的第四个td标签中,指标得分在tr标签的第五个td中。
3.节点(标签)查找方法与遍历方法
(必要时画出节点树结构)
(必要时画出节点树结构)
首先通过response.xpath获取所有tr的列表(所有学校的列表),然后循环遍历这个列表,得到每一个学校的所有信息,使用xpath语法,tr/td[1]/text()获取学校排名,使用tr/td[2]/div/text()获取学校名称,使用tr/td[3]/text()获取省份,使用tr/td[4]/text()获取总分,使用tr/td[5]/text()获取指标得分。
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集

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

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

6.附完整程序代码
本任务是使用scrapy框架完成的
best_university_spider.py中
import scrapy from china_best_university.items import ChinaBestUniversityItem class BestUniversitySpiserSpider(scrapy.Spider): name = 'best_university_spider' # 爬虫名字 start_urls = ['http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html'] # 爬取初始地址 def parse(self, response): item = ChinaBestUniversityItem() all_tr_list = response.xpath('//tbody/tr') for every_td in all_tr_list: item['ranking'] = every_td.xpath('td[1]/text()').extract() # 获取排名 item['name'] = every_td.xpath('td[2]/div/text()').extract() # 获取名字 item['area'] = every_td.xpath('td[3]/text()').extract() # 获取省份 item['total_score'] = every_td.xpath('td[4]/text()').extract() # 获取总分 item['index_score'] = every_td.xpath('td[5]/text()').extract() # 获取指标得分 yield item
pipelines.py中
from collections import Counter from matplotlib import pyplot from openpyxl import Workbook list_x = [] class ChinaBestUniversityPipeline(object): def __init__(self): self.wb = Workbook() self.ws = self.wb.active self.ws.append(['排名', '学校名称 ', '省市', '总分 ', '指标得分']) def process_item(self, item, spider): line = [item['ranking'][0], item['name'][0], item['area'][0], item['total_score'][0], item['index_score'][0]] # 写入爬取的数据 self.ws.append(line) self.wb.save('bestunversity.xlsx') # 保存 list_x.append(item['area'][0]) # 爬取的数据添加到全局变量的list_x中,用于关闭爬取的close_spider时的数据分析 def close_spider(self, item): global list_x # 解包字典,获取x轴和y轴的数据列表 x = list(Counter(list_x).keys()) y = list(Counter(list_x).values()) print(Counter(list_x)) # 设置matplotlib正常显示中文和负号 pyplot.rcParams['font.sans-serif'] = ['SimHei'] pyplot.rcParams['axes.unicode_minus'] = False # 生成画布 pyplot.figure(figsize=(20, 8), dpi=80) # 画图 pyplot.bar(x, y, width=0.5, color=['b', 'r', 'g', 'y', 'c', 'm', 'y', 'k', 'c', 'b', 'r']) # 保存图片 pyplot.savefig('bestunarea.png') # 显示图片 pyplot.show()
settings.py中
BOT_NAME = 'china_best_university' SPIDER_MODULES = ['china_best_university.spiders'] NEWSPIDER_MODULE = 'china_best_university.spiders' USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36' ROBOTSTXT_OBEY = False ITEM_PIPELINES = { 'china_best_university.pipelines.ChinaBestUniversityPipeline': 300, # 开启中间件 } LOG_LEVEL = 'WARNING'
items.py中
import scrapy class ChinaBestUniversityItem(scrapy.Item): ranking = scrapy.Field() # 排名 name = scrapy.Field() # 名称 area = scrapy.Field() # 省份 total_score = scrapy.Field() # 总分 index_score = scrapy.Field() # 指标得分
最后:打开terminal,输入scrapy crawl best_university_spider,回车,然后我们所想要的结果就有了。
中间省略
四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
1.经过对主题数据的分析与可视化,可以得到哪些结论?
可以得到这些结论:中国最好的大学在北京有39所,江苏有37所,河南有30所等。
2.对本次程序设计任务完成的情况做一个简单的小结。
2.对本次程序设计任务完成的情况做一个简单的小结。
通过这次作业,我知道了自己真的欠缺太多了。为了完成这次任务,进行了自学,查阅资料,请教同学和朋友,做了一遍又一遍,还爬取了两个例子,主要是在代码编写的过程中遇到很多问题。提交格式先在Word中进行草稿,最后才在博客园中进行提交。不过也收获了很多,首先对scrapy框架的整体有了一个充分的认识;其次对数据分析的作用有了深刻的了解,真正了解了数据分析的意义;最后,对于python操作excel的模块进行了系统的学习,这在今后的工作中是可以充分利用的。
posted on 2019-12-21 14:56 chenxiaofang 阅读(291) 评论(0) 收藏 举报