zoukankan      html  css  js  c++  java
  • 007 Python网络爬虫与信息提取 中国大学排名爬虫

    [A] 中国大学排名定向爬虫实例介绍

      功能描述

        输入:大学排名URL链接

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

        技术路线:request,bs4

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

      程序的结构设计:

        步骤1:从网络上获取大学排名网页内容

            定义函数:getHTMLText()

        步骤2:提取网页内容中信息到合适的额数据结构

            定义函数:fillUnivList()

        步骤3:利用数据结构展示并输出结果

            定义函数:printUnivList()

    [B] 中国大学排名定向爬虫实例编写

        定义了三个函数,分别用来 1. 获取,2. 保存 和 3. 展示所爬取的结果

    import requests
    from bs4 import BeautifulSoup
    import bs4
    
    # 中国大学排名
    
    # 1. 从url中获取所需html代码并返回
    def getHTMLText(url):
        try:
            r = requests.get(url)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return ''
    
    
    # 2. 从获取到的html代码中解析出所需要的的数据保存在列表中并返回
    def fillUnivList(html):
        ulist = []
        sublist = []
        soup = BeautifulSoup(html, 'html.parser')
        text = soup.tbody
        for tr in soup.find('tbody').children:
            tds = tr('td')
            for item in tds:
                sublist.append(item.string)
            ulist.append(sublist)
            sublist = []
        return ulist
    
    
    # 3. 根据输入的信息,按要求打印出相应数据
    def printUnivList(ulist, start, end):
        print('{:^10}{:^12}{:^15}'.format('排名', '学校名称', '分数'))
        for i in range(start, end+1):
            print('{:^10}{:^12}{:^15}'.format(ulist[i][0], ulist[i][1], ulist[i][2]))
    
    
    # 主程序
    def main():
        url = 'http://www.gaosan.com/gaokao/299262.html'
        html = getHTMLText(url)
        uinfor = fillUnivList(html)
        printUnivList(uinfor, 5, 30)
    
    
    # 运行主程序
    main()
    View Code

       运行结果:

    [C] 中国大学排名定向爬虫实例优化

         从运行结果可以看出,每行打印的时候虽然都是点击的 tab键 来空格,但是依然没有对齐,这点需要优化

          tplt = '{:^10} {:^12} {:^15}'.format('排名', '学校名称', '分数'))

        中文对齐问题的原因:

            1. 对齐格式为:

    : 填充 对齐 宽度 , 精度 类型
    引导符号

    用于填充的单个字符

    <左对齐>右对齐^居中对齐

    槽的设定输出宽度

    数字的千分位分隔符适用于整数和浮点数

    浮点数小数部分的精度或字符串的最大输出长度

    证书类型,c,d,o,x,X浮点数类型e,E,f,%

            2. 当中文字符宽度不够时,此阿勇希文字符填充,而中西文字符所占用宽度不同

        中文对齐问题的解决:

          采用中文字符的空格填充 chr(12288)

          tplt = '{0:^10} {1:{3}^12} {2:^15}'.format('排名', '学校名称', '分数', chr(12288)))

            这里{3}^12表示用第三个字符(即中文字符代码)进行填充

        改进后的代码:

    import requests
    from bs4 import BeautifulSoup
    import bs4
    
    # 中国大学排名
    
    # 1. 从url中获取所需html代码并返回
    def getHTMLText(url):
        try:
            r = requests.get(url)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return ''
    
    
    # 2. 从获取到的html代码中解析出所需要的的数据保存在列表中并返回
    def fillUnivList(html):
        ulist = []
        sublist = []
        soup = BeautifulSoup(html, 'html.parser')
        text = soup.tbody
        for tr in soup.find('tbody').children:
            tds = tr('td')
            for item in tds:
                sublist.append(item.string)
            ulist.append(sublist)
            sublist = []
        return ulist
    
    
    # 3. 根据输入的信息,按要求打印出相应数据
    def printUnivList(ulist, start, end):
        tplt = '{0:^10}	{1:{3}^12}	{2:^15}'
        print(tplt.format('排名', '学校名称', '分数', chr(12288)))
        for i in range(start, end+1):
            print(tplt.format(ulist[i][0], ulist[i][1], ulist[i][2], chr(12288)))
    
    
    # 主程序
    def main():
        url = 'http://www.gaosan.com/gaokao/299262.html'
        html = getHTMLText(url)
        uinfor = fillUnivList(html)
        printUnivList(uinfor, 5, 30)
    
    
    # 运行主程序
    main()
    View Code

        输出结果:

      

  • 相关阅读:
    Alpha 冲刺 (1/10)
    软工实践 · 第七次作业
    福大软工 · 第八次作业(课堂实战)- 项目UML设计(团队)
    软工实践· 第六次作业
    软工实践作业五-结对作业二
    软工实践第四次作业
    软工实践第三次作业
    软工实践第二次作业
    SDN第一次上机作业
    SDN第一次作业——关于网络编程
  • 原文地址:https://www.cnblogs.com/carreyBlog/p/14008062.html
Copyright © 2011-2022 走看看