python高级应用程序设计任务

Posted 周倩倩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python高级应用程序设计任务相关的知识,希望对你有一定的参考价值。

一、主题式网络爬虫设计方案(15分)

1.主题式网络爬虫名称

软科中国最好医科大学排名2019,爬取中国最好医科大学排名、学校名称、省市、总分、指标得分(生源质量(新生高考成绩得分))等信息

2.主题式网络爬虫爬取的内容与数据特征分析

爬取内容:爬取中国最好医科大学排名、学校名称、省市、总分、指标得分(生源质量(新生高考成绩得分))等信息

3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)

本案例使用requests库获取网页数据,使用beautifulSoup库解析页面内容,再使用pandas库把爬取的数据输出

技术难点:数据清洗过程,使用beautifulSoup库对爬取到的页面进行数据提取的过程

二、主题页面的结构特征分析(15分)

1.主题页面的结构特征

页面内容如下,本方案要爬取的是表格中的内容。

2.Htmls页面解析

通过F12,对页面进行检查,查看我们所需要爬取内容的相关代码。

 

通过requests.get(url)向服务器提交请求,用soup.prettify()方法输出代码:

3.节点(标签)查找方法与遍历方法

 

分析html代码,做个简要的分析,如下图:

可以看到每一个学校的数据都放在一个tr(行)里,排名放在tr的第一个td(单元格)中,学校名称放在tr的第二个td中,省市放在tr的第三个td中,总分放在tr的第四个td中,指标得分放在tr的第五个td中。

三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分:数据抓取及解析、数据提取、保存数据。

(1)数据抓取及解析

用requests抓取网页信息,采用了异常捕捉技术,在程序异常时返回提示信息。

