剪开黑夜

In the twilight of every early morning

导航

python网络爬虫学习笔记(一)Request库

Posted on 2019-01-22 23:35  剪开黑夜  阅读(822)  评论(0编辑  收藏  举报

一、Requests库的基本说明


 

引入Rquests库的代码如下

import requests

库中支持REQUEST, GET, HEAD, POST, PUT, PATCH, DELETE共7个方法。其中REQUEST方法为基础方法,其它六种方法均通过调用REQUEST方法实现。为了编写程序的便利性,提供了这额外6个方法。我们首先看一下这6个方法的含义,及其在库中对应的函数:

  • GET:请求指定的页面信息,对应requests.get()
  • HEAD:只请求页面的头部,对应requests.head()
  • POST:请求服务器接收所指定的文档作为对所标识的URI的新的从属实体,对应requests.post()
  • PUT:从客户端向服务器取代指定的文档的内容,对应requests.put()
  • PATCH:与PUT功能类似,不同之处在于PUT提交信息的方式是截断的,而PATCH可以进行局部更新。因此与PUT相比,在某些情况下,PATCH可以节省网络带宽。对应requests.patch()
  • DELETE:请求服务器删除指定页面,对应requests.delete()

Requests库支持以下6种访问异常:

  • ConnectionError:网络连接错误异常,如DNS查询失败、拒绝连接等
  • HTTPError:HTTP错误异常
  • URLRequired:URL缺失异常
  • TooManyRedirects:超过最大重定向次数,产生重定向异常
  • ConnectTimeout:连接远程服务器超时异常
  • Timeout:请求URL超时,产生超时异常

二、HTTP协议简介


 

HTTP(Hypertext Transfer Protocol),指超文本传输协议。这一一种基于“请求与相应”模式的无状态的应用层协议(工作在TCP协议之上)。所谓“无状态”,是指多次请求之间并没有关联。HTTP协议采用URL作为定位网络资源的标识,其格式如下:

http://host[:port][path]

  • host:合法的Internet主机域或IP地址
  • port:端口号,缺省为80
  • path:请求资源的路径

HTTP协议对资源的操作方法即为Requests库支持的6个方法(GET, HEAD, POST, PUT, PATCH, DELETE)。

三、Requests库函数详解


3.1 requests.request()

request()函数接受的参数如下:

requests.request(method, url, **kwargs)

其中method为请求方式,对应为'GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'delete', 'OPTIONS'七种方式。

**kwargs为13个可选的控制访问方式,包括:

  • params:字典或字节序列,可以作为参数增加到url中
  • data:字典、字节序列或文件对象,作为Request的内容
  • json:JSON格式的数据,作为Request的内容
  • headers:字典,为HTTP定制头
  • cookies:字典或CookieJar,Request中的cookie
  • auth:元组类型,支持HTTP认证功能
  • files:字典类型,用于传输文件
  • timeout:设定超时时间(以秒为单位)
  • proxies:字典类型,设定访问代理服务器,可以增加登录认证
  • allow_redirects:True/False,默认为True,为重定向开关
  • stream:True/False,默认为True,获取内容立即下载开关
  • verify:True/False,默认为True,认证SSL证书开关
  • cert:本地SSl证书路径

通过几段运行实例来理解控制访问参数:

params:字典或字节序列,可以作为参数增加到url中。

data的格式为字典、字节序列或文件对象,作为Request的内容。

headers格式为字典,可以为HTTP定制头。

files为字典类型,可用于传输文件。

proxies为字典类型,设定访问代理服务器,可以增加登录认证。

掌握了request(),对接下来的封装函数的理解就十分简单了。

3.2 requests.get()

此方法最为常用。最简单的用法即为

r=requests.get(url)

此处,get()构造了一个向服务器请求资源的Request对象(在Requests库内部生成)。函数返回一个包含服务器所有相关资源Response对象

get()函数完成的参数列表如下

requests.get(url, params = None, **kwargs)
  • url:逆获取页面的url链接
  • params:在url中增加的额外参数,格式为字典或者字节流,此参数是可选的
  • **kwargs:其它12个控制访问的参数,也是可选的

正如前文所述,从get()的如下封装源代码可以看出,它是调用request()来封装的。

def get(url, params = None, **kwargs):
    kwargs.setdefault('allow_redirects', True)
    return request('get', url, params = params, **kwargs)

下面我们来看一段运行实例。

其中,status_code是Response对象的属性之一。Response对象比较重要的几项属性罗列如下:

  • status_code:HTTP请求的返回状态,e.g.200表示成功,404表示失败
  • text:HTTP相应内容的字符串形式,即url对应的页面内容
  • encoding:从HTTP header中猜测响应内容的编码方式
  • apprent_encoding:从内容分析出的响应内容编码方式(备选编码)
  • content:HTTP响应内容的二进制形式

基于此,我们给出爬取网页的一个通用代码框架:

import requests

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "exception detected"

if __name__ == "__main__":
    url = "http://www.baidu.com"
    print(getHTMLText(url))

其中,raise_for_status()方法可以判断返回的Response对象是否出现异常。如果返回状态不是200,产生requests.HTTPError。

3.3 requests.head()

head()的参数列表如下:

requests.head(url, **kwargs)

其中**kwargs为13个控制访问参数,同request()。

head()的含义如前所述,通过一段运行实例可以更好地理解。

从实例中看到,运用head()爬取了百度首页的头部信息。但是如果我们想要得到网页文本内容,返回值则为空。

3.4 requests.post()

post()参数列表如下:

requests.post(url, data = None, json = None, **kwargs)

其中,**kwargs为其余11个控制访问参数。

下面来比较两段运行实例:

事实上,当下我们向URL post一个字典时,会自动被编码为form(表单)。

 3.5 requests.put()

requests.put(url, data=None, **kwargs)

其中,**kwargs为其余12个控制访问参数。

下面是一段运行实例:

 

3.6 requests.patch()

requests.patch(url, data=None, **kwargs)

**kwargs为其余12个控制访问参数。

3.7 requests.delete()

requests.delete(url, **kwargs)

url为拟删除页面的ur链接。**kwargs为13个控制访问参数。

 

相关内容为笔者根据中国大学MOOC网站嵩天教授的python爬虫课程所撰写的学习笔记,感谢中国MOOC学习平台提供的学习资源与嵩老师的授课。