鱼C论坛

 找回密码
 立即注册
查看: 2418|回复: 2

[学习笔记] 爬取2019全国大学排名

[复制链接]
发表于 2020-3-26 16:58:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 233倔强不秃 于 2020-3-26 16:59 编辑

爬取2019全国大学排名


一、准备

        获取排名首先需要一个靠谱的URL:最好大学,这个网站的数据是比较权威的。其次我们需要用python的第三方库:BeautifulSoup库和requests库。


二、梳理思路:

        (1)导入BeautifulSoup库和requests库,用requests库获取网页的源代码,用BeautifulSoup将html文本做成一锅汤

        (2)右键查看网页源代码,看一下数据是不是js动态生成的。可以用Ctrl+F直接搜索。比如搜索清华大学,可以发现排名信息是能找到的,所以不是动态生成的。

        (3)经观察发现这些排名信息都在<tbody>标签下的<tr>标签中,每个<tr>包含了一个大学的所有信息,这些信息在<td>标签下

        (4)使用BeautifulSoup库解析,从网页源代码中提取<tbody>-<tr>-<td>

        (5)从中提取有效信息,存到本地的文件中


三、编写函数:

        编写三个函数,分别是:

        (1)openURL 用于获取页面的html文本信息

        (2)getUinfo 提取排行榜等相关信息

        (3)saveUinfo 将获取到的信息保存到本地
       

四、细节剖析:

        openURL中:

        (1)向服务器提交申请时,服务器会检查申请的来源,发现来自python会进行屏蔽,所以通过更改headers参数解决。

        (2)运用try-except语句进行异常检测,requests库中的r.raise_for_status()函数可以获取状态码(正常打开为200),不能正常打开时引发异常

        (3)进行编码转换  r.encoding = r.apparent_encoding
       
        getUinfo中:

        (1)用BeautifulSoup库的find函数找到<tbody>的孩子标签<tr>,再从<tr>中找<td>时,用instance函数可以过滤掉不为“bs4.Element.Tag”的内容

        (2)从<tr>标签下获取到的所有<td>标签为一个列表,而我们要提取的内容是每个学校的四项基本信息(排名,学校名称,省市,总分),还有总的排行榜,所有用列表中嵌套列表的存储方法最为合适。

                则append函数的参数应该也是一个列表。

        saveUinfo中:

        (1)保存时直接写入就可以,不用以二进制写入,因为已经进行了编码转换
       
        (2)保存的格式可以用 format 函数来控制,这里应该特别注意一下 format 的运用。存在一个中文对齐的问题。

五、源代码:
import requests
from bs4 import BeautifulSoup
import bs4 


def openURL(url):
    head = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'}
    try:
        r = requests.get(url, headers = head, timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text 
    except:
        return '网页打开异常'


def getUinfo(ulist, html):
    soup = BeautifulSoup(html, 'html.parser')
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')
            ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])
    return ulist
        

def saveUinfo(ulist):
    with open('F:\\Python demo\\爬虫\\2019大学排名.txt', 'w') as f:
        tplt = '\t\t{0:^10}\t\t {1:{4}^10} \t {2:^10} \t {3:^10}\n\n'
        f.write(tplt.format('排名', '学校名称', '省市', '总分', chr(12288)))
        for u in ulist:
            f.write(tplt.format(u[0], u[1], u[2], u[3], chr(12288)))


if __name__ == '__main__':
    uinfo = []
    url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html'
    html = openURL(url)
    ulist = getUinfo(uinfo, html)
    saveUinfo(ulist)
    
    


六、心得
        看完排名很自闭

附件:

2019大学排名.rar

5.83 KB, 下载次数: 0

评分

参与人数 1荣誉 +2 鱼币 +3 贡献 +3 收起 理由
不二如是 + 2 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-26 17:18:42 | 显示全部楼层
不错哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 17:25:14 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-3-15 02:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表