文章目录
Python爬虫(七)——中国大学排名定向爬虫
我们将使用上海交大开发的软科排名。网站:
http://www.zuihaodaxue.com/BCSR/ruanjiangongcheng2019.html
我们的目的是从这个网页中提取出2019年中国软件工程学科的排名、大学名称和总分。我们将会使用requests和bs4库。
确定爬虫是否可行
首先我们打开这个网站查看网站源代码。
发现里面有我们要的信息。然后查看网站的robots.txt,发现没有这个文件,因此我们爬取信息是合法的。
设计程序的结构
步骤
整个过程可以分为三步
- 从网络上获取大学排名网页内容,方法get_HTML_text()
- 提取网页内容中信息到合适的数据结构中,方法fill_univ_list()
- 利用数据结构展示结果,方法print_univ_list()
实现方法
模块的引入
我们使用requests库和bs4库,代码:
import requests
from bs4 import BeautifulSoup
import bs4
get_HTML_text()
输入为网页链接,输出为网页内容
代码:
def get_HTML_text(url):
try: #使用之前的代码框架返回html
r=requests.get(url,timeout=30)
r.raise_for_status() #如果出现异常返回空字符串
r.encoding=r.apparent_encoding
return r.text
except:
return ""
fill_univ_list()
输入为网页内容,然后将排名信息写入列表中。我们先观察网页HTML代码中的规律。
我们发现整个排名在tbody中,每个大学都在一个tr中,每个信息在td中。
代码:
def fill_univ_list(ulist, html):
soup = BeautifulSoup(html, 'html.parser') #解析网页代码
for tr in soup.find('tbody'):
if isinstance(tr, bs4.element.Tag) and len(tr('td')) == 7: #检测标签的类型,过滤不是bs4中定义的Tag类型,这里需要引用bs4库
tds = tr('td')
ulist.append([tds[0].string, tds[3].string, tds[6].string]) #注意排名、大学名称和分数在第几个
print_univ_list()
输入为排名的列表,然后打印出来。这里使用.format()格式化输出。为了保证对齐我们使用中文字符填充。
代码:
def print_univ_list(ulist, num):
tplt = "{0:{3}^10}\t{1:{4}^10}\t{2:{5}^10}" #定义一个输出模板的变量
print(tplt.format("排名", "学校名称", "总分", chr(12288), chr(12288), chr(12288)))
for i in range(num):
u = ulist[i]
print(" "+tplt.format(u[0], u[1], u[2], chr(12288), chr(12288), chr(12288)))
全部代码
import requests
from bs4 import BeautifulSoup
import bs4
def get_HTML_text(url):
try: #使用之前的代码框架返回html
r = requests.get(url, timeout=30)
r.raise_for_status() #如果出现异常返回空字符串
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def fill_univ_list(ulist, html):
soup = BeautifulSoup(html, 'html.parser') #解析网页代码
for tr in soup.find('tbody'):
if isinstance(tr, bs4.element.Tag) and len(tr('td')) == 7: #检测标签的类型,过滤不是bs4中定义的Tag类型,这里需要引用bs4库
tds = tr('td')
ulist.append([tds[0].string, tds[3].string, tds[6].string]) #注意排名、大学名称和分数在第几个
def print_univ_list(ulist, num):
tplt = "{0:{3}^10}\t{1:{4}^10}\t{2:{5}^10}" #定义一个输出模板的变量
print(tplt.format("排名", "学校名称", "总分", chr(12288), chr(12288), chr(12288)))
for i in range(num):
u = ulist[i]
print(" "+tplt.format(u[0], u[1], u[2], chr(12288), chr(12288), chr(12288)))
uinfo = []
url = 'http://www.zuihaodaxue.com/BCSR/ruanjiangongcheng2019.html'
html = get_HTML_text(url)
fill_univ_list(uinfo, html)
print_univ_list(uinfo, 20)
来源:CSDN
作者:等等,还有一个bug
链接:https://blog.csdn.net/qq_18543557/article/details/104162270