zoukankan      html  css  js  c++  java
  • Python爬虫--2019大学排名数据抓取

    Python爬虫--2019大学排名数据抓取

    准备工作

    1. 输入:大学排名URL连接
    2. 输出:大学排名信息屏幕输出
    3. 所需要用到的库:requests,bs4

    思路

    1. 获取网页信息
    2. 提取网页中的内容并放到数据结构中
    3. 利用数据结构展示并输出结果

    程序设计

    1. 定义函数getHTMLText()获取网页信息
    2. 定义函数UnivList()放入数据结构
    3. 定义函数printUnivList()输出到屏幕

    总体而言:

    • 写出需要自定义的函数,制作出总体的框架
    • 写出主函数框架,实现功能
    • 最后调用函数

    步骤

    查看url源代码

    分析源代码,查看需要爬取的内容在什么位置
    001.png

    从图片中可以看出,排名信息是在<tbody>标签
    具体的信息是在<tr>标签下的<td>标签内的string

    定义函数getHTMLText

    def getHMLText(url):
        '''
        获取url信息,输出url的内容,来抓取网页的信息
        '''
        try:
            r = request.get(url, timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return "抓取失败!"
    

    定义函数UnivList()

    def UnivList(ulist, html):
        '''
        提取html中的数据,放入到ulist列表,完成数据提取
        '''
        soup = BeautifulSoup(html, "html.parser")
        for tr in soup.find('tbody').children:
            if isinstance(tr, bs4.element.Tag):  # 判断tr的子节点是否为非属性字符串
                tds = tr('td')
                # print(tds)
                # print('#' * 30)
                # print(tds[0], tds[0].string)
                # print('#' * 30)
                # print(tds[1], tds[1].string)
                # print('#' * 30)
                # print(tds[2], tds[2].string)
                # print('#' * 30)
                # print(tds[3], tds[3].string)
                ulist.append([tds[0].string, tds[1].string, tds[3].string, tds[2].string])
    

    定义函数printUnivList()

    def printUnivList(ulist, num):
        '''
        将ulist列表信息打印,num表示打印前多少排名的学校
        '''
        print("{:^3}	{:^10}	{:^20}	{:^30}".format("排名", "学校名称", "总分", '地址'))
        for i in range(num):
            u = ulist[i]
            print("{:^3}	{:^10}	{:^20}	{:^30}".format(u[0], u[1], u[2], u[3]))
    

    主函数main()

    def main():
        '''
        实现整个代码
        '''
        ulist = []
        url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html'
        html = getHTMLText(url)
        UnivList(ulist, html)
        printUnivList(ulist, 100)
    

    调用主函数

    main()
    

    完整代码

    import requests
    import bs4
    from bs4 import BeautifulSoup
    def getHMLText(url):
        '''
        获取url信息,输出url的内容,来抓取网页的信息
        '''
        try:
            r = request.get(url, timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return "抓取失败!"
    
    def UnivList(ulist, html):
        '''
        提取html中的数据,放入到ulist列表,完成数据提取
        '''
        soup = BeautifulSoup(html, "html.parser")
        for tr in soup.find('tbody').children:
            if isinstance(tr, bs4.element.Tag):  # 判断tr的子节点是否为非属性字符串
                tds = tr('td')
                # print(tds)
                # print('#' * 30)
                # print(tds[0], tds[0].string)
                # print('#' * 30)
                # print(tds[1], tds[1].string)
                # print('#' * 30)
                # print(tds[2], tds[2].string)
                # print('#' * 30)
                # print(tds[3], tds[3].string)
                ulist.append([tds[0].string, tds[1].string, tds[3].string, tds[2].string])
    
    def printUnivList(ulist, num):
        '''
        将ulist列表信息打印,num表示打印前多少排名的学校
        '''
        print("{:^3}	{:^10}	{:^20}	{:^30}".format("排名", "学校名称", "总分", '地址'))
        for i in range(num):
            u = ulist[i]
            print("{:^3}	{:^10}	{:^20}	{:^30}".format(u[0], u[1], u[2], u[3]))
    
    
    def main():
        '''
        实现整个代码
        '''
        uinfo = []
        url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html'
        html = getHTMLText(url)
        fillUnivList(uinfo, html)
        printUnivList(uinfo, 100)
    
    main()
    
  • 相关阅读:
    针对上一篇文章中的代码,想出的重构方案(python实现)
    Android中的广播Broadcast详解
    Android中的Serialable和Parcelable的区别
    Java中的序列化Serialable高级详解
    Android中的Parcel机制(下)
    Android中的Parcel机制(上)
    Java中获取前一天和后一天时间
    Android中的Service详解
    Window 通过cmd查看端口占用、相应进程、杀死进程等的命令
    Java高新技术第三篇:注解的使用
  • 原文地址:https://www.cnblogs.com/moniter/p/12334232.html
Copyright © 2011-2022 走看看