**
request 库的 get 方法。
**
r = requests.get(url)
requests.get(url,params=None,**kwargs)
#url: 拟获取页面的url链接。
#params:url中的额外参数,字典或字节流格式,可选。(字节流格式是啥?)
#**kwargs:12个控制访问的参数。
request 提供七种常用方法。但最基本的只有 request 方法,其他六种方法都是其中着一种方法的“简化版”。
Response:
1.什么是Response?
服务器收到浏览器发送的信息后,能够根据浏览器发送信息的内容,做出相应的处理,然后把消息回传给浏览器,这个过程就叫做HTTP Response。
2.Response中包含什么?
2.1 响应状态:有多种响应状态,比如200代表成功,301 跳转页面,404 表示找不到页面,502 表示服务器错误;
2.2 响应头(Response Headers):比如内容类型,内容长度,服务器信息,设置Cookie等;
2.3 响应体:响应体最主要的部分,包含了请求资源的内容,比如网页 HTML 代码,图片二进制数据等。
sponse对象的属性
属性 | 表格 |
---|---|
r.status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
r.text | url对应的页面内容 |
r.encoding | 从HTTP的header中猜测的相应内容编码方式 |
r.apparent_encoding | 从内容中分析出的相应内容编码方式(好像比encoding更牛逼点,那encoding有啥用嘞?直接全都apparent_encoding好了啊) |
r.content | HTTP响应内容的二进制形式 |
操作基本步骤(通用框架)
requests库的异常
异常 | 说明 |
---|---|
ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 |
HTTPError | HTTP协议层面出现的错误异常 |
URLRequired | URL缺失异常 |
TooManyRedirects | 超过最大重定向次数,产生重定向异常(访问的数量过多) |
ConnectTimeout | 连接远程服务器超时异常(仅指与远程服务器连接的超时异常) |
Timeout | 请求URL超时,产生超时异常(发出URL请求,到收到,整个过程超时异常) |
通用代码框架
#需要用到r.rayse_for_status() : 如果状态不是200,引发HTTPError异常。
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"产生异常"
HTTP协议级requests库方法
Requests库的七个主要方法
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支撑以下各方法的基础方法(就是上面说的下面的全是这个的分支,它是爸爸) |
requests.get | 获取HTML网页的主要方法,对应于HTTP的GET |
requests.head() | 获取HTML网页头信息 |
requests.post() | 向HTML网页提交POST请求 |
requests.put() | 向HTML网页提交PUT请求 |
requests.patch() | 向HTML网页提交局部修改请求 |
requests.delete() | 向HTML页面提交删除请求 |
HTTP协议:超文本传输协议
URL格式: http://host[:port][path]
host:合法的Internet主机域名或IP地址。
port:端口号,默认80。
path:请求资源的路径。
URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。
HTTP协议对资源的操作方法共六种,分别对应requests库除了request的七种方法。即,
方法 | 说明 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求URL位置资源的响应消息报告,即获取该资源的头部信息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除URL位置存贮的资源 |
get、head:获得资源信息。
put、post、patch:改变url信息。
delete:删除url信息。
>>> r = requests.head('http://www.baidu.com')
>>> r.headers
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Sat, 09 May 2020 07:47:53 GMT', 'Last-Modified': 'Mon, 13 Jun 2016 02:50:36 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18'}
>>> r.text
'' #内容为空。
#用较少流量获得信息。获得资源的概要信息。(不懂这句话啥意思,大概就是”准确获取信息”吧。。。)
>>> payload = {'key1':'value1','key2':'value2'}
>>> r = requests.post('http://httpbin.org/post',data = payload)
>>> r.text
'{(前面一堆)"form": {\n "key1": "value1", \n "key2": "value2"\n }, (后面一堆)'反正就是有上面这块字典类型的东西在里面。
#当我们向URL post一个字典或键值对时,会自动放入form(表单)字段下。
#若提交的时字符串,则该字符串会被存放到data字段下。
Requests库主要方法解析
前面提到了requests库的七种方法下面进行逐一解析。
request方法(基础方法):
requests.request(method,url,**kwargs)
method:请求方式,对应get/put/post等7种方式。 一共有:‘GET’ ‘HEAD’ ‘POST’ ’ PUT’ ‘PATCH’ ‘delete’ ‘OPTIONS’ (options是获得参数,平时使用较少)可以用request直接实现,或者用request.get 啥的实现
**kwargs:控制访问的参数,13个。都是可选项。
- params:字典或字节序列,作为参数增加到url中
将键值对加入url,可以根据这些参数筛选内容。
kv = {'key1':'value1','key2':'value2'}
r = requests.request('GET','http://python123.io/ws',params = kv)
print(r.url)
# 结果为:https://python123.io/ws?key1=value1&key2=value2
- data:字典、字节序列或文件对象,作为Request的内容。
提交的键值对并不放在url里,而是放在url对应位置的地方作为数据存储。(不是很懂这句话的意思,应该是说作为内容存储,而不是名字)
kv = {'key1':'value1','key2':'value2'}
r = requests.request('POST','http://python123.io/ws',data = kv)
body = '主题内容'
r = requests.request('POST','http://python123.io/ws',data = body)
#第一次学习运行的时候报错了。。。可能学到后期会慢慢明白。。。。。
- json:JSON格式的数据,作为Request的内容
最经常使用的数据格式,作为内容部分向服务器提交。
kv = {'key1':'value1'}
r = requests.request('POST','http://Python123.io/ws',json = kv)
- headers: 字典,HTTP定制头。利用这个字段来定制访问某个url的协议头。访问时headers向服务器访问的时候就是模拟Chrome10向url进行访问。
hd = {'user-agent':'Chrome/10'}
r = requests.request('POST','http://python123.io/ws',headers = hd
- cookies:字典或CookieJar,Request中的cookie
- auth:元组,支持HTTP认证功能 (5 和 6都比较高级)
- file :字典类型,向服务器传输文件时的字段。
fs = {'file':'open('data.xls','rb')}
r = requests.request('POST','http://python123.io/ws',files = fs)
- timeout: 设定超时时间,秒为单位。若在timeout范围内请求没有返回,则会产生一个timeout的异常。
r = requests.request('GET','http://www.baidu.com',timeout = 10)
- proxies: 字典类型设定访问代理服务器,可以增加登录认证
有效隐藏对爬虫的逆追踪。
pxs = {'http':'http://user:pass@10.10.10:1234','http':'https://10.10.10.1:4321'}
r = requests.request('GET','http://www.baidu.com', proxies = pxs)
- allow_redirects: True/False,默认为True,重定向开关
- stream:True/False,默认为True,获取内容立即下载开关
- verify: True/False,默认为True,认证SSL证书开关
- cert:本地SSL证书路径
感觉以上的kwargs啥的都比较复杂,现在先了解一下在以后的学习中再慢慢体会。。。
get方法:
request.get(url,params = None,**kwargs)
get方法对应的就是request方法中第一个参数设定为’GET’的方法。
params 对应的就是request库中kwargs中第一个参数。只不过这里它自动封装好了,而get中的kwargs对应的参数就只有12个(少了params)
其他方法也和get方法类似,与request方法中method一一对应。
requests.head(url,**kwargs)
requests.post(url,data = None,json = None,**kwargs)
request.put(url,data = None,**kwargs)
request.patch(url,data = None,**kwargs)
request.delete(url,**kwargs)
因为涉及到这些方法(get,head…)常常会用到固定的参数(比如get里的params)所以就把这些参数和对应的方法自动封装好。