python Requests库入门
一、Requests 库的安装
对Requests库 了解更多请移步:http://www.python-requests.org
安装操作:
win平台:“以管理员身份运行” cmd ,执行 pip install requests
测试安装是否成功:
>>> import requests >>> r=requests.get('http://www.baidu.com') >>> print(r.status_code) 200
二、Requests 库的7个主要方法
requests.request() 构造一个请求,支撑以下各方法的基础方法 requests.get() 获取HTML网页的主要方法,对应HTTP的GET requests.head() 获取HTML网页头信息的方法,对应HTTP的HEAD requests.post() 向HTML网页提交POST请求的方法,对应HTTP的POST requests.put() 向HTML网页提交PUT请求的方法,对应HTTP的PUT requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH requests.delete()向HTML页面提交删除请求,对应于HTTP的DELETE
【最常用方法】requests.get()
Response = requests.get(url) #requests.get(url) 构造一个向服务器请求资源的Request对象 #Response 返回一个包含服务器资源的Response对象。是爬虫返回的全部内容
三、Response 对象的属性:
r.status_code HTTP请求的返回状态,200表示连接成功,404表示失败(只要不是200,返回的请求都是失败的) r.text HTTP响应内容的字符串形式,即,url对应的页面内容 r.encoding 从HTTP header中猜测的响应内容编码方式 r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式) r.content HTTP响应内容的二进制形式
例子:在使用requests.get()方法获取网上资源的时候,有一个基本的流程:首先用 r.status_code来检查返回的 Response 对象的状态。如果是200,就使用 r.encoding r.apparent_encoding r.content 等去解析返回的内容。如果返回的状态码是 404或者其他,那就说明这次url的访问由于某种原因出错了或产生异常。
>>> import requests >>> r=requests.get('http://www.baidu.com') >>> print(r.status_code) 200 >>> r.text #内容中很多都是乱码,看不清它的内容是什么? '<!DOCTYPE html>href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>ç\x99¾åº¦ä¸\x80ä¸\x8bï >>> r.encoding #接下来查看一下,它从的HTTP header中猜测的编码是什么? 'ISO-8859-1' >>> r.apparent_encoding #再查一下(备选编码),它从从内容中分析出的编码是什么? 'utf-8' >>> r.encoding = 'utf-8' #用备选编码 替换r.encoding的编码 >>> r.text #此时就能发现,有中文的字符 '<!DOCTYPE html>href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title>
注解: 简单说网络上的资源均有它的编码,如果没有编码,我们将没办法用有效的解析方式使得人类对信息可读。 r.encoding是从HTTP header 中的 charset 字段中获得的,如果HTTP header 中有这样一个字段,说明我们访问的服务器对它资源的编码是有要求的,而这样的编码会获得回来,存在 r.encoding中。但是,并不是所有的服务器对它的资源编码都是有相关要求,所以,如果当HTTP header 中不存在 charset 字段,我们将默认编码设为 ISO-8859-1,但这样的编码并不能解析中文。 继而,Requests库 提供了另外一个 备选编码 r.apparent_encoding,其根据HTTP的内容部分,去分析内容中出现文本可能的编码形式,而不是从HTTP header头部分。原则来说此编码更加准确。
(一)爬取网页的通用代码框架
通用代码框架就是一组代码,它可以准确的可靠的爬取网页上的内容。我们在用Requests库进行网页访问的时候,经常用到 requests.get()函数,但由于网络连接有风险,所以它的异常处理很重要
理解 Response= requests.get(url) 函数,Response的异常处理:
异常 说明 requests.ConnectionError 网络连接错误异常,如DNS查询失败、拒绝连接等 requests.HTTPError HTTP错误异常 requests.URLRequired URL缺失异常 requests.TooManyRedirects 超过最大重定向次数,产生重定向异常 requests.ConnectTimeout 连接远程服务器超时异常 requests.Timeout 请求URL超时,产生超时异常
注解:Response对象返回了所有的网页内容,同时也提供了r.raise_for_status()方法
r.raise_for_status() 此方法是专门与异常打交道,它的内部判断 r.status_code 是否等于200? 如果是200,它将表示返回的内容是正确的。 如果不是200,它将产生一个HTTPError的异常. 例子:通用代码框架 import requests def getHTMLText(url): try: r = requests.get(url,timeout=30) r.raise_for_status() #如果状态不是200,引发HTTPError异常 r.encoding = r.apparent_encoding return r.text except: return'产生异常' if _name_=='_main_': url = 'http://www.baidu.com' print(getHTMLText(url)) 使用此方法,不需要增加额外的if语句,该语句便于利用try‐except进行异常处理。 这样一个通用代码框架可以有效地处理我们在访问或爬取网页过程中,可能出现的一些错误或网络不稳定造成的现象。 通过代码框架实际上它最大的作用,是能够使得用户访问或爬取网页变得更有效、更稳定、更可靠。
(二)HTTP协议 及 Requests库方法
HTTP(Hypertext Transfer Protocol)超文本传输协议。是一个基于“请求与响应”模式的、无状态的应用层协议。
简单说,用户发一些请求,服务器做相关响应,这就是请求与响应的模式。无状态,是指第一次请求与第二次请求之间并没有相关的关联,应用层协议,指该协议工作在TTP协议之上。
HTTP协议采用URL作为定位网络资源的标识,URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。格式如下:
http://host[:port][path] 例如:http://www.bit.edu.cn 或者 http://220.181.111.188/duty
host 合法的Internet主机域名或IP地址
port 端口号,缺省端口为80(可省略)
path 请求资源在主机或IP地址的服务器上,它所包含的内部路径
HTTP协议对资源的操作
方法 说明 GET 请求获取URL位置的资源 HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息 POST 请求向URL位置的资源后附加新的数据 PUT 请求向URL位置存储一个资源,覆盖原URL位置的资源 PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容 DELETE 请求删除URL位置存储的资源
(三)详解Requests 库的7个主要方法
【方法1】requests.request(method,url,**kwargs)
method :请求方式,7种GET / HEAD / POST / PUT / PATCH / delete / OPTIONS
url :拟获取页面的url链接
**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证书路径
【方法2】requests.get(url,params=None,**kwargs)
url :拟获取页面的url链接
params :url中的额外参数,字典或字节流格式,可选
**kwargs:12个控制访问的参数
【方法3】requests.head(url,**kwargs)
url :拟获取页面的url链接
**kwargs:12个控制访问的参数
【方法4】requests.post(url,data = None,json = None,**kwargs)
url :拟更新页面的url链接
data :字典、字节序列或文件,Request的内容
json :JSON格式的数据,Request的内容
**kwargs:12个控制访问的参数
【方法5】requests.put(url,data = None,**kwargs)
url :拟更新页面的url链接
data :字典、字节序列或文件,Request的内容
**kwargs:12个控制访问的参数
【方法6】requests.patch(url,data = None,**kwargs)
url :拟更新页面的url链接
data :字典、字节序列或文件,Request的内容
**kwargs:12个控制访问的参数
【方法7】requests.delete(url,**kwargs)
url :拟删除页面的url链接
**kwargs:12个控制访问的参数