爬虫练手小实例---【大学排名定向爬取】

引言

周末闲来无聊,根据慕课平台的课程练了一波小实例,记录一下成果吧。

环境

  • python3
  • requests
  • BeautifulSoup
  • lxml

成果展示

这里写图片描述

按照上面的逻辑,从爬取的页面分析开始入手

编码之道

目标站分析

首先来看下爬取的网站:http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html

这里写图片描述
可以看到【排名,学校名字,省市,总分】,而最终的成果也是要的这四个参数!

需要注意的是,爬虫遵循道德,第一件事儿先看下有木有robots协议,若有,尽量遵守0.0…..
所以输入:http://www.zuihaodaxue.com/robots.txt
可以发现nginx转发404页面。也就是说名这个网站并没有robots协议,那直接来爬吧。

F12,来观察下我们想要的信息———-【排名,学校名字,省市,总分】

这里写图片描述

思路

经过分析,可以看到我们所有想获取的信息都在tbody标签下,并且每个tr标签对应的就是一行的信息数据,而每个td则是对应每列,这样我们可以直接通过遍历tbody下的每个tr标签,在从中获取td标签,拿到对应的内容即可。

代码实现

# coding = utf-8

"""
@author: sy

@file: mooc_university.py

@time: 2018/3/17 14:50

@desc:  大学排名定向爬取实例.....
        优先看下是否有robots协议-------http://www.zuihaodaxue.com/robots.txt
        发现无robots协议,404页面
        http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html
"""

import requests
import bs4
from bs4 import BeautifulSoup as bs


# 获取html的文本
def getHtmlText(url):
    # 捕获异常,如果不是200状态码直接抛异常
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "失败!"


# 填充大学列表
def fillUnivList(html, ulist):
    # 通过lxml解析html,需要安装lxml库
    soup = bs(html, 'lxml')
    for tr in soup.find('tbody').children:
        # 遍历出来的有些tr并不是bs4的属性,所以去掉
        if isinstance(tr, bs4.element.Tag):
            # 找出td的内容进行拼接
            # 下面的写法是<tag>(....): 等同于tr('td') == tr.find_all('td')
            tds = tr('td')
            ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])


# 打印大学信息
def printUnivInfo(ulist, num):
    '''
     解决中文填充空格chr(12288),对齐中文格式
     {0:}代表的是第几个变量,^10代表的是宽度,1:{4}代表该中文格式化
     填充用第四个变量,也就是chr(12288)进行空格填充
    '''
    tplt = '{0:^10}\t{1:{4}^10}\t{2:{4}^10}\t{3:^10}'
    # 打印控制台表头
    print(tplt.format('排名', '学校名称', '省市', '总分', chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2], u[3], chr(12288)))


if __name__ == '__main__':
    uinfo = []
    url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html'
    html = getHtmlText(url)
    fillUnivList(html, uinfo)
    # 20是限定打印出多少行元素
    printUnivInfo(uinfo, 20)

总结

代码很简单,学到的东西是对于print的format用法,在用format时,若遇到中文,不配置对应的填充规则,在界面展示的时候会对不齐。所以注意下面的代码很重要:

   '''
     解决中文填充空格chr(12288),对齐中文格式
     {0:}代表的是第几个变量,^10代表的是宽度,1:{4}代表该中文格式化
     填充用第四个变量,也就是chr(12288)进行空格填充
    '''
    tplt = '{0:^10}\t{1:{4}^10}\t{2:{4}^10}\t{3:^10}'

猜你喜欢

转载自blog.csdn.net/s740556472/article/details/79593492