《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}\t\t{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}\t\t{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~

  • 7
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峰勇力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值