Python爬蟲–2019大學排名數據抓取
準備工作
- 輸入:大學排名URL連接
- 輸出:大學排名信息屏幕輸出
- 所需要用到的庫:requests,bs4
思路
- 獲取網頁信息
- 提取網頁中的內容並放到數據結構中
- 利用數據結構展示並輸出結果
程序設計
- 定義函數getHTMLText()獲取網頁信息
- 定義函數UnivList()放入數據結構
- 定義函數printUnivList()輸出到屏幕
總體而言:
- 寫出需要自定義的函數,製作出總體的框架
- 寫出主函數框架,實現功能
- 最後調用函數
步驟
查看url源代碼
分析源代碼,查看需要爬取的內容在什麼位置
從圖片中可以看出,排名信息是在<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()