这个例子比较简单也容易理解,我将细致的解析这个例子中算法流程。写一个博客算是给自己一个激励吧。一起加油。(_ZHJ三月和九月)
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}^10}\t{2:^10}"
print(tplt.format("排名","学校名称","总分",chr(12288)))
for i in range(num):
u=ulist[i]
print(tplt.format(u[0],u[1],u[2],chr(12288)))
print("Suc"+str(num))
def main():
uinfo=[]
url='http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html'
html=getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,20)
main()
本实例爬取的页面链接(2019年中国最好大学排行榜)
输入:大学排名URL链接
输出:大学排名信息的屏幕输出(排名、大学名称、总分)
技术路线:requests-bs4
本实例属于定向爬虫:仅对输入URL进行爬取,不扩展爬取
备注:在判断定向爬虫是否可行时,我们需要对网页的源代码进行分析,如果源代码中出现了如“清华大学”“94.6”等我们目标的输出信息时则可以。其余情况如用脚本语言写的页面信息可能动态提取,此时定向爬虫就失效了。在爬取的网页右击查看源代码。
我们还需要注意的是当前网站爬虫要遵守的规则,即查看网站的Robots协议(robots协议是在网站根目录后加一个/robots.txt就行)查看方法在浏览器上方输入:http://www.zuihaodaxue.com/robots.txt我们可以看到该网站并未对爬虫进行限制,因此我们可以爬虫。
import requests #请求的作用,简单理解就是向网页请求url链接,进而爬取它
from bs4 import BeautifulSoup
#这个BeautifulSoup库是对网页的一个排版美化的作用,给原始网页html换行加缩近使其看着更舒适,学过前端的都很容易理解
import bs4 #在第二个方法中用到了bs4的标签定义函数element
def getHTMLText(url):
try:
r=requests.get(url,timeout=30)#通过get函数获取url信息
r.raise_for_status()#用于产生异常信息
r.encoding=r.apparent_encoding#修改编码,apparent_encoding一般为utf-8
return r.text#成功则返回该链接的网页信息
except:
return ""#否则为异常信息,返回空串
2)fillUnivList()方法实现
#从网页信息中提取想要的信息并存入列表ulist中
def fillUnivList(ulist,html):
soup=BeautifulSoup(html,"html.parser")
#通过BeautifulSoup函数对页面进行调整,使得格式更加方便看,采用html的解析器
#以下函数需要观察网页源代码进行写,从下图可以看出:一个 包含了一个大学的所有信息,每个 又包含了一个大学不同方面
#的属性值,排名值,评分值等。tr的上一个属性是tbody,通过tbody的孩子节点找遍历所有的tr,在tr标签中找到td标签的信息,并将第1、2、4对应于tds数组中第0、1、3列的信息存贮进ulist中
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):
#过滤掉bs4库定义的非标签信息的其他信息
tds=tr('td')
ulist.append([tds[0].string,tds[1].string,tds[3].string])
#ulist表示打印数据的类型,在这里是列表类型,num表示打印多少行数据
#该方法的作用就是将保存在ulist列表里的num行数据打印输出
def printUnivList(ulist,num):
tplt="{0:^10}\t{1:{3}^10}\t{2:^10}"
#用tplt存放输出 格式的定义;其中^表示居中对齐,10表示按10个字符的长度输出。长度不够补空格,{3}表示使用format函数的第三个变量进行填充,即使用中文的空格进行填充。
print(tplt.format("排名","学校名称","总分",chr(12288)))
#Python使用.format函数进行格式化输出
#chr(12288)表示按中文的习惯进行填充空格,为了输出对齐的约束
for i in range(num):
u=ulist[i]
print(tplt.format(u[0],u[1],u[2],chr(12288)))
print("Suc"+str(num))
#打印成功输出一个标记Suc**22**
4)定义主函数——main()
def main():
uinfo=[]#存放大学信息,数据结构为列表形式
url='http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html'#存放爬虫网页链接
html=getHTMLText(url)#获取该网页内容
fillUnivList(uinfo,html)#分析该网页内容并存放uinfo列表中
printUnivList(uinfo,20)#将列表中前20个信息打印出来
main()#调用main函数,程序入口
写给自己:2019年3月20日,事情过去了三天的时间,我的内心很平静。还是希望一切都是平平淡淡的,最好什么都不要发生。