python 中国大学排名爬虫
首先,给一个最好大学网URL:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html,点击这里进入.
功能描述
输入:大学排名URL链接
输出:大学排名信息的屏幕输出(排名,大学名称,总分)
技术路线:requests‐bs4
定向爬虫:仅对输入URL进行爬取,不扩展爬取
定向爬虫可行性
在最好大学网点击右键,查看源代码,Ctrl+F搜索清华大学,可以到与每一个大学额相关对应的代码部分,如下图:
可以看到这段代码是使用tr标签来索引的一段信息,从代码段可以看到相关大学的排名,名称和总分信息,因此可以实现定向爬虫。
此外还要注意该网站是否提供了robots协议的约定:
可以手工查看是否符合:http://www.zuihaodaxue.cn/robots.txt,可以发现该网站并不存在,说明该网站没有对爬虫作相关限制。
程序的结构设计
步骤1:从网络上获取大学排名网页内容 getHTMLText()
步骤2:提取网页内容中信息到合适的数据结构 fillUnivList()
步骤3:利用数据结构展示并输出结果 printUnivList()
直接上代码:
导入相关库:
import requests
from bs4 import BeautifulSoup
import bs4
编写函数 getHTMLText()
:
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
编写函数 fillUnivList()
:
def fillUnivList(ulist, html):
soup = BeautifulSoup(html,"html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string,tds[1].string,tds[3].string])
编写函数 printUnivList()
:
def printUnivList(ulist, num):
tplt="{0:^10}\t{1:{3}^8}\t{2:^10}"
print("{0:^8}\t{1:{3}^8}\t{2:^8}".format("排名","学校名称","总分", chr(12288)))
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], chr(12288)))
中文对齐问题原因及解决方案
① 中文对齐原因:
② 解决方案:
利用chr(12288)修改输出格式。
运行结果:
完整程序代码:
import requests
from bs4 import BeautifulSoup
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 ""
def fillUnivList(ulist, html):
soup = BeautifulSoup(html,"html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string,tds[1].string,tds[3].string])
def printUnivList(ulist, num):
tplt="{0:^10}\t{1:{3}^8}\t{2:^10}"
print("{0:^8}\t{1:{3}^8}\t{2:^8}".format("排名","学校名称","总分", chr(12288)))
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], chr(12288)))
def main():
uinfo = []
url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html"
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20)
main()
声明:本博客内容为学习慕课上嵩天副教授的python网络爬虫与信息提取课程后所做的总结。