前言
本篇内容是一个Python爬虫小练习:基于requests和BeautifulSoup功能库获取中国大学排名相关信息。
网站链接:
https://www.dxsbb.com/news/5463.html
提示:以下是本篇文章正文内容,下面案例可供参考
一、Requests库和BeautifulSoup库
Requests库是在 urllib 的基础上开发而来,它使用 Python 语言编写,并且采用了 Apache2 Licensed(一种开源协议)的 HTTP 库。Requests 库使用方便、快捷,因此在编写爬虫程序时 ,Requests 库使用较多。
BeautifulSoup库提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
二、使用步骤
1.引入功能库
代码如下(示例):
import requests
from bs4 import BeautifulSoup
需要使用requests和BeautifulSoup功能库,可以在终端通过清华大学镜像快速下载
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install Beautifulsoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple
2.完整代码
代码如下(示例):
import requests
from bs4 import BeautifulSoup
# 发起HTTP请求获取HTML内容
def getHTMLText(url):
try:
r = requests.get(url, timeout=30) # 使用requests库发起GET请求,设置超时时间为30秒
r.raise_for_status() # 如果HTTP请求不成功,抛出异常
r.encoding = r.apparent_encoding # 根据HTTP响应内容分析编码方式并设置
return r.text # 返回获取的HTML文本内容
except:
return "" # 发生异常返回空字符串
# 解析HTML并填充数据到列表
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, 'html.parser') # 使用BeautifulSoup解析HTML
for tr in soup.find('tbody').find_all('tr')[1:]: # 查找tbody标签下的所有tr标签,跳过第一个tr(表头)
tds = tr.find_all('td') # 查找每行中的所有td标签
ulist.append([tds[0].string, tds[1].string, tds[2].string]) # 将排名、学校名称、总分信息存入ulist列表中
# 打印排名前num的学校信息
def printUnivList(ulist, num):
print("{:^10}\t{:^10}\t{:^10}".format("排名", "学校名称", "总分", chr(12288))) # 打印表头,使用chr(12288)添加中文空格
for i in range(num):
u = ulist[i] # 获取第i个学校的信息
if None not in u: # 检查信息是否完整
print("{:^10}\t{:^10}\t{:^10}".format(u[0], u[1], u[2])) # 格式化打印排名、学校名称、总分
else:
print("数据缺失") # 如果信息不完整则打印数据缺失
unifo = [] # 创建空列表用于存储学校信息
url = 'https://www.dxsbb.com/news/5463.html' # 目标网页URL
html = getHTMLText(url) # 获取网页HTML内容
fillUnivList(unifo, html) # 解析HTML并将学校信息填充到unifo列表中
printUnivList(unifo, 800) # 打印前800所学校的信息
三、相关优化问题
1.数据缺失
观察运行结果可以发现个别数据缺失的现象,这时候我们可以到对应网站查看对应情况:
进入网页开发者模式检查可以发现缺失数据,例:北京师范大学的标签td中含有a标签,这导致分隔数据而不完整。
解决办法:可以在printUnivList中借助if-else分支处理这种异常数据情况。
2.数据格式
观察运行结果可见:某些校名过长的学校排名格式存在一些错位现象。
解决方法:可以在printUnivList方法中改变一下打印格式来解决这种问题。
总结
以上就是本次分享的全部内容,本文是Python爬虫入门的一个小练习,代码还有很多优化空间,各位小伙伴可以自己动手试一试。