import requests
from bs4 import BeautifulSoup
url=\'http://www.zuihaodaxue.com/zuihaoyikedaxuepaiming2019.html\'
def getHTMLText(url):
    try:
        kv = {\'Cookie\':\'SINAGLOBAL=4844987765259.994.1544506324942; \\
              SUB=_2AkMqmKIaf8NxqwJRmPoVxWnmaIV-ygDEieKcxFPBJRMxHRl-yT9jqmc8tRB6ARiM9rPSLjsy2kCgBq61u7x2M9eTeKTA; \\
              SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WFYIzVSU-rQ8YIqH5sJ2vs7; \\
              login_sid_t=6f2f5ed24c4e1f2de505c160ca489c97; cross_origin_proto=SSL;\\
              _s_tentry=www.baidu.com; UOR=,,www.baidu.com; Apache=9862472971727.955.1575730782698; \\
              ULV=1575730782710:6:1:1:9862472971727.955.1575730782698:1569219490864; \\
              YF-Page-G0=b7e3c62ec2c0b957a92ff634c16e7b3f|1575731639|1575731637\',\\
              \'user-agent\':\'Mozilla/5.0\',\\
             \'Accept\':\'textml,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\'}
        r=requests.get(url,headers = kv)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return \'产生异常\'

 

(2)数据提取

使用beautifulSoup创建soup对象,用于解析页面内容,用find()找到对应标签,再在标签中遍历元素,将其中的内容添加到temp_list中,最后返回final_list。

html=getHTMLText(url)
soup=BeautifulSoup(html,\'html.parser\')
# print(soup.prettify)
final_list=[]
def get_uniInfo(html,final_list):

    soup=BeautifulSoup(html,\'html.parser\')
    body=soup.body
    data=body.find(\'tbody\',{\'class\':\'hidden_zhpm\'})
    trs=data.find_all(\'tr\')
    for uniInfo in trs:
        temp_list=[]
        info=uniInfo.find_all(\'td\') #寻找所有的td标签
        temp_list.append(info[0].string) #找到td标签下的第一个值(排名)
        temp_list.append(info[2].string) #找到td标签下的第三个值(省市)
        temp_list.append(info[3].string) #找到td标签下的第四个值(总分)
        # print(info[0].string,info[2].string,info[3].string)
        # temp_list.append([info[0].string,info[2].string,info[3].string])
        if info[1].find(\'div\'): #找到td标签下的第二个值(学校名称),带有div,这是学校名称的特有标签
            university=info[1].find(\'div\').string
            temp_list.append(university)
        if info[4].find(\'td\',{\'class\':\'hidden-xs need-hidden indicator5\'}):  #找到td标签下的第五个值(指标得分),带有class,这是指标得分的特有属性
            score=info[4].find(\'td\',{\'class\':\'hidden-xs need-hidden indicator5\'}).string
            #score未爬取到,打印不出来
            temp_list.append(score)
        # temp_list.append([university,score])
        # print(temp_list)
        final_list.append(temp_list)
    print(final_list)

get_uniInfo(html,final_list)

 

(3)保存数据

使用pandas库将获取到的列表转换为DataFrame对象,再使用to_csv()方法生成指定名称的文件

import pandas as pd
# df=pd.DataFrame(final_list,columns=[\'排名\',\'学校名称\',\'省市\',\'总分\',\'指标得分\'])
df=pd.DataFrame(final_list,columns=[\'排名\',\'省市\',\'总分\',\'学校名称\'])
df.to_csv(\'medical-university.csv\',encoding="utf-8") #指定文件名称

 

 (中间两页内容省略...)

(4)数据可视化(用柱状图反映)

import matplotlib.pyplot as plt
import numpy as np
plt.figure()

plt.bar([\'安徽\',\'北京\',\'福建\',\'甘肃\',\'广东\',\'广西\',\'贵州\',\'海南\',\'河北\',\'河南\',\'黑龙江\',\'湖北\',\'湖南\',\'吉林\',\'江苏\',\'江西\',\'辽宁\',\'内蒙古\',\'宁夏\',\'山东\',\'山西\',\'陕西\',\'上海\',\'四川\',\'天津\',\'新疆\',\'云南\',\'浙江\',\'重庆\'],[4,3,2,1,5,4,3,1,3,2,4,2,1,2,3,2,5,1,1,5,2,2,1,4,2,1,2,2,1])

# 显示图像
plt.show()

 

 

 

完整程序代码:

 

import requests
from bs4 import BeautifulSoup
url=\'http://www.zuihaodaxue.com/zuihaoyikedaxuepaiming2019.html\'
def getHTMLText(url):
    try:
        kv = {\'Cookie\':\'SINAGLOBAL=4844987765259.994.1544506324942; \\
              SUB=_2AkMqmKIaf8NxqwJRmPoVxWnmaIV-ygDEieKcxFPBJRMxHRl-yT9jqmc8tRB6ARiM9rPSLjsy2kCgBq61u7x2M9eTeKTA; \\
              SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WFYIzVSU-rQ8YIqH5sJ2vs7; \\
              login_sid_t=6f2f5ed24c4e1f2de505c160ca489c97; cross_origin_proto=SSL;\\
              _s_tentry=www.baidu.com; UOR=,,www.baidu.com; Apache=9862472971727.955.1575730782698; \\
              ULV=1575730782710:6:1:1:9862472971727.955.1575730782698:1569219490864; \\
              YF-Page-G0=b7e3c62ec2c0b957a92ff634c16e7b3f|1575731639|1575731637\',\\
              \'user-agent\':\'Mozilla/5.0\',\\
             \'Accept\':\'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\'}
        r=requests.get(url,headers = kv)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return \'产生异常\'
html=getHTMLText(url)
soup=BeautifulSoup(html,\'html.parser\')
# print(soup.prettify)
final_list=[]
def get_uniInfo(html,final_list):

    soup=BeautifulSoup(html,\'html.parser\')
    body=soup.body
    data=body.find(\'tbody\',{\'class\':\'hidden_zhpm\'})
    trs=data.find_all(\'tr\')
    for uniInfo in trs:
        temp_list=[]
        info=uniInfo.find_all(\'td\') #寻找所有的td标签
        temp_list.append(info[0].string) #找到td标签下的第一个值(排名)
        temp_list.append(info[2].string) #找到td标签下的第三个值(省市)
        temp_list.append(info[3].string) #找到td标签下的第四个值(总分)
        # print(info[0].string,info[2].string,info[3].string)
        # temp_list.append([info[0].string,info[2].string,info[3].string])
        if info[1].find(\'div\'): #找到td标签下的第二个值(学校名称),带有div,这是学校名称的特有标签
            university=info[1].find(\'div\').string
            temp_list.append(university)
        if info[4].find(\'td\',{\'class\':\'hidden-xs need-hidden indicator5\'}):  #找到td标签下的第五个值(指标得分),带有class,这是指标得分的特有属性
            score=info[4].find(\'td\',{\'class\':\'hidden-xs need-hidden indicator5\'}).string
            #score未爬取到,打印不出来
            temp_list.append(score)
        # temp_list.append([university,score])
        # print(temp_list)
        final_list.append(temp_list)
    print(final_list)

get_uniInfo(html,final_list)

import pandas as pd
# df=pd.DataFrame(final_list,columns=[\'排名\',\'学校名称\',\'省市\',\'总分\',\'指标得分\'])
df=pd.DataFrame(final_list,columns=[\'排名\',\'省市\',\'总分\',\'学校名称\'])
df.to_csv(\'medical-university.csv\',encoding="utf-8") #指定文件名称

 

 

三、结论(10分)
1.经过对主题数据的分析与可视化, 可以得到哪些结论?

经过对数据的分析,可以观察到拥有最多排名最好的医学院的地区是:广东、辽宁、山东,都有5所学校。

2.对本次程序设计任务完成的情况做一个简单的小结。

通过本次程序设计任务,对html知识进行了回顾,也对本学期新学习的爬虫技术进行了学习与巩固。对于我来说,这次作业的核心在于数据清洗这块,需要弄清楚所要爬取的数据具体在哪个标签内,我们需要获取数据就要把数据特有的标签给找到,结合beautifulSoup库,对页面的数据进行提取。在做本次作业的过程中,也遇到很多问题,需要和同学交流解决。通过这次作业,对自己web的学习是一次提升,也对python爬虫技术有了一点了解。存在的问题:有一列内容没有爬取出来,不知道是否与下拉列表有关系,存在好几个class属性值。数据可视化部分,不知道如何将存储好的csv文件数据导入到图像中。

以上是关于python高级应用程序设计任务的主要内容,如果未能解决你的问题,请参考以下文章

Python高级应用程序设计任务

Python高级应用程序设计任务

Python高级应用程序设计任务

Python高级应用程序设计任务

Python高级应用程序设计任务

Python高级应用程序设计任务