本帖最后由 only 于 2020-2-27 22:04 编辑
2月27日:中国大学排名定向爬虫实例
首先我们打开中国最好大学网
我们可以看见各大高校的排名情况,之后右键->查看源代码
我们发现网页不存在,这说明这个网站并没有通过robots协议对爬虫做相关的限制
了解了程序的可行性之后,我们需要对程序的结构进行初步的设计
1.从网络上获取大学排名的网页内容 (getHTMLText())
2.提取网页内容中的信息到合适的数据结构 (fillUnivList())
3.利用数据结构展示并输出结果 (printUnivList())
接下来我们开始编写程序,首先写出程序的结构框架:
- import requests
- from bs4 import BeautifulSoup
- #获取url
- def getHTMLText(url):
- return""
- #将文章信息放入ulist列表中
- def fillUnivList(ulist,html):
- pass
- #将ulist信息打印
- def printUnivList(ulist,num):
- print("Suc" + str(num))
- def main():
- uinfo = []#存入大学信息
- url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html"
- html = getHTMLText(url)
- fillUnivList(uinfo, html)
- printUnivList(uinfo, 20)#列举前20所
- main()
复制代码 然后我们完善函数的相关功能:
第一个函数,我们用try..except框架实现:
- #获取url
- def getHTMLText(url):
- try:
- r = requests.get(url, timeout=30)#利用get获取url信息
- r.raise_for_status()#产生异常信息
- r.encoding = r.apparent_encoding#修改编码
- return r.text#返回网页信息
- except:
- return ""#若出现错误则返回空字符串
复制代码接下来我们第二个函数是要提取html中关键数据,并添加到一个列表里:
- #将文章信息放入ulist列表中
- def fillUnivList(ulist, html):
- soup = BeautifulSoup(html, "html.parser")
- for tr in soup.find('tbody').children:#源码中可发现所有的大学信息被封装在tbody标签中
- if isinstance(tr, bs4.element.Tag):#每个大学的信息封装在tr标签中,isinstance是检查bs4库的标签类型,若不是tag,就被过滤
- tds = tr('td')#tr中的信息被td包围
- ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])
复制代码最后是打印大学列表:
- def printUnivList(ulist, num):
- print('{0:^5}\t{1:{4}^10}\t{2:{4}<5}\t{3:^5}'.format('排名', '学校名称', '城市', '总分', chr(12288)))#表头
- for i in range(num):
- u = ulist[i]
- print('{0:^5}\t{1:{4}^10}\t{2:{4}<5}\t{3:^6}'.format(u[0], u[1], u[2], u[3], chr(12288)))
复制代码
好了,我们将所有代码整理,程序如下:
- import requests
- from bs4 import BeautifulSoup
- import bs4
- #获取url
- def getHTMLText(url):
- try:
- r = requests.get(url, timeout=30)#利用get获取url信息
- r.raise_for_status()#产生异常信息
- r.encoding = r.apparent_encoding#修改编码
- return r.text#返回网页信息
- except:
- return ""#若出现错误则返回空字符串
- #将文章信息放入ulist列表中
- def fillUnivList(ulist, html):
- soup = BeautifulSoup(html, "html.parser")
- for tr in soup.find('tbody').children:#源码中可发现所有的大学信息被封装在tbody标签中
- if isinstance(tr, bs4.element.Tag):#每个大学的信息封装在tr标签中,isinstance是检查bs4库的标签类型,若不是tag,就被过滤
- tds = tr('td')#tr中的信息被td包围
- ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])
- #将ulist信息打印
- def printUnivList(ulist, num):
- print('{0:^5}\t{1:{4}^10}\t{2:{4}<5}\t{3:^5}'.format('排名', '学校名称', '城市', '总分', chr(12288)))#表头
- for i in range(num):
- u = ulist[i]
- print('{0:^5}\t{1:{4}^10}\t{2:{4}<5}\t{3:^6}'.format(u[0], u[1], u[2], u[3], chr(12288)))
- def main():
- uinfo = []#存入大学信息
- url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html"
- html = getHTMLText(url)
- fillUnivList(uinfo, html)
- printUnivList(uinfo, 20)#列举前20所
- main()
复制代码
运行结果如下:
其中,我们还需注意的地方是在第二个函数中我们导入了bs4 库,因此在程序前不能忘记import bs4
|