Python爬虫(七)——中国大学排名爬虫

两盒软妹~` 提交于 2020-02-04 00:21:39

Python爬虫(七)——中国大学排名定向爬虫

我们将使用上海交大开发的软科排名。网站:

http://www.zuihaodaxue.com/BCSR/ruanjiangongcheng2019.html

我们的目的是从这个网页中提取出2019年中国软件工程学科的排名、大学名称和总分。我们将会使用requests和bs4库。

确定爬虫是否可行

首先我们打开这个网站查看网站源代码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9bAb9Tb1-1580736440027)(Python爬虫(七)——中国大学排名爬虫/wangyedaima.png "网页代码")]

发现里面有我们要的信息。然后查看网站的robots.txt,发现没有这个文件,因此我们爬取信息是合法的。

设计程序的结构

步骤

整个过程可以分为三步

  1. 从网络上获取大学排名网页内容,方法get_HTML_text()
  2. 提取网页内容中信息到合适的数据结构中,方法fill_univ_list()
  3. 利用数据结构展示结果,方法print_univ_list()

实现方法

模块的引入

我们使用requests库和bs4库,代码:

import requests
from bs4 import BeautifulSoup
import bs4

get_HTML_text()

输入为网页链接,输出为网页内容
代码:

def get_HTML_text(url):
    try: #使用之前的代码框架返回html
        r=requests.get(url,timeout=30)
        r.raise_for_status() #如果出现异常返回空字符串
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return ""

fill_univ_list()

输入为网页内容,然后将排名信息写入列表中。我们先观察网页HTML代码中的规律。

规律

我们发现整个排名在tbody中,每个大学都在一个tr中,每个信息在td中。

代码:

def fill_univ_list(ulist, html):
    soup = BeautifulSoup(html, 'html.parser')  #解析网页代码
    for tr in soup.find('tbody'):
        if isinstance(tr, bs4.element.Tag) and len(tr('td')) == 7:  #检测标签的类型,过滤不是bs4中定义的Tag类型,这里需要引用bs4库
            tds = tr('td')
            ulist.append([tds[0].string, tds[3].string, tds[6].string]) #注意排名、大学名称和分数在第几个

print_univ_list()

输入为排名的列表,然后打印出来。这里使用.format()格式化输出。为了保证对齐我们使用中文字符填充。

代码:

def print_univ_list(ulist, num):
    tplt = "{0:{3}^10}\t{1:{4}^10}\t{2:{5}^10}"  #定义一个输出模板的变量
    print(tplt.format("排名", "学校名称", "总分", chr(12288), chr(12288), chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(" "+tplt.format(u[0], u[1], u[2], chr(12288), chr(12288), chr(12288)))

全部代码

import requests
from bs4 import BeautifulSoup
import bs4


def get_HTML_text(url):
    try:  #使用之前的代码框架返回html
        r = requests.get(url, timeout=30)
        r.raise_for_status()  #如果出现异常返回空字符串
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""


def fill_univ_list(ulist, html):
    soup = BeautifulSoup(html, 'html.parser')  #解析网页代码
    for tr in soup.find('tbody'):
        if isinstance(tr, bs4.element.Tag) and len(tr('td')) == 7:  #检测标签的类型,过滤不是bs4中定义的Tag类型,这里需要引用bs4库
            tds = tr('td')
            ulist.append([tds[0].string, tds[3].string, tds[6].string])  #注意排名、大学名称和分数在第几个


def print_univ_list(ulist, num):
    tplt = "{0:{3}^10}\t{1:{4}^10}\t{2:{5}^10}"  #定义一个输出模板的变量
    print(tplt.format("排名", "学校名称", "总分", chr(12288), chr(12288), chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(" "+tplt.format(u[0], u[1], u[2], chr(12288), chr(12288), chr(12288)))


uinfo = []
url = 'http://www.zuihaodaxue.com/BCSR/ruanjiangongcheng2019.html'
html = get_HTML_text(url)
fill_univ_list(uinfo, html)
print_univ_list(uinfo, 20)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!