抓取内容:
从最好大学网上抓取中国前10的大学排名、大学名称、总分,并数据格式左对齐。 http://www.zuihaodaxue.cn/zuihaodaxuepaiming2017.html
首先,看下网站的Robots协议,没有找到相关协议,可以抓取。 http://www.zuihaodaxue.cn/robots.txt
接下来开始整理思路:
- 获取网页信息
- 填充列表数据
- 输出列表数据,并进行格式化
- 输出结果
完整代码:
1 import requests 2 from bs4 import BeautifulSoup 3 import bs4 4 5 # 获取网页信息的通用框架 6 def getHtmlText(url): 7 try: 8 r = requests.get(url, timeout = 30) 9 r.raise_for_status() 10 r.encoding = r.apparent_encoding 11 return r.text 12 except: 13 return '爬取失败' 14 15 # 填充列表 16 def fillUnivList(ulist, html): 17 soup = BeautifulSoup(html, 'lxml') 18 for tr in soup.find('tbody').children: 19 # 检查网页代码可以发现数据都储存在tboyd标签中,这里需要对tbody的儿子节点进行遍历 20 if isinstance(tr, bs4.element.Tag): 21 # 检测标签类型,如果不是bs4库支持的Tag类型,就过滤掉,这里需要先导入bs4库 22 tds = tr('td') 23 # 解析出tr标签中的td标签后,将其储存在列表tds中 24 ulist.append([tds[0].string, tds[1].string, tds[3].string]) 25 # 我们需要的是排名、学校名称和总分 26 27 # 格式化后,输出列表数据 28 def printUnivList(ulist, num): 29 tplt = '{:<10}\t{:<10}\t{:<10}' 30 # 定义输出模板为变量tplt,\t为横向制表符,<为左对齐,10为每列的宽度 31 print(tplt.format('排名','学校名称','总分')) 32 # format()方法做格式化输出 33 for i in range(num): 34 u = ulist[i] 35 print(tplt.format(u[0],u[1],u[2])) 36 37 def main(): 38 uinfo = [] 39 url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2017.html' 40 html = getHtmlText(url) 41 fillUnivList(uinfo, html) 42 printUnivList(uinfo, 10) 43 # 选取前10所学校信息 44 main()
运行结果:
操作环境:Mac,Python 3.6,PyCharm 2016.2
参考资料:中国大学MOOC课程《Python网络爬虫与信息提取》
----- End -----
更多精彩内容关注我公众号:杜王丹
作者:杜王丹,互联网产品经理