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

python高级应用程序设计任务

时间:2019-12-21 13:25:44      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:color   except   中间   bsp   主题   陕西   idt   das   panda   

一、主题式网络爬虫设计方案(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高级应用程序设计任务

标签:color   except   中间   bsp   主题   陕西   idt   das   panda   

原文地址:https://www.cnblogs.com/Jane-zone/p/12076606.html

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