本次爬虫的URL: https://www.shanghairanking.cn/rankings/bcur/2020
案例来源:中国大学慕课嵩天老师的“Python网络爬虫与信息提取”
由于该课程的录制时间较早,而案例爬取网站做了部分的代码修改,导致课程中的爬虫案例的部分代码已不适用于今天网站的内容结构,所以就有了开始学习爬虫的你来到了CSDN,哈哈哈哈。
课程中的案例代码这里就不展示了,直接上问题
由于网页中的这部分做了一定的修改,所以这样的方式已不再适用。
接下来我们找到网页中大学排名的Html代码对应的位置,看看是怎样的。
这里和课程文档内的网页对比一下,你应该就发现了问题的所在。以前我们想要爬取的网页完全是直接就在td标签内的,因此可以很方便快捷的照抄案例代码就能爬取数据。
这里可以看出不能再使用Tag.string来当前特殊情况下的String属性。
但是我们想要获取数据就需要从这里打印输出数据,于是我想了一个办法把td标签里的内容强制转换为str类型----->输出。
复习一下知识点
// strip()删除字符串开头和结尾的空白
.strip()
//删除左边的空白
.lstrip()
//删除右边的空白
.rstrip()
//<tag>所有的儿子节点存入列表
Tag.contents
到这其实就差不多了,只要能够想到这一点,问题就能迎刃而解了。
我的完整代码代码如下:
import requests
import bs4
from bs4 import BeautifulSoup
def getHTMLText(url, headers):
try:
r = requests.get(url=url, headers=headers, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
soup = BeautifulSoup(r.text,"html.parser")
return soup
except:
return ""
def fillUnivList(ulist, html):
for tr in html.find("tbody").children:
if isinstance(tr,bs4.element.Tag):
tds = tr('td')
rank = str(tds[0].contents[0]).strip()
school = str(tds[1].a.string)
score = str(tds[4].contents[0]).strip()
cla = str(tds[5].string).strip()
ulist.append([rank, school, score, cla])
return ulist
def printUnivList(ulist,num):
tplt = "{0:^10}\t{1:^10}\t{2:^10}\t{3:^10}"
print(tplt.format("排名", "学校名称", "总分", "class"))
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], u[3]))
if __name__ == "__main__":
info = []
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
}
url = "https://www.shanghairanking.cn/rankings/bcur/2020"
html = getHTMLText(url,headers)
info = fillUnivList(info, html)
printUnivList(info,30)
结果展示如下:
一起学Python,一起写代码