中国大学排名爬虫

确定爬虫方案是否可行

1)页面信息是否在HTML代码中。

  • 有一些页面内容是通过javascript 动态生成的。

2)查看robot 约定。

  • 一般来说爬虫需要遵守相关的robot 协议。

程序的结构设计

1)获取网页内容。
2)提取网页内容,并将信息储存在合适的数据结构中。
3)利用数据结构,展示并输出信息。

程序的结构化实现

根据程序设计的三步结构,设计相关的函数。并最后封包在一个函数中输出。

代码

import requests
from bs4 import BeautifulSoup
import bs4

def getHTMLText(url):
# 通过request库获取页面信息
    try:
        hd = {'user-agent': 'Chrome/10'} # 修改头部信息
        r = requests.get(url, timeout = 30, headers = hd)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ''

def fillUnivList(ulist, html):
# 利用bs4 解析页面
    soup = BeautifulSoup(html, 'html.parser')
    for tr in soup.tbody.children:
        if isinstance(tr, bs4.element.Tag): # 筛选tbody 中的子节点 tr 的类型,需要为tag 类型
            tds = tr('td') # 将 tr 标签中的 td赋值给tds
            ulist.append([tds[0].string, tds[1].string, tds[4].string]) 
            # 分别对应td标签中的第1,2,5 列信息,并定义为str类型,添加到ulist中,并封包为一个表格。

def printUnivList(ulist, num):
# 将提取结果打印
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    print(tplt.format('排名', '学校名称', '总分', chr(12288))) # 输出信息的第一行打印基本信息
    # 当中文宽度不够,系统默认采用西文空白填充
    # format 中输出内容分别为10,10,10 字号,居中。并将空格天空修改为中文类型
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0], u[1], u[2], chr(12288)))
    print('Num: ' + str(num))

def main():
    uinfo = []
    url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2020.html'
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20) # 限制输出的结果数目
main()

你可能感兴趣的:(中国大学排名爬虫)