一、程序实现需要的几个函数库
requests和 bs4
其中requests库用来爬取网页内容,使用beautifulsoup4库分析网页中的数据,提取学校排名并且打印出来。
首先这两个库是要提前下载的:
需要我们使用cmd进入到我们python下载所在的文件中的Scripts文件中,输入下列指令下载即可
import requests
from bs4 import BeautifulSoup
import bs4
二、程序分析
简单分析一下,其实相对简单,主要由以下这几个主要的函数组成,
1.def getHTMLText(url):
(1).try.....except语句,一般使用其实现异常处理机制从而控制用户输入的常用方法。
try:
<语句>
except <name>:
<语句> #如果在try部份引发了名为'name'的异常,则执行这段代码
else:
<语句> #如果没有异常发生,则执行这段代码
(2)res = requests.get(url,headers=headers)向网站发起请求,并获取响应对象
参数:
url :需要抓取的URL地址
headers : 请求头
timeout : 超时时间,超过时间会抛出异常
响应对象(res)属性
encoding :响应字符编码 res.encoding = 'utf-8'
text :字符串 网站源码
content :字节流 字符串网站源码
status_code :HTTP响应码
url :实际数据的URL地址
三、完整代码
import requests
from bs4 import BeautifulSoup
import bs4
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):
soup = bs4.BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
# 检测tag类型,过滤非tag类型标签
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([str(tr('td')[0].contents[0]).strip(), tds[1].a.string, str(tr('td')[4].contents[0]).strip()])
return ulist
def printUnivList(ulist, num):
# tplt = "{0:^10}\t{1:{3}^6}\t{2:^10}"
print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校名称", "总分"))
# print(tplt.format("排名","学校名称","总分",chr=(12288)))
for i in range(num):
u = ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))
# print(tplt.format(u[0],u[1],u[2],chr=(12288)))
def main():
ulist = []
url = 'https://www.shanghairanking.cn/rankings/bcur/2020'
html = getHTMLText(url)
ulist = fillUnivLIst(ulist, html)
printUnivList(ulist, 20)
main()
四、效果展示
五、可能存在的隐患以及解决方法
1.网络请求没有设置Headers,可能被服务器认为是机器人程序而被封禁。
2.爬虫程序中没有对返回值进行校验,可能导致程序解析失败或出现异常。
3.在填充数据到列表中时,没有进行数据类型转换和校验,可能会出现类型不匹配或空指针异常等问题。
4.输出数据时,没有进行编码格式设置,可能导致控制台输出乱码。
针对可能的隐患,可以采取以下方案:
1.设置合适的Headers,模拟浏览器行为,避免被封禁。
2.在网络请求返回值进行校验,并使用try...except...语句捕获异常,避免程序因解析失败而崩溃。
3.在数据填充时,可以对数据类型进行转换,并使用if...else...语句进行校验,避免程序出现异常。
4.在输出数据时,可以设置编码格式,保证输出数据的可读性。
以上是我总结出可能存在的隐患,下一步学习我会着重对这些方面进行提升。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。