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}\t{:^10}\t{:^20}\t{:^30}".format("排名", "學校名稱", "總分", '地址'))
    for i in range(num):
        u = ulist[i]
        print("{:^3}\t{:^10}\t{:^20}\t{:^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}\t{:^10}\t{:^20}\t{:^30}".format("排名", "學校名稱", "總分", '地址'))
    for i in range(num):
        u = ulist[i]
        print("{:^3}\t{:^10}\t{:^20}\t{:^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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章