功能
输入:大学排名URL链接
输出:大学排名的信息(排名,大学名称,总分)
可行性
robost.txt协议
键入http://zhuihaodaxue.com/robots.txt
即对爬虫无限制
查看网页源代码
结构:
排名部分的结构
< tbody>
<tr>
<td>...</td>
<td>...</td>
...
</tr>
<tr>
<td>...</td>
<td>...</td>
...
</tr>
...
</tbody>
所以需要构造循环遍历tr,并将tr及其td保存为二维数组
因此需要:
ulist=[]
for tr in soup.find("tbody").children:
if isinstance(tr,bs4.element.Tag): #对不是Tag标签的tr进行剔除
tds=tr("td") #对一个大学的相关数据保存
ulist.append([tds[0].string, tds[1].string, tds[3].string]) #将需要的数据进行提取tds[3]为得分
关于isintance()函数的使用可以按如下来简单理解:
>>>a = 2
>>> isinstance (a,int)
True
>>> isinstance (a,str)
False
函数
getHTMLText()——输入url,返回html
fillUnivList()——输入ulist,html对ulist操作
printUnivList()——输入ulist,num,并打印(注意格式)
import requests
import bs4
from bs4 import BeautifulSoup
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=BeautifulSoup(html,"html.parser")
for tr in soup.find("tbody").children:
if isinstance(tr,bs4.element.Tag):
tds=tr("td")
ulist.append([tds[0].string,tds[1].string,tds[3].string])
def printUnivList(ulist,num):
print("{0:^10}\t{1:{3}^10}\t{2:^10}".format("排名","学校","得分",chr(12288)))
for i in range(num):
print("{0:^10}\t{1:{3}^10}\t{2:^10}".format(\
ulist[i][0],ulist[i][1],ulist[i][2],chr(12288)))
def main():
url="http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html"
ulist=[]
html=getHTMLText(url)
fillUnivList(ulist,html)
printUnivList(ulist,20)
main()
输出结果:
排名 学校 得分
1 清华大学 94.6
2 北京大学 76.5
3 浙江大学 72.9
4 上海交通大学 72.1
5 复旦大学 65.6
6 中国科学技术大学 60.9
7 华中科技大学 58.9
7 南京大学 58.9
9 中山大学 58.2
10 哈尔滨工业大学 56.7
11 北京航空航天大学 56.3
12 武汉大学 56.2
13 同济大学 55.7 #果然我校录取分录取分高而排名不高
14 西安交通大学 55.0
15 四川大学 54.4
16 北京理工大学 54.0
17 东南大学 53.6
18 南开大学 52.8
19 天津大学 52.3
20 华南理工大学 52.0
>>>
其中使用chr(12288)填充是为了输出时美观