栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

《python网络爬虫与信息提取》——实例1:中国大学排名爬取

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《python网络爬虫与信息提取》——实例1:中国大学排名爬取

最近在刷北京理工大学的pyhton课程,因为在学基础,就想着想把当时的心得和想法记录下来,同时做一个总结。
我在看这个课程的时候,课程已经是2016年的了,所以嵩天老师上面讲的爬取中国大学排名的代码已经不适用了,所以想在这里更新一下:
首先中国大学排名的网站已经变更,变成:https://www.shanghairanking.cn/rankings/bcur/2021

其次所要爬取的内容框架有点不一样了。
好了,我们接下来谈怎么爬取吧。
这是效果图:

还是按照课程的要求,我采用requests库和beautifulsoup库,其中我还加了re库(正则表达式库,这是自带的不用安装)
功能需求:
输入:大学排名的url链接
输出:大学排名的屏幕信息(包括排名,大学名称,总分,层次)
技术路线:requests,bs4,re
定向爬虫:仅对输入的url链接爬取
爬虫的第一步,应该先看看该网站是否可以爬取,通过查看robot协议,该网站是允许爬取的。

首先导入库:
import requests
from bs4 import BeautifulSoup #B和S要大写!!!这里吃了亏。。。。
import re
创建获取网页数据的函数:
#获取网页数据
def getunivText(url):
	try:
		r = requests.get(url)
		r.raise_for_status()
		r.encoding = r.apparent_encoding
		return r.text
	except:
		return ""
创建解析函数并且将爬取内容存储的函数:
def fillunivList(ulist,html):
	soup = BeautifulSoup(html,'html.parser') #使用html.parser解析html文本,以便使用soup搜索。
	for tr in soup.find('tbody').children:
    	tds = tr.find_all('td')
    	temp = []
    	for i in [0,1,4,5]:
        	if i !=1:
            	t = tds[i].string
            	temp.append(re.sub('s*|n','',t))
        	else:
            	t = tds[i].find('a')
            	temp.append(temp.string)
    	ulist.append(temp)
    return ulist

这部分是核心部分,通过查看网页的F12,发现我们所要的数据都在tbody这个标签里面:

tbody下面的每一个tr标签里面的内容就是一所大学的信息:

经观察tr标签下面的td标签,总共有6个,其中第1个,第2个,第5个,第6个才是我们所要的排名,名称,总分,办学层次的数据,其中第2个标签内,清华大学的名称还不在td标签内,在a标签内

所以用了一个if条件判断,来独立获取大学的名称信息。
这句:

	for i in [0,1,4,5]:
        	if i !=1:
            	t = tds[i].string
            	ulist.append(re.sub('s*|n','',t))
        	else:
            	temp = tds[i].find('a')
            	ulist.append(temp.string)

而re.sub(’s*|n’,’’,t),的含义是将字符串t中的空格(多个或者一个)以及换行符n替换成空。因为在获取.string的过程中发现了字符串里有干扰字符空格和换行符。

创建打印函数
def printunivRank(ulist,num):
	print('{0:^4}t{1:^10}tt{2:^5}t{3:^5}'.format('排名','大学名称','总分','办学层次'))
	for i in range(num):
		a,b,c,d = ulist[i]
		print('{0:{4}^4}t{1:{4}^10}t{2:{4}^5}t{3:{4}^5}'.format(a,b,c,d,chr(12288)))
最后一步,创建主函数
def main():
	url = 'https://www.shanghairanking.cn/rankings/bcur/2021'
	html_text = getunivText(url)
	unilist = [] #创建存储排名数据列表
	fillunivList(unilist,html_text)
	print(printunivRank(unilist,20))
main()

完整代码:

import requests
from bs4 import BeautifulSoup
import re
#创建获取网页数据的函数geunivText
def getnuivText(url):
    try:
        r = requests.get(url)
        r.raise_for_status
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ''
#创建解析函数并将爬取的目标数据存储
def fillunivList(ulist,html):
   soup = BeautifulSoup(html,'html.parser')
   for tr in soup.find('tbody').children:
      tds = tr.find_all('td')
      temp = []
      for i in [0,1,4,5]:
         if i != 1:
            t = tds[i].string
            temp.append(re.sub('s*|n','',t))
         else:
            t = tds[i].find('a')
            temp.append(t.string)
      ulist.append(temp)
   return ulist
#创建打印函数
def printunivRank(ulist,num):
   print('{0:^4}t{1:^10}tt{2:^5}t{3:^5}'.format('排名','大学名称','总分','办学层次'))
   for i in range(num):
      a,b,c,d = ulist[i]
      print('{0:{4}^4}t{1:{4}^10}t{2:{4}^5}t{3:{4}^5}'.format(a,b,c,d,chr(12288)))
def main():
   url = 'https://www.shanghairanking.cn/rankings/bcur/2021'
   html_text = getnuivText(url)
   unlist = []
   fillunivList(unlist,html_text)
   print(printunivRank(unlist,20))
main()

输出结果:

环境:
python 3.8
使用的是集成包anacoda
win10
64位
OVER~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/272540.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号