爬虫Day3-urllib介绍

Urllib介绍

在 Python2 版本中,有 Urllib 和 Urlib2 两个库可以用来实现Request的发送。而在 Python3 中,已经不存在
Urllib2 这个库了,统一为 Urllib


urllib分为四个模块:

  • 第一个模块是request,它是最基本的HTTP请求模块,我们可以用它模拟发送请求,就像在浏览器手动输入网址然后敲击回车一样,只需要给库方法传入URL,以及额外的参数,就可以模拟实现整个过程了。
  • 第二个模块是error,即异常处理,如果出现请求错误,我们可以捕获这个异常,然后进行异常的处理,保证程序的稳定性
  • 第三个模块是paser,它是一个工具模块,提供了许多URL处理方法,比如拆分、解析、合并等操作
  • 第四个模块是robotparser,主要是用来识别网站的robots.txt的(反爬虫的文本说明)

下面我就对以上模块进行重点讲解~


request模块

1.urlopen方法:

我们从上面知道,request是HTTP请求模块,那么具体的请求方法是什么呢?没错,正是urlopen!

1
2
urlopen的API:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

我们通过urllib.request.urlopen(“url链接”)就可以请求到网页,如下图所示

这个请求的返回结果response,就是服务器响应内容。紧接着,我们可以调用这个对象包含的方法对返回的内容进行处理。

  • response.read()读取响应内容,它是HTML纯文本,它以字节流的形式返回的,于是要解码成utf-8,得到字符串。

  • respon.status 返回网页的状态码,如果网页的状态码是200,则表示正常。

  • 利用以上最基本的 urlopen() 方法,我们可以完成最基本的简单网页的 GET 请求抓取。



2.data参数

data 参数是可选的,另外如果传递了这个 data 参数,它的请求方式就不再是 GET 方式请求,而是 POST。我们就可以使传递data参数,完成模拟登陆等类似功能… 具体如何模拟from表单,后文的urllib.parser会讲解



3. timeout参数

timeout 参数可以设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间还没有得到响应,就会抛出异常,如果不指定,就会使用全局默认时间。

我们可以通过设置timeout值,从而缩短超时时间。或者是让程序不会一直处于阻塞状态(我们知道,客户端和服务器的交互是一个同步过程,我们可以利用timeout参数,以及异常处理来完成非阻塞的效果,以及让程序不会异常终止,让程序更加稳定)



4.构建Request对象

我们知道利用 urlopen() 方法可以实现最基本请求的发起,但这几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入 Headers 等信息,我们就可以利用更强大的 Request 来构建一个请求。比如可以构建请求链接的浏览器标识等等

下面是正常的urlopen请求和使用Request构建URL的代码举例:

可以发现,我们依然是用 urlopen() 方法来发送这个请求,只不过这次 urlopen() 方法的参数不再是一个 URL,而是一个 Request 类型的对象,这样的好处是:

  • 一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活(将参数全部加到Ruquest对象中作为一个整体发送)


Request配置举例

之前我们说到过,可以构建url链接,比如关键字查询、模拟登陆。还可以模拟浏览器标识,让爬虫更像是一个人为发出的请求信息。具体内容如下:

  1. headers 参数是一个字典,这个就是 Request Headers 了,你可以在构造 Request 时通过 headers 参数直接构造,也可以通过调用 Request 实例的 add_header() 方法来添加。

  2. data就是我们发出的数据了,他会以表单形式向服务器发出

  3. method是方法的意思,我们可以指定method来声明这是一个什么类型的请求方法。



Error模块

前文我们了解了 Request 的发送过程,但是在网络情况不好、被反爬的情况下,出现了异常怎么办呢?这时如果我们不处理这些异常,程序很可能报错而终止运行,所以异常处理还是十分有必要的。

Urllib 的 error 模块定义了由request 模块产生的异常。如果出现了问题,request 模块便会抛出error 模块中定义的异常


1.URLError

URLError 类来自 Urllib 库的 error 模块,它继承自 OSError 类,是 error 异常模块的基类,由 request 模块生的异常都可以通过捕获这个类来处理。它具有一个属性 reason,即返回错误的原因。


2.HTTPError

它是 URLError 的子类,专门用来处理 HTTP 请求错误,比如认证请求失败等等。

它有三个属性。

  • code,返回 HTTP Status Code,即状态码,比如 404 网页不存在,500 服务器内部错误等等。
  • reason,同父类URLError一样,返回错误的原因。(有时候 reason 属性返回的不一定是字符串,也可能是一个对象—可以用 isinstance() 方法来判断它的类型,做出更详细的异常判断。)
  • headers,返回 Request Headers。

因为 URLError是HTTPError 的父类,所以我们可以先选择捕获子类的错误,再去捕获父类的错误,这样捕获的代码更加精准,且有利于程序猿处理。

请求到响应信息不足为奇,也不是什么难事,最主要的,是让程序可以持久的”跑起来”,所以,异常处理是爬虫工程师的必修课,需好好掌握。



parse模块

这是一个工具模块,用的地方挺多的,一些常用操作都封装在里面,如下面介绍的几个函数方法。

1.urlparse()

urlparse() 方法可以实现 URL 的识别和分段,返回六个部分的内容,字段分别是 scheme、netloc、path、params、query、fragment。


2.urlencode()

常用的 urlencode() 方法,它在构造 GET 请求参数的时候非常有用——字典转序列化

  • 我们知道,使用GET发送请求信息,它的参数是 写在URL中的,那么字典一样的数据(爬取数据大多数为字典)如何传递到URL中呢—— 正是上面讲的序列化了。


3.parse_qs()

有了序列化必然就有反序列化,如果我们有一串 GET 请求参数,我们利用 parse_qs() 方法就可以将它转回字典



4.quote()

quote() 方法可以将内容转化为 URL 编码的格式,有时候 URL 中带有中文参数的时候可能导致乱码的问题,所以我们可以用这个方法将中文字符转化为 URL 编码

  • python3 默认编码格式是 Unicode,URL默认不接收这种编码格式,因此我们发送中文字符时,就应该使用相应编码。


5.unquote()

quote() 方法的逆操作,它可以进行 URL 解码(默认是以utf-8编码)


robotparser模块

在介绍rebotparser模块之前呢,我们需要对robots协议进行了解

Robots 协议也被称作爬虫协议、机器人协议,它的全名叫做网络爬虫排除标准(Robots Exclusion Protocol),用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取。它通常是一个叫做 robots.txt 的文本文件,放在网站的根目录下。


robotparse:用来解析rebots文件的类。 robotparser 模块提供了一个类,叫做 RobotFileParser。它可以根据某网站的 robots.txt 文件来判断一个爬取爬虫是否有权限来爬取这个网页。

1
2
3
接口API:
import urllib.robotparser
urllib.robotparser.RobotFileParser(url='')

使用这个类的时候非常简单,只需要在构造方法里传入 robots.txt的链接即可。这样我们就拿到了一个 robot 对象,再调用can_fetch() 就可以返回是否可用爬取网页的布尔值了。


好了,对urllib库的介绍就到这儿了,下次作者会对第三方请求库requests讲解,这是一个当前的流行库,让我们一起期待吧~