萌新实例,大佬们可以右上角了, 萌新可以看看互相学习
我是在是学习了《Python简明教程》还有廖雪峰老师的《Python3教程》后,才发现嵩天老师的视频的,简洁、生动、有趣,有时候还挺萌的,要是能早点知道嵩天老师,我觉的学习时间应该能减少少一半,不是说其他的不好,只是更喜欢嵩天老师的讲解
给嵩天老师打个广告,非常有意思的教程,这里是爬虫教程,里面还有Python基础教程,大家自己去挖掘下
https://www.icourse163.org/course/BIT-1001870001
和大家分享嵩天老师的实例,一是为了巩固自己的知识点,而是为了给像我一样的人安利下嵩天老师
任务目标
爬取中国最好大学排名的前30个排名
任务分解
嵩天老师在这里将任务分成了好几块,为了方便大家理解
我这里按嵩老师思路分成三大块,代码缩进可以参考后面的,完全代码
第一步:写框架
# 用get方法获取HTML信息
def getHTMLText(url)
return" "
# 将获取到的html放在自己定义的ulist中
def fillUnivList(ulist, html)
pass
# 将获取到的ulist信息打印出来,num在这里指要排名多少学校,可以自有填写
def printUnivList(ulist, num)
print("Suc" + str(num))
第二步:完善函数
先写main函数
def main():
# 将大学信息写进列表中,定义列表名uinfo
uinfo = []
# 给出url地址信息
url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html"
# 用requests库中的get方法,将url信息转换成HTML信息
html = getHTMLText(url)
# 将提取的信息放在uinfo变量中
fillUnivList(uinfo, html)
# 打印大学信息,我们给出的排名信息是前30位
printUnivList(uinfo, 30)
main()
然后再完善上面的的三个框架函数
完善getHTMLText函数
def getHTMLText(url):
# 是用try...except 完成结构框架,方便调试
try:
r = requests.get(url, timeout=30)
# 获取状态码
r.raise_for_status()
# 因为有中文,所以需要转换编码
r.encoding = r.apparent_encoding
# 返回给程序
return r.text
except:
print("产生异常")
return
完善fillUnivList函数
这里又开始使用beautifullsoup提取html信息中关键的数据,并添加到列表中
通过网页查看源码,我们发现,所有的信息被封装在<tbody>标签里,每一个大学信息又被封装在<tr>标签里,<tr>标签包含了当前大学的数据信息,每个大学的<tr>又被<td>所包围
先找到<tbody>标签,获取所有大学信息
再找到<tbody>标签里的<tr>标签,获取每一个大学的信息
再找到<tr>标签里的<td>标签,将大学所有属性写到ulist里
这里主要使用的是bs4库中的遍历和查找方法
还需要注意的是,因为要过滤的其他信息,所以用isinstace函数做判断,
# 将获取到的html放在自己定义的ulist列表中
def fillUnivList(ulist, html):
# 使用bs4库解析网页
soup = BeautifulSoup(html, "html.parser")
# 使用for语句遍历查找tbody下的孩子标签,
for tr in soup.find('tbody').children:
# 检测ts标签,如果tr标签不是bs4定义的tag类型,将过滤掉
if isinstance(tr, bs4.element.Tag):
# tr标签查询完后,需要查询td标签,并将td标签存在tds里,
tds = tr('td')
# ulist 里添加我们需要的信息,分别是大学名称,大学排名,大学评分
ulist.append([tds[0].string, tds[1].string, tds[2].string])
第三步,打印大学信息
打印大学信息时,需要有表头,这里时用print函数实现
format输出格式函数,需要自己下去找资料学习下
def printUnivList(ulist, num):
# 定义输出模板的变量,并增加宽度设定
# {3}表示打印输出时,需要填充时使用format函数的第三个变量进行填充,也就是使用中文空格进行填充
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
# 定义输出格式,如果看不懂可以去搜下format函数,学习下
print(tplt.format("排名", "学校名称", "评分", chr(12288)))
# 将dr信息用简短的变量u来代替,并用for...in 将每所学校信息打印出来
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], chr(12288)))
print("Suc" + str(num))
完全体提代码
需要注意的是,这里需要的是三个库,requests库,BeautifulSoup4库的BeautifulSoup方法,以及BeautifulSoup4库
import requests
from bs4 import BeautifulSoup
import bs4
# 定义获取网页信息
def getHTMLText(url):
# 是用try...except 完成结构框架,方便调试
# noinspection PyBroadException
# pycharm会报提示,过于宽泛,需要指定精准 except,强迫症必须要解决
try:
r = requests.get(url, timeout=30)
# 获取状态码
r.raise_for_status()
# 因为有中文,所以需要转换编码
r.encoding = r.apparent_encoding
# 返回给程序
return r.text
except:
print("产生异常")
return ""
# 使用beautifullsoup提取html信息中关键的数据,并添加到列表中
# 将获取到的html放在自己定义的ulist列表中
def fillUnivList(ulist, html):
# 使用bs4库解析网页
soup = BeautifulSoup(html, "html.parser")
# 使用for语句遍历查找tbody下的孩子标签,
for tr in soup.find('tbody').children:
# 检测tr标签,如果tr标签不是bs4定义的tag类型,将过滤掉
if isinstance(tr, bs4.element.Tag):
# tr标签查询完后,需要查询td标签,并将td标签存在tds里,
tds = tr('td')
# ulist 里添加我们需要的信息,分别是大学名称,大学排名,大学评分
ulist.append([tds[0].string, tds[1].string, tds[2].string])
# 将获取的ulist信息打印出来,num是指需要多少个学校
def printUnivList(ulist, num):
# 定义输出模板的变量,并增加宽度设定
# {3}表示打印输出时,需要填充时使用format函数的第三个变量进行填充,也就是使用中文空格进行填充
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
# 定义输出格式,如果看不懂可以去搜下format函数,学习下
print(tplt.format("排名", "学校名称", "评分", chr(12288)))
# 将dr信息用简短的变量u来代替,并用for...in 将每所学校信息打印出来
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], chr(12288)))
print("Suc" + str(num))
def main():
# 将大学信息写进列表中,定义列表名uinfo
uinfo = []
# 给出url地址信息
url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html"
# 用requests库中的get方法,将url信息转换成HTML信息
html = getHTMLText(url)
# 将提取的信息放在uinfo变量中
fillUnivList(uinfo, html)
# 打印大学信息,我们给出的排名信息是前30位
printUnivList(uinfo, 30)
main()