Python网络爬虫实例——“中国最好大学排名爬取”(嵩天:北理工大学)学习笔记

这个例子比较简单也容易理解,我将细致的解析这个例子中算法流程。写一个博客算是给自己一个激励吧。一起加油。(_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()

输出结果在这里插入图片描述

  1. Python爬虫素材

本实例爬取的页面链接(2019年中国最好大学排行榜)

  • 获取url路径
    首先我们在浏览器中搜索“最好大学网”进入最新一年的大学排名
    在这里插入图片描述
    保存此网页的url链接地址链接地址
    我们想做的事是打印最好大学排名的前二十个信息。从图中可以看到原网页展示的是大学的排名,姓名,省份,总分和生院质量评分等信息。而如果我们只想输出第一、二、四列的信息又该如何呢?在开始实例前进行代码的功能定义:

功能描述

输入:大学排名URL链接
输出:大学排名信息的屏幕输出(排名、大学名称、总分)
技术路线:requests-bs4
本实例属于定向爬虫:仅对输入URL进行爬取,不扩展爬取
备注:在判断定向爬虫是否可行时,我们需要对网页的源代码进行分析,如果源代码中出现了如“清华大学”“94.6”等我们目标的输出信息时则可以。其余情况如用脚本语言写的页面信息可能动态提取,此时定向爬虫就失效了。在爬取的网页右击查看源代码。在这里插入图片描述在这里插入图片描述
我们还需要注意的是当前网站爬虫要遵守的规则,即查看网站的Robots协议(robots协议是在网站根目录后加一个/robots.txt就行)查看方法在浏览器上方输入:http://www.zuihaodaxue.com/robots.txt我们可以看到该网站并未对爬虫进行限制,因此我们可以爬虫。在这里插入图片描述

代码详细解析

  1. 首先导入三个库 requests、Beautiful Soup、bs4
import requests	#请求的作用,简单理解就是向网页请求url链接,进而爬取它
from bs4 import BeautifulSoup
	#这个BeautifulSoup库是对网页的一个排版美化的作用,给原始网页html换行加缩近使其看着更舒适,学过前端的都很容易理解
import bs4	#在第二个方法中用到了bs4的标签定义函数element
  1. 进入程序的结构设计
  • 获取大学排名网页内容——getHTMLText()方法
  • 提取大学排名网页信息并存放进合适的列表里——fillUnivList()方法
  • 将相关结果输出——printUnivList()方法
    1)getHTMLText()方法实现
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></tr>包含了一个大学的所有信息,每个<td></td>又包含了一个大学不同方面
    #的属性值,排名值,评分值等。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])
                          

在这里插入图片描述
3)printUnivList()方法实现

#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日,事情过去了三天的时间,我的内心很平静。还是希望一切都是平平淡淡的,最好什么都不要发生。

  • 14
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三月的一天

你的鼓励将是我前进的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值