Python爬虫 | 基于request-bs4的中国大学排名定向爬虫


Python版本:Python3.5 ; 技术路线:requests-bs4 。

功能描述:

俗话说“有人的地方就有江湖”,那么有大学的地方就有排名。2018年大学排名是怎样的呢?最好大学网上提供了2018年的中国大学排名榜。

链接:www.zuihaodaxue.com/zuihaodaxue…

我们要一个程序,它能够通过链接爬取大学排名,并将大学排名信息屏幕输出。所以,功能需求如下:

  • 输入:大学排名URL链接
  • 输出:大学排名信息的屏幕输出(排名,大学名称,总分)

可行性分析:

首先,我们要确定需要的信息是不是写在HTML页面的代码中。如果是通过JavaScript等脚本语言生成的,用requests和BeautifulSoup库是无法获取它的信息的。其次,还有网站robots协议里是否有相关约定。

  • 代码写是否写在了HTML页面
  • robots协议

1.打开浏览器,输入我们要访问的网站,我们看到有中国大学排名的页面信息。

2.点击右键,查看源代码。可以看到每个大学相关信息对应的代码部分,这块代码是通过标签来索引的,且里面索引参数都写在了HTML页面信息中。 因此这个定向爬虫是可以设计和实现的

3.此外,还有看一下这个定向爬虫网站是否提供了robots协议的约定。打开http://www.zuihaodaxue.com/robots.txt,看到 404 Not Found网页不存在,说明这网站并没有通过robots协议对爬虫做相关限制。 因此我们爬取大学排名这个功能是完全合法的。 ^_^

4.综合以上: 可行性OK


程序的结构设计:

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

有了这三个函数,我们可以把程序封装成这三个模块,可读性更好。


代码编写:

1.首先,由于这里边实现了网络访问请求,所以我们要 import requests库BeautifulSoup库

import requests
from bs4 import BeautifulSoup
复制代码

2.根据前面定义的三个函数编写代码。由于这个时候,我们还没有对函数内部功能进行设计和实现,所以我们只需要写出函数的定义就可以。还有别忘了对接口的定义

def getHTMLText(url):
# 输入是URL信息,输出是对应HTML的内容
    retunrn ""

def fillUnivList(ulist, html):
# 将HTML页面放到一个列表(ulist)中
    pass

def printUnivList(ulist, num):
# 将ulist信息打印出来,num表示打印元素的数量
    print("Suc" + str(num))

def main():
    uinfo = []
    # 大学信息所放置的列表
    url = http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html
    html = getHTMLText(url)
    # 调用函数,将url转化成html
    fillUnivList(uinfo, html)
    # 将html信息提取后放在uinfo变量中
    printUnivList(uinfo, 20)
    # 打印前20所大学信息
main()
复制代码

3.写了上面代码后,整个mian函数和结构框架已经很清晰了,但还仅仅是个半成品,所以要进一步填写三个函数的功能~

  • 第一个函数 getHTMLText(url),需要 requests库 返回页面信息,这里我们可以用通用代码框架,如下:
def getHTMLText(url): 
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        # 如果爬取失败,产生异常信息
        r.encoding = r.apparent_encoding
        # 使用apparent_encoding修改编码
        return r.text
        # 将网页的信息内容返回
    except requests.HTTPError:
        return ""
        # 若出现错误,返回空字符串
复制代码
  • 第二个函数 fillUnivList(ulist, html),程序的核心部分,需要 BeautifulSoup库 解析页面,中间使用 isinstance() 函数需要调用 bs4库
    • 所有除了之前的以外,还需 import bs4
import bs4
def fillUnivList(ulist, html): 
    soup = BeautifulSoup(html, "html.parser")
    # 用BeautifulSoup类煲这锅靓汤,使用html解析器
    for tr in soup.find("tbody").children:
    # 这步骤需要观察网页源代码,解析html中的<tbody>
        if isinstance(tr, bs4.element.Tag):
        # 在<tbody>中找的对应的<tr>
        # 检测<tr>类型,若不是bs4库定义的Tag类型,将被过滤 (import bs4)
            tds = tr("td")
            # 找到<tr>中的<td>,并将其存储在列表tds中
            ulist.append([tds[0].string, tds[1].string, tds[2].string])
            # 增加对应字段到列表ulist
复制代码
  • 第三个函数 printUnivList(ulist, num) ,使用 format()方法 格式化输出。这里要啰嗦一句:使用format()方法输出时,定义了槽的大小且输出内容包含中文字符,当中文字符不够槽的宽带时,将默认西文字符填充,但是中文和西文字符对空间的占用又不一样...
    • 这意味着什么呢?意味着我们输出的格式很难对齐,灰常不美观...
    • 所以我们要用中文空格符填充~
    • utf-8编码对应中文空格字符为:12288,so,填充的字符就是chr(12288)啦~
def printUnivList(ulist, num):
    tplt = "{0:^10}\t{1:{3}^12}\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)))
        # 打印每一所学校的信息
复制代码
  • 至此,所有的代码都写完啦,我们已经成功写完了定向爬虫了,好激动有木有?赶紧运行一下程序试试看哟~


最终代码:

# 实践:中国大学排名定向爬取
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 requests.HTTPError:
        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[2].string])


def printUnivList(ulist, num):
    tplt = "{0:^10}\t{1:{3}^12}\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)))


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

复制代码

本帖仅作为学习笔记; 有错误指出欢迎指出; 也欢迎大家一起学习交流~

转载于:https://juejin.im/post/5c284783f265da61553ae9f2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值