码迷,mamicode.com
首页 > 编程语言 > 详细

Python高级应用程序设计任务

时间:2019-12-21 15:50:40      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:排名   download   param   利用   ram   程序代码   完整   dex   信息   

Python高级应用程序设计任务要求


用Python实现一个面向主题的网络爬虫程序,并完成以下内容:
(注:每人一题,主题内容自选,所有设计内容与源代码需提交到博客园平台)

一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称
爬取最好大学网软科中国最好大学排名2019
2.主题式网络爬虫爬取的内容与数据特征分析
爬取的内容:排名、学校名称、省市、总分和指标得分【生源质量(新生高考成绩得分)】等信息。
数据特征分析:统计出每个省份各有几所学校。
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
实现思路:本次爬虫使用scrapy框架的downloader发送request请求并获取网页数据,通过spider清洗数据,使用item pipeline将获取的数据进行写入excel的操作。

技术难点:openpyxl、matplotlib、scrapy的综合使用。

二、主题页面的结构特征分析(15分)
1.主题页面的结构特征
此页面如下:
技术图片
 

此页面的URL如下:

http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html

请求方法为:GET

技术图片

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.数据爬取与采集

 

技术图片
2.对数据进行清洗和处理

 

技术图片
3.文本分析(可选):jieba分词、wordcloud可视化
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.经过对主题数据的分析与可视化,可以得到哪些结论?
可以得到这些结论:中国最好的大学在北京有39所,江苏有37所,河南有30所等。
2.对本次程序设计任务完成的情况做一个简单的小结。
通过这次作业,我知道了自己真的欠缺太多了。为了完成这次任务,进行了自学,查阅资料,请教同学和朋友,做了一遍又一遍,还爬取了两个例子,主要是在代码编写的过程中遇到很多问题。提交格式先在Word中进行草稿,最后才在博客园中进行提交。不过也收获了很多,首先对scrapy框架的整体有了一个充分的认识;其次对数据分析的作用有了深刻的了解,真正了解了数据分析的意义;最后,对于python操作excel的模块进行了系统的学习,这在今后的工作中是可以充分利用的。

Python高级应用程序设计任务

标签:排名   download   param   利用   ram   程序代码   完整   dex   信息   

原文地址:https://www.cnblogs.com/chenxiaofang/p/12076941.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!