Python爬虫--2019大学排名数据抓取
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()