继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

巴尔扎克很忙
关注TA
已关注
手记 2
粉丝 5
获赞 4

Python爬虫


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

功能描述:

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

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

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

可行性分析:

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

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

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

最好大学网
2.点击右键,查看源代码。可以看到每个大学相关信息对应的代码部分,这块代码是通过,并将其存储在列表tds中
ulist.append([tds[0].string, tds[1].string, tds[2].string])
# 增加对应字段到列表ulist


 - 第三个函数 `printUnivList(ulist, num)` ,使用 **format()方法** 格式化输出。这里要啰嗦一句:使用format()方法输出时,定义了槽的大小且输出内容包含中文字符,当中文字符不够槽的宽带时,将默认西文字符填充,但是中文和西文字符对空间的占用又不一样...
   - 这意味着什么呢?意味着我们输出的格式很难对齐,灰常不美观...
   - 所以我们要用中文空格符填充~
   - utf-8编码对应中文空格字符为:12288,so,填充的字符就是chr(12288)啦~
``` python
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()



1.本帖仅作为学习笔记;
2.有错误之处欢迎指出;
3.也欢迎大家一起学习交流~(๑•̀㉨•́ฅ✧)

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP