• (参考)爬虫5-爬取中国大学排名情况


    最好大学网

    2018大学排名

    功能描述:

    输入:大学排名url链接

    输出:大学排名信息的屏幕输出(排名,大学名称,总分)

    技术路线:requests库和bs4库

    定向爬虫:仅对输入的URL进行爬取,不扩展爬取

    步骤:

    1、输入url网址,查看源代码,发现信息都在HTML文件中

    2、打开http://www.zuihaodaxue.cn/robots.txt,发现:not found,说明没有对爬取进行robots协议限制,可以进行爬取

    3、程序的结构设计:

      步骤1,从网络上获取大学排名网页内容,getHTMLText()

      步骤2、提取网页内容中信息到合适的数据结构,fillUnivList()

      步骤3、利用数据结构展示并输出结果,printUnivList()

     代码:

    import requests
    from bs4 import BeautifulSoup
    import bs4#为了使用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 ''
    #将数据存到list中
    def fillUnivList(ulist,html):
        soup=BeautifulSoup(html,'html.parser')
        #查看HTML源码发现每一所大学都在tbody标签中,这里一个tr表示一所大学
        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])
        #pass 
    #将num个list中的数据打印显示出来,可视化输出
    def printUnivList(ulist,num):
        #打印表头
        print('{:^10}	{:^6}	{:^10}'.format('排名','学校名称','总分'))
        for i in range(num):
            u=ulist[i]
            print('{:^10}	{:^6}	{:^10}'.format(u[0],u[1],u[2]))
        #print('Suc'+str(num))
    #主函数
    def main():
        uinfo=[]#待放入数据的列表
        url='http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html'
        html=getHTMLText(url)
        fillUnivList(uinfo,html)
        printUnivList(uinfo,20)#打印20组数据
    main()

    结果展示:

    以上程序有一个问题,就是总分一栏输出的竟然是省份,这其实是这一行代码的问题:

    ulist.append([tds[0].string,tds[1].string,tds[2].string])
    #这里应该改为
    #ulist.append([tds[0].string,tds[1].string,tds[3].string])

    更改后就没有问题了。

    在这里我们的设计思路是:

    先搭建程序的框架,先定义三个函数名,然后定义主函数,主函数会依次调用三个函数,然后再分别充实三个子函数,一步步的写,这是写程序的正确方法。

    当遇到bug时,我们可以逐步排查,比如先运行第一个程序,看看是否已经获得html文件,再逐步检查。

    代码优化:

      format属性

      中文对齐的问题:

    <填充> <对齐> <宽度> , <精度> <类型>

    引号

    符号

    用于填充

    的单个字符

    <左对齐

    >右对齐

    ^居中对齐

    槽的设定

    输出宽度

    数字的千位

    分隔符适用

    于整数和浮点数

    浮点数小数部分

    的精度或字符串

    的最大输出长度

    整数类型b,c,d,

    o,x,X浮点数类型

    e,E,f,%

    当中文字符宽度不够时,采用西文字符填充;中西文字符占用宽度不同。

    解决方法:采用中文空格填充chr(12288)

    将print**函数做修改

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

    输出结果如下:发现输出已经居中

  • 相关阅读:
    ExecutorService 的理解与使用
    web项目答辩问题
    JAVA面试,项目面试
    jQuery常用的事例
    利用poi实现解析Excel
    itext实现转换pdf
    ajax传参数组之request.getParameterValues
    Android.26.Activity之间参数的传递方式
    Android.25.SP,SQLite,Room
    Android.24. RxJava
  • 原文地址:https://www.cnblogs.com/rayshaw/p/8605851.html
Copyright © 2020-2023  润新知