中国大学排名爬虫(基于python中的requests和BeautifulSoup库)

python 中国大学排名爬虫

首先,给一个最好大学网URL:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html,点击这里进入.
在这里插入图片描述

功能描述

输入:大学排名URL链接
输出:大学排名信息的屏幕输出(排名,大学名称,总分)
技术路线:requests‐bs4
定向爬虫:仅对输入URL进行爬取,不扩展爬取

定向爬虫可行性

在最好大学网点击右键,查看源代码,Ctrl+F搜索清华大学,可以到与每一个大学额相关对应的代码部分,如下图:
在这里插入图片描述 可以看到这段代码是使用tr标签来索引的一段信息,从代码段可以看到相关大学的排名,名称和总分信息,因此可以实现定向爬虫。

此外还要注意该网站是否提供了robots协议的约定:
可以手工查看是否符合:http://www.zuihaodaxue.cn/robots.txt,可以发现该网站并不存在,说明该网站没有对爬虫作相关限制。

程序的结构设计

步骤1:从网络上获取大学排名网页内容 getHTMLText()
步骤2:提取网页内容中信息到合适的数据结构 fillUnivList()
步骤3:利用数据结构展示并输出结果 printUnivList()

直接上代码:

导入相关库:

import requests
from bs4 import BeautifulSoup
import bs4

编写函数 getHTMLText()

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

编写函数 fillUnivList()

def fillUnivList(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[3].string])

编写函数 printUnivList()

def printUnivList(ulist, num):
    tplt="{0:^10}\t{1:{3}^8}\t{2:^10}"
    print("{0:^8}\t{1:{3}^8}\t{2:^8}".format("排名","学校名称","总分", chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2], chr(12288)))
中文对齐问题原因及解决方案

① 中文对齐原因:
在这里插入图片描述② 解决方案:
利用chr(12288)修改输出格式。

运行结果:

在这里插入图片描述

完整程序代码:
import requests
from bs4 import BeautifulSoup
import bs4


def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""


def fillUnivList(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[3].string])

def printUnivList(ulist, num):
    tplt="{0:^10}\t{1:{3}^8}\t{2:^10}"
    print("{0:^8}\t{1:{3}^8}\t{2:^8}".format("排名","学校名称","总分", chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2], chr(12288)))


def main():
    uinfo = []
    url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html"
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)


main()

声明:本博客内容为学习慕课上嵩天副教授的python网络爬虫与信息提取课程后所做的总结。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章