一、程序实现须要的几个函数库
requests和 bs4
其中requests库用来爬取网页内容,应用beautifulsoup4库剖析网页中的数据,提取学校排名并且打印进去。
首先这两个库是要提前下载的:
须要咱们应用cmd进入到咱们python下载所在的文件中的Scripts文件中,输出下列指令下载即可
import requestsfrom bs4 import BeautifulSoupimport 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 requestsfrom bs4 import BeautifulSoupimport bs4def 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 ulistdef 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.在输入数据时,能够设置编码格局,保障输入数据的可读性。
以上是我总结出可能存在的隐患,下一步学习我会着重对这些方面进行晋升。