学习爬虫,最初的操作便是模拟浏览器向服务器发出请求,那么我们需要从哪个地方开始做起呢?请求需要我们自己来构造吗?需要关心请求这个数据结构的实现嘛?需要了解HTTP、TCP、IP层的网络传输通信吗?需要直到服务器的响应和应答原理吗?
可能你对这些根本不了解,也没办法下手。但是没关系,python为我们提供了功能齐全的类库来帮助我们完成这些请求。最基础的HTTP库有urllib、requests、treq等。
以urllib为例,有了它,我们只需要关心请求的连接是什么。需要传的参数是什么,以及如何设置可选的请求头就好了,不用深入到底层去了解它到底是怎样传输和通信的。有了它,两行代码就可以完成一个请求和相应的处理过程,得到网页内容,是不是感觉方便极了?
接下来,让我们从最基础的部分开始了解这些库的使用方法吧。
使用urllib
首先了解一下urllib库,它是python内置的HTTP请求库,也就是说不需要额外安装即可使用。它包含如下四个模块:
request:它是最基本的HTTP请求模块,可以用来模拟发送请求。就像在浏览器里输入网址然后回车一样,只需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程了。error:异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作以保证程序不会意外终止。parse:一个工具模块,提供了许多URL处理方法,比如拆分、解析、合并等。robotparser:主要是用来识别网站的robots.txt文件,然后判断哪些网站可以爬,哪些网站不能爬,它其实用的比较少。我们着重介绍前三个模块。
发送请求
使用urllib的request模块,我们可以方便地实现请求的发送并得到响应。我们下面来看看它的具体用法:
urlopen( )urllib.request模块提供了最基本的构造HTTP请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理授权验证(authentication)、重定向(redirection)、浏览器Cookies以及其他内容。下面我们来看一下它的强大之处。这里以python官网为例,我们来把这个网页抓取下来:
抓取网页代码
我们可以看到这段代码的运行结果:
运行结果的部分代码截图
这里我们只用了两行代码,便完成了Python官网的抓取,输出了网页的源代码。得到源代码之后么?我们想要链接、图片地址、文本信息不久都可以提取出来了嘛?
接下来,看看它到底返回的是什么。我们利用type( )方法输出响应的类型:
查看响应类型
我们可以看到响应的类型是这样的:
结果
可以发现,它是一个HTTPResponse类型的对象,主要包含read( )、readinto( )、getheader(name)、getheaders( )、fileno( )等方法,以及msg、version、status、reason、debuglevel、closed等属性。
得到这个对象之后,我们把它赋值为response变量,然后就可以调用这些方法和属性,得到返回结果的一系列信息了。
例如,调用read( )方法可以得到返回的网页内容,调用status属性可以得到返回结果的状态码,如200代表请求成功,404代表网页没找到。下一节我们将介绍更多的例子,让大家更加熟悉属性以及参数的知识。