zoukankan      html  css  js  c++  java
  • 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}	{1:{3}^10}	{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()

    再附上大学排名截图:

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

    首先开始分析网页结构:

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

    打开chrome网页分析工具:

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

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

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

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

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

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

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

    然后将网页转码为r.apparent_encoding

    返回一个r.text

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

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

    我们先做一锅汤,定义为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位居中对齐,^是居中对齐, 是横向制表符。

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

  • 相关阅读:
    hdu1716排列2(stl:next_permutation+优先队列)
    iOS UIWebView 载入https 网站出现NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL,
    C++学习笔记23,类内函数重载
    Java---16---多线程---死锁
    Ubuntu上的Hadoop安装教程
    SAP BAPI一览 史上最全
    python脚本从excel表到处数据,生成指定格式的文件
    hdu 4865 Peter's Hobby
    【VUE】100. vue踩坑集锦
    【VUE】2.搭建vue脚手架@vue/cli,新建第一个vue项目
  • 原文地址:https://www.cnblogs.com/oldfish123/p/11918546.html
Copyright © 2011-2022 走看看