# 爬虫的爬取的四个阶段
# 分别是:排名、学校名称、地区、总分
# 四个字段都在tr标签下
# 1、排名字段在tr标签中的一个td标签中
# 2、学校名称字段在tr标签下的一个a标签中,并且属性是class=name-cn
# 3、地区字段也在tr标签下的一个td标签中
# 4、总分字段任然在tr标签下的一个td标签中
# 5、每一对tr标签代表一所大学的信息
# 二维结构分析:四个阶段(排名、学校名称、地区、总分)
# 爬虫需要编写的函数如下:
# 1、使用request库去软科网址爬取源代码https://shanghairanking.cn/rankings/bcur/2023
# 2、使用bs4库解析爬取下来的源代码
# 3、构建一个二维结构的数组,这个包含的数组有四列
# 4、填充二维数据
# 导包导库
import requests
import bs4
from bs4 import BeautifulSoup
# 去软科网址爬取源代码
def getHTMLText(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return ""
# 构建一个二维的存储数据结构,并且将爬虫的源码做解析
# 解析函数
def fillUnivList(ulist,html):
# ulist:爬虫最终提供的列表
# html就是爬虫下来的源代码
soup=BeautifulSoup(html,"html.parser")
# 提取soup中我们想要的关键信息:排名、学院名称、地区、总分
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
# td标签的列表或者数组,记录到tds数组中
tds=tr('td')
a=tr('a','name-cn')
ulist.append([tds[0].string.strip(),a[0].string.strip(),tds[2].text.strip(),tds[4].string.strip()])
# 打印输出数据,并且在输出的时候设置我们的输出格式:排名、学校名称、地区、总分
# 通过分析得出学校名称这个字段给出的空间要比其他三个字段大
# 需要将我们爬取的个数做灵活判断。输出可以是10,20,30,学校的排名
# 定义输出格式函数
def printUnivList(ulist, num):
#创建格式数据
tplt = "{0:^10}\t{1:{4}^10}\t{2:^10}\t{3:^10}"
# 打印输出标头:排名、学校名称、地区、总分
print(tplt.format("排名", "学校名称", "地区", "总分", chr(12288)))
# 打印输出表单:四个字段对应的数据
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], u[3], chr(12288)))
# 定义主函数
def main():
# 预定一个空列表
uinfo=[]
# 给出爬虫的url地址
url="http://www.shanghairanking.cn/rankings/bcur/2023"
# 调用刚才定义的三个函数完成爬虫
html=getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,30)
if __name__ == "__main__":
main()
request和bs4的使用
于 2023-05-17 11:14:28 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)