引言
周末闲来无聊,根据慕课平台的课程练了一波小实例,记录一下成果吧。
环境
- python3
- requests
- BeautifulSoup
- lxml
成果展示
按照上面的逻辑,从爬取的页面分析开始入手
编码之道
目标站分析
首先来看下爬取的网站:http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html
可以看到【排名,学校名字,省市,总分】,而最终的成果也是要的这四个参数!
需要注意的是,爬虫遵循道德,第一件事儿先看下有木有robots协议,若有,尽量遵守0.0…..
所以输入:http://www.zuihaodaxue.com/robots.txt
可以发现nginx转发404页面。也就是说名这个网站并没有robots协议,那直接来爬吧。
F12,来观察下我们想要的信息———-【排名,学校名字,省市,总分】
思路
经过分析,可以看到我们所有想获取的信息都在tbody标签下,并且每个tr标签对应的就是一行的信息数据,而每个td则是对应每列,这样我们可以直接通过遍历tbody下的每个tr标签,在从中获取td标签,拿到对应的内容即可。
代码实现
# coding = utf-8
"""
@author: sy
@file: mooc_university.py
@time: 2018/3/17 14:50
@desc: 大学排名定向爬取实例.....
优先看下是否有robots协议-------http://www.zuihaodaxue.com/robots.txt
发现无robots协议,404页面
http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html
"""
import requests
import bs4
from bs4 import BeautifulSoup as bs
# 获取html的文本
def getHtmlText(url):
# 捕获异常,如果不是200状态码直接抛异常
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "失败!"
# 填充大学列表
def fillUnivList(html, ulist):
# 通过lxml解析html,需要安装lxml库
soup = bs(html, 'lxml')
for tr in soup.find('tbody').children:
# 遍历出来的有些tr并不是bs4的属性,所以去掉
if isinstance(tr, bs4.element.Tag):
# 找出td的内容进行拼接
# 下面的写法是<tag>(....): 等同于tr('td') == tr.find_all('td')
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])
# 打印大学信息
def printUnivInfo(ulist, num):
'''
解决中文填充空格chr(12288),对齐中文格式
{0:}代表的是第几个变量,^10代表的是宽度,1:{4}代表该中文格式化
填充用第四个变量,也就是chr(12288)进行空格填充
'''
tplt = '{0:^10}\t{1:{4}^10}\t{2:{4}^10}\t{3:^10}'
# 打印控制台表头
print(tplt.format('排名', '学校名称', '省市', '总分', chr(12288)))
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], u[3], chr(12288)))
if __name__ == '__main__':
uinfo = []
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html'
html = getHtmlText(url)
fillUnivList(html, uinfo)
# 20是限定打印出多少行元素
printUnivInfo(uinfo, 20)
总结
代码很简单,学到的东西是对于print的format用法,在用format时,若遇到中文,不配置对应的填充规则,在界面展示的时候会对不齐。所以注意下面的代码很重要:
'''
解决中文填充空格chr(12288),对齐中文格式
{0:}代表的是第几个变量,^10代表的是宽度,1:{4}代表该中文格式化
填充用第四个变量,也就是chr(12288)进行空格填充
'''
tplt = '{0:^10}\t{1:{4}^10}\t{2:{4}^10}\t{3:^10}'