定向爬取中国大学排名
模块设计
目标网站:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html
爬的是2019年的排名,先祭出框架。
1 2 3 4 5 6 7 8 9 10 11
| import requests
def getHTMLText(url): try: res = requests.get(url) res.raise_for_status() res.encoding = res.apparent_encoding return res.text except: return "异常"
|
再编写一个函数来提取关键信息,将每一条记录存入列表中。
1 2 3 4 5 6 7 8
| import bs4
def fillUnivList(ulist, html): soup = bs4.BeautifulSoup(html, "html.parser") for tr in soup.find('tbody').children: if isinstance(tr, bs4.element.Tag): ulist.append([tr('td')[0].string, tr('td')[1].string, tr('td')[2].string, tr('td')[3].string])
|
涉及到节点的问题,这些子节点不仅有标签,还有注释,字符串。可以在源代码中看出来,也可以用type打印每一个节点查看它们的类型。所以要用isinstance判断类型。
接下来再写一个排版输出的函数
1 2 3 4
| def printUnivRank(ulist, num): print("{0:^16}\t{1:{3}^16}\t{2:^16}".format("排名", "学校名称", "位置", chr(12288))) for i in range(num): print("{0:^16}\t{1:{3}^16}\t{2:^16}".format(ulist[i][0], ulist[i][1], ulist[i][2], chr(12288)))
|
跟着视频做,据说是对齐问题,要用chr(12288)字符,就是中文的全角空格。
字段宽度可以适当的设大一点。
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| import requests import bs4
def getHTMLText(url): try: res = requests.get(url) res.raise_for_status() res.encoding = res.apparent_encoding return res.text except: return "异常"
def fillUnivList(ulist, html): soup = bs4.BeautifulSoup(html, "html.parser") for tr in soup.find('tbody').children: if isinstance(tr, bs4.element.Tag): ulist.append([tr('td')[0].string, tr('td')[1].string, tr('td')[2].string, tr('td')[3].string])
def printUnivRank(ulist, num): print("{0:^16}\t{1:{3}^16}\t{2:^16}".format("排名", "学校名称", "位置", chr(12288))) for i in range(num): print("{0:^16}\t{1:{3}^16}\t{2:^16}".format(ulist[i][0], ulist[i][1], ulist[i][2], chr(12288)))
def main(): url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html" text = getHTMLText(url) ulist = [] fillUnivList(ulist, text) printUnivRank(ulist, 10)
main()
|
运行结果
排名 学校名称 位置
1 清华大学 北京
2 北京大学 北京
3 浙江大学 浙江
4 上海交通大学 上海
5 复旦大学 上海
6 中国科学技术大学 安徽
7 华中科技大学 湖北
7 南京大学 江苏
9 中山大学 广东
10 哈尔滨工业大学 黑龙江
这是个很典型的实例,python实验课也做了一次,但是比较匆忙直接摘抄网上的,现在再做一次顺便写个博客真是美滋滋。