Python基础练习(一)中国大学定向排名爬取

Stella981
• 阅读 699

说好的要从练习中学习爬虫的基础操作,所以就先从容易爬取的静态网页开始吧!

今天要爬取的是最好大学网上的2018年中国大学排名。我个人认为这个是刚接触爬虫时用来练习的一个很不错的网页了。

在说这个练习之前,给新着手学习爬虫的同学提供一个中国MOOC上北京理工大学嵩天老师的视频, Python网络爬虫与信息提取

今天这个练习便是出自嵩天老师的视频

运行平台:Windows

Python版本:Python3.6

IDE: Sublime Text  Python自带IDLE

其他:Chrome浏览器

简述流程为:

步骤1:利用IDLE简单测试爬取的网页

步骤2:浏览器上查看网页信息

步骤3:从网页中获取HTML文本

步骤4:提取网页信息并存入合适的数据结构

步骤5:利用数据结构输出结果

首先我们可以用Python自带的IDLE来简单测试一下网页是否可访问

  Python基础练习(一)中国大学定向排名爬取

我们通过requests的get方法已经获得了网页的响应,通过返回的状态码200可以知道访问成功,随后用text方法来查看返回的HTML文档,这里要注意记得控制返回的Text文档大小,用切片的方法控制一下,否则很容易使得IDLE无响应。我们注意到返回的源码中有许多乱码,这是怎么回事呢?我们先查看一下网页的编码是什么,返回的‘ISO-8859-1’可以让我们知道该编码不支持中文显示,所以我们可以通过修改编码为‘utf-8’的方法成功取得可以显示中文的源码。当然我们还可以用robotparser模块查看网页的obots.txt文件,robots.txt文件是网页用来告诉我们哪些页面允许爬取,哪些页面不建议爬取,这并不是一个强制性约束的文件,不过在涉及到其他应用的时候,还是建议遵守文件。当然,我们这里只是用来练习,是没啥问题的,需要查看最好大学网的robots。txt文件也可以直接输入网址“ http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html/robots.txt”,当然,你会看到404 Not Found,这表示这个网页没有robots.txt,相应的也就是默认可以爬取的,当然,爬取的时候需要控制好频率。

随后,我们打开Chrome浏览器,打开网页。

Python基础练习(一)中国大学定向排名爬取

可以看到排名都在一个总的表格中,我们要爬取的学校以及总分排名等信息也都在其中。我们可以在清华大学点击鼠标右键,然后点击检查,看看网页返回了什么。

Python基础练习(一)中国大学定向排名爬取

可以在下方看到(也有可能出现在右方,这个可以自己设置,下方这个新出的区域的右上角有三个竖着的点,点击就可以设置了)清华大学,北京,95.3等大学信息都在标签的子标签的里。清楚了我们要爬取的信息位置后,接下来就是写代码获取这些信息了。

  Python基础练习(一)中国大学定向排名爬取

第一步就是使用嵩天老师一直强调的通用代码框架了,这个框架可以用在很多爬虫中用来获取HTML文本,并且它通过response.raise_for_status()方法判断返回的状态码是不是200,如果不是,就会引发HTTPError异常,然后通过try except的异常处理获取到异常,而apparent_encoding则可以使得返回的编码准确。这样一个简单的通用代码框架可以有效的处理访问处理时遇到的网络问题。

Python基础练习(一)中国大学定向排名爬取

第二步则是用BeautifulSoup解析提取到的HTML文本,'html.parser'是Python标准库作为解析器,刚才用浏览器已经看到我们所要提取的信息位置位于标签里,所以用for循环获取找到的所有孩子节点,然后用isinstance方法剔除一些不需要的信息,然后将tr中的td内容合成一个列表,最后将信息存入列表ulist中。

Python基础练习(一)中国大学定向排名爬取

第三步则是将存入列表中的信息格式化输出出来,这一步也可以用文件操作替换,后续很多练习会用到文件存放。这里还是使用format格式化输出的办法。首先来理解一下tplt这个字符串的结构,如图所示:

Python基础练习(一)中国大学定向排名爬取

关于format的其他用法,比如填充对齐,精度控制等大家有兴趣可以百度一下啦。关于chr(12288)则是嵩天老师在优化中文对齐时提到的,因为中文字符对齐与英文字符对齐的宽度不一样,所以用chr(12288)使得采用中文字符的空格对齐。

然后就是使用format输出列表中的文本了。这里还用到了range 来控制输出的大学数。

最后我们看下输出结果,这里只输出了排名前20的大学。

Python基础练习(一)中国大学定向排名爬取

源码的话,由于代码不长,就直接文本放出来吧

'''
利用requests+BeautifulSoup爬取最好大学网中2018年中国大学排名
'''
import requests
from bs4 import BeautifulSoup
import bs4
 
 
def get_one_page(url):
    try:
        response = requests.get(url,timeout=30)
        response.raise_for_status()
        response.encoding = response.apparent_encoding
        return response.text
    except:
        print("产生异常")
        return ""
 
 
def parse_one_page(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[2].string,tds[3].string])
        
 
def print_one_page(ulist,num):
    tplt = "{0:^10}\t{1:{4}^10}\t{2:{4}^10}\t{3:^10}"
    print(tplt.format("排名","学校名称","学校地址","总分",chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0],u[1],u[2],u[3],chr(12288)))
 
 
def main():
    uinfo = []
    url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html'
    html = get_one_page(url)
    parse_one_page(uinfo,html)
    print_one_page(uinfo,20)
 
 
if __name__ == '__main__':
    main()
   

好啦,今天的练习就到此结束了,应该写得还是挺详细的吧(emmmmm)。希望大家能够有所收获咯,当然,大神还是绕路吧,小白瑟瑟发抖。如果有错误的地方,请大家多多指教。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Irene181 Irene181
3年前
3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!
1\.为"你"而写这篇文章,是专门为那些"刚学习"Python爬虫的朋友,而专门准备的文章。希望你看过这篇文章后,能够清晰的知道整个"爬虫流程"。从而能够"独立自主"的去完成,某个简单网站的数据爬取。好了,咱们就开始整个“爬虫教学”之旅吧!2\.页面分析①你要爬取的网站是什么?首先,我们应该清楚你要爬去的网站是什么?由于这里我们想要
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Aimerl0 Aimerl0
3年前
Python网络爬虫与信息提取
title:Python网络爬虫与信息提取date:2020121001:00:23tags:Pythoncategories:学习笔记写在前面不知道写啥其实说实话TOC网络爬虫之规则安装requests库cmd命令行打开输入pip3installrequests,等待即可简单测试,爬一下bkjwpythonimportrequ
Wesley13 Wesley13
3年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Python进阶者 Python进阶者
5个月前
爬取同样内容,xpath方法会比bs4要慢很多吗?
大家好,我是Python进阶者。一、前言前几天在Python白银交流群【沐子山树】问了一个Python网络爬虫的问题,问题如下:爬取同样内容,xpath方法会比bs4要慢很多吗?二、实现过程这里【Kimi】给了个思路如下:爬取网页内容时,使用XPath和B