题目
使用urllib模块编程实现爬取网站的大学排名。
(网址:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html)
(1)获取网站页面,分析代码结构特征;
(2)处理页面,提取相关信息;
(3)解析数据,输出结果。
代码实现
Python3
import urllib.request
import re
# 获取指定url的源码信息
def getHTMLText(url):
try:
response = urllib.request.urlopen(url, timeout=30)
html = response.read().decode('utf-8')
return html
except:
return "access the web error!"
return ""
# 根据具体结构匹配需要的排名信息,最终以列表的形式返回
def fullTextToSchoolList(html):
# 正则匹配所有学校名称
reg2 = r'<td><div align="left">(.*?)</div></td>'
# 匹配排名信息
reg = r'<td>(.*?)</td>'
reg = re.compile(reg)
reg2 = re.compile(reg2)
ulists=re.findall(reg,html)
unames=re.findall(reg2,html)
# 将学校名称替换到一个list中
i=1
j=0
while i < len(ulists):
ulists[i]=unames[j]
j=j+1
i=i+4
# 返回学校排名信息的列表
return ulists
# 格式化输出结果
def printSchoolList(ulist):
print("{:^9} {:^13} {:^10} {:^6}".format("排名", "学校名称","省市","总分"))
print('========================================================================')
i=0
while i < len(ulist):
rank = ulist[i] # 排名
uname = ulist[i+1] # 学校名
city = ulist[i+2] # 所在城市
totalScore = ulist[i+3] # 总评分
print("{:^10} {:^13} {:^10} {:^6}".format(rank, uname, city,totalScore)) # 格式化输出
i=i+4
# main函数
def main():
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
ulist = fullTextToSchoolList(html)
printSchoolList(ulist)
# 执行main函数
if __name__ == '__main__':
main()
执行结果
其实使用BeautifulSoup模块实现起来更简单,更容易定位排名信息并获取指定标签体的内容。
另一种使用BeautifulSoup库爬取排名
url = "http://www.zuihaodaxue.cn/BCSR/jisuanjikexueyujishu2019.html"
URL变成了2019的。这个最后爬取的内容和上面的一个是不同的。
代码实现
"""
定向爬取最好大学计算机展业排名信息,并输出到控制台
1. getHTMLText(url)
2. fullTextToSchoolList
3. printSchoolList
"""
from bs4 import BeautifulSoup
import requests
import bs4
def getHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
# 注意编码方式
r.encoding=r.apparent_encoding
return r.text
except:
return "access the web error!"
return ""
# 将提取后的结果追加到ulist列表中去
def fullTextToSchoolList(ulist,html):
soup = BeautifulSoup(html,"html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
tds = tr('td')
try:
td0 = tds[0].string
td2 = tds[2].string
td3 = tds[3].string
ulist.append([td0,td2,td3])
except:
pass
def printSchoolList(ulist,num):
print("{:^10} {:^6} {:^10}".format("排名","百分段","学校名称"))
for i in range(num):
u = ulist[i]
print("{:^10} {:^13} {:^10}".format(u[0], u[1], u[2]))
def main():
uinfo = []
url = "http://www.zuihaodaxue.cn/BCSR/jisuanjikexueyujishu2019.html"
html = getHTMLText(url)
fullTextToSchoolList(uinfo,html)
printSchoolList(uinfo,20) # 只输出前20学校
if __name__ == '__main__':
main()
输出结果
以上有错误的地方,欢迎评论指出!!!