python爬虫学习心得:中国大学排名(附代码)

今天下午花时间学习了python爬虫的中国大学排名实例,颇有心得,于是在博客园与各位分享

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:
        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.find_all('td')
            ulist.append([tds[0].string,tds[1].string,tds[3].string])

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)))

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

再附上大学排名截图:

python爬虫学习心得:中国大学排名(附代码)

那么,现在开始代码心得讲解:

首先开始分析网页结构:

打开http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html

打开chrome网页分析工具:

可以发现大学排名,学校名称,省市,总分等都处在tbody标签内

python爬虫学习心得:中国大学排名(附代码)

而大学名称、省市等,都处于tr标签内的td

 

python爬虫学习心得:中国大学排名(附代码)

好,分析完成,开始构建函数架构:

python爬虫学习心得:中国大学排名(附代码)

主要思想为:获取网页html文本,得到需求数据,并将需求数据转化为列表,最后将列表输出

下一步:开始补充getHTMLText()部分的代码:

python爬虫学习心得:中国大学排名(附代码)

这里我用try except形式编写代码:

首先获取网页url,时限为30s,j接着运用 r.raise_for_status()(如果 HTTP 请求返回了不成功的状态码, r.raise_for_status() 会抛出一个 HTTPError异常)

然后将网页转码为r.apparent_encoding

返回一个r.text

这里代码运行中如果出现错误,则会return "",返回一个空字符串

 

接下来开始编写fillUnivList()部分代码

python爬虫学习心得:中国大学排名(附代码)

我们先做一锅汤,定义为soup,然后在这锅汤中遍历tr的孩子,这里每一个tr都对应一所大学的信息

而且我们需要滤掉非标签类型的其他信息,所以运用isinstance对函数类型做一个判断

if isinstance(tr,bs4.element.Tag):

这行代码就是检测标签类型,如果标签不是bs4库定义的类型,将过滤掉,同时为了运用这个方法,我们也就需要引入bs4库

由于tr标签已经被解析出来,接下来就需要对tr标签中的td标签做查询

if isinstance(tr,bs4.element.Tag):
    tds = tr.find_all('td')

这里把查询到的td标签存入tds列表中

再然后在ulist表中增加:排名,大学名和总分的对应字段

ulist.append([tds[0].string,tds[1].string,tds[3].string])

接着来编写printUnivList()函数

注意:这里的{:^10}表示取10位居中对齐,^是居中对齐,\t是横向制表符。

python爬虫学习心得:中国大学排名(附代码)

ok,主要代码完成,希望可以帮到你。