Python爬虫初级(五)—— 中国大学排名定向爬虫

上一篇内容:Python爬虫初级(四)—— 信息组织与提取方法

实例介绍

我们准备从上海交大设计的最好大学网获得大学的排名,由下面链接打开就能直接看到中国最好大学的基本信息:
http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html
我们要写一段程序,从网上获得大学的排名,然后以此输出,具体的功能描述就是:

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

我们在该网站首页观察到的是下图:
中国大学排名我们首先看看根据我们目前掌握的知识能否进行爬取,右键点开源代码,发现相应内容可以在源代码中找到,说明这些内容不是由一个动态脚本控制 的,这个定向爬虫是我们可以实现的:
中国大学排名网站源代码此外,我们还需看一下这个网站是否提供了 robots 协议的约定,我们直接打开 www.zuihaodaxue.cn/robots.cn,我们发现网页不存在,因此我们是可以对该网站进行爬取的。
验证可行性之后,我们需要首先对爬虫做一个初步的设计,获取大学排名并且输出大学排名信息:

步骤一:从网络上获取大学排名网页内容
步骤二:提取网页内容中信息到合适的数据结构
步骤三:利用数据结构输出其中的信息并且获得我们需要的结果

对应上述步骤,我们可以提取出具体的程序结构设计:

步骤一:getHTMLText()
步骤二:fillUnivList()
步骤三:printUnivList()

代码部分

下面我们直接展示代码:

import requests
from bs4 import BeautifulSoup
import re
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)
    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])

def printUnivList(ulist, num): 
    print("{:^10}\t{:^6}\t{:^10}".format("排名","学校","总分"))
    for i in range(num):
        u = ulist[i]
        print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
    print("Suc" + str(num)) 

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

main()

最后输出结果为:

排名    	  学校  	    总分    
    1     	 清华大学 	   北京市    
    2     	 北京大学 	   北京市    
    3     	 浙江大学 	   浙江省    
    4     	上海交通大学	   上海市    
    5     	 复旦大学 	   上海市    
    6     	 南京大学 	   江苏省    
    7     	中国科学技术大学	   安徽省    
    8     	哈尔滨工业大学	   黑龙江省   
    9     	华中科技大学	   湖北省    
    10    	 中山大学 	   广东省    
    11    	 东南大学 	   江苏省    
    12    	 天津大学 	   天津市    
    13    	 同济大学 	   上海市    
    14    	北京航空航天大学	   北京市    
    15    	 四川大学 	   四川省    
    16    	 武汉大学 	   湖北省    
    17    	西安交通大学	   陕西省    
    18    	 南开大学 	   天津市    
    19    	大连理工大学	   辽宁省    
    20    	 山东大学 	   山东省    
Suc20

接下来我们将对上述显示结果进行优化。

实例优化

我们发现上述显示结果并不美观,没有按我们想象中的居中对齐,这是由于中西文的空格填充方式不同,要怎么解决这个问题呢?我们可以采用中文字符的空格填充,即 chr(12288),我们将上述代码中的 printUnivList 函数进行如下修改:

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

输出结果为:
输出结果下一篇文章:Python爬虫初级(六)—— 正则表达式库入门

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值