1、Requests库的安装
http://www.python_requests.org
- 以管理员身份运行 cmd,执行 pip install requests
- 如果数据源不对,就直接运行
pip install requests -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
2、Requsets库的七个主要方法
requests.request() #构造一个请求,支撑以下各方法的基础方法
requests.get() #获取HTML网页的主要方法,对应HTTP的GET
requests.head() #获取网页头信息的方法,对应HTTP的HEAD
requests.post() #向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put() #向HTML网页提交PUT请求的方法,对应HTTP的PUT
requests.patch() #向HTML页面提交局部修改请求,对应HTTP的PATCH
requests.delete() #向HTML页面提交删除请求,对应于HTTP的DELETE
>>>r = requests.head('http://httpbin.org/get')
>>>r.headers
{'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin':
'*', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json', 'Date':
'Tue, 09 Apr 2019 06:32:59 GMT', 'Server': 'nginx', 'Connection': 'keep-alive'}
>>>payload = {'key1':'value1','key2':'value2'}
>>>r=requests.post('http://httpbin.org/get',data=payload)
>>>print(r.text) #向URL POST一个字典,自动编码为form(表单)
{ ...
“form”:{
"key1":"value1",
"key2":"value2"
},
}
>>>r=requests.post('http://httpbin.org/get',data='ABC')
>>>print(r.text) #向URL POST一个字典,自动编码为data
{ ...
"data":"ABC"
“form”:{},
}
>>>payload = {'key1':'value1','key2':'value2'}
>>>r=requests.put('http://httpbin.org/get',data=payload)
>>>print(r.text)
{ ...
“form”:{
"key1":"value1",
"key2":"value2"
},
}
requests.requests(method,url,**kwargs)
- method : 请求方式,对应get/put/post等7种
- url : 拟获取页面的url链接
- **kwargs:控制访问的参数,共13个
method:请求方式
r.requests.request('GET',url,**kwargs)
r.requests.request('HEAD',url,**kwargs)
r.requests.request('POST',url,**kwargs)
r.requests.request('PUT',url,**kwargs)
r.requests.request('PATCH',url,**kwargs)
r.requests.request('delete',url,**kwargs)
r.requests.request('OPTIONS',url,**kwargs)
**kwargs:控制访问的参数,均为可选项
params:字典或字节序列,作为参数增加到url中
>>> kv = {'key1':'value1','key2':'value2'}
>>> r = requests.request('GET','http://www.baidu.com',params=kv)
>>>print(r.url)
http://www.baidu.com/?key1=value1&key2=value2
data:字典、字节序列或 文件对象,作为Request的内容
>>> kv = {'key1':'value1','key2':'value2'}
>>> r = requests.request('POST','http://www.baidu.com',data=kv)
>>> body = '主体内容'
>>> r = requests.request('POST','http://www.baidu.com',data=body)
json:JSON格式的数据,作为Request的内容
>>> kv = {'key1','value1'}
>>> r = requests.request('POST','http://www.baidu.com',json=kv)
headers:字典,HTTP定制头
cookies:字典或CookieJar,Request中的cookie
auth:元组,支持HTTP认证功能
>>>hr = {'user-agent':'Chrome/10'}
>>>r = requests.request('POST','http://www.baidu.com',headers=hd)
files:字典类型,传输文件
>>>fs = {'file':open('data.xls','rb')}
>>> r.requests.request('POST','www.baidu.com',files=fs)
timeout:设定超时时间,秒为单位
>>> r.requests.request('GET','www.baidu.com',timeout=10)
proxies:字典类型,设定访问代理服务器,可以增加登录认证
>>>pxs = {'http','http://pass@10.10.10.1:1234'
'https':'https://10.10.1:4321'}
>>>r.requests.request('GET','www.baidu.com',proxies=pxs)
allow_readirects:True/False,默认为True,重定向开关
stream:True/False,默认为True,获取内容立即下载开关
verity:True/False,默认为True,认证SSL证书开关
cert : 本地SSL证书路径
requests.get(url,params=None,**kwargs)
- url:拟获取页面的url链接
- params:url中的额外参数,字典或字节流格式,可选
- **kwargs:12个控制访问的参数
requests.head(url,**kwargs)
- url:拟获取页面的url链接
- **kwargs:12个控制访问的参数
requests.post(url,data=None,json=None,**kwargs)
- url:拟获取页面的url链接
- data:字典、字节序列或文件,Request的内容
- json:JSON格式的数据,Request的内容
- **kwargs:12个控制访问的参数
requests.put(url,data=None,**kwargs)
- url:拟获取页面的url链接
- data:字典、字节序列或文件,Request的内容
- **kwargs:12个控制访问的参数
requests.patch(url,data=None,**kwargs)
- url:拟获取页面的url链接
- data:字典、字节序列或文件,Request的内容
- **kwargs:12个控制访问的参数
requests.delete(url,**kwargs)
- url:拟获取页面的url链接
- **kwargs:12个控制访问的参数
3、Requests库的get()方法
- r = requests.get(url)
- 通过使用get方法并且给定url,构造一个向服务器请求资源的Request对象
- 返回一个包含服务器资源的Response对象
requests.get(url,params=None,**Kwargs)
- url:拟获取页面的url链接
- params:url中的额外参数,字典或字节流格式,可选
- **Kwargs:12个控制访问的参数
4、Response对象
Response对象包含爬虫返回的内容,Response对象包含服务器返回的所有信息,也包含请求的Request信息。
>>>import requests
>>>r = requests.get("http://www.baidu.com")
>>>print(r.status_code)
200
>>>type(r)
<class 'requests.models,Response'>
>>>r.headers
{'Cache-Control':'private,no-cache,no-store,proxy-revalidate,ection':'Keep-Alice','Transfer-Encoding':'chunked','Server':
Response对象的属性
r.status_code #HTTP请求的返回状态,200表示连接成功,其他的数值表示连接失败
r.text #HTTP相应内容的字符串形式,即,url对应的页面内容
r.encoding #从HTTP header中猜测的响应内容编码方式
r.apparent_encoding #从内容中分析出的响应内容编码方式(备选编码方式)
r.content #HTTP响应内容的二进制形式
>>>r.requests.get("http://www.baidu.com")
>>>r.status_code
200
>>>r.text
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type
content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta
content=always name=referrer><link rel=stylesheet type=text/css
href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css>
<title>ç™¾åº¦ä¸€ä¸‹ï¼Œä½ å°±çŸ¥é“</title></head> <body link=#0000cc>
>>>r.encoding
'ISO-8859-1'
>>>r.apparent_encoding
'utf-8'
>>>r.encoding = "uft-8"
>>>r.text
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type
content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta
content=always name=referrer><link rel=stylesheet type=text/css
href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css>
<title>百度一下,你就知道</title></head> <body link=#0000cc>
5、理解Response的编码
r.encoding #从HTTP hrader中猜测的响应内容编码方式
r.apparent_encoding #从内容中分析的响应内容编码方式(备选编码方式)
r.encoding #如果header中不存在charset,则认为编码为ISO-8859-1
r.text根据r.encoding显示网页内容
r.apparent_encoding #根据网页内容分析出的编码方式
可以看作是r.encoding的备选
6、Requests库的异常
- r=requests.get(url)
- Exception (网络连接有风险,异常处理很重要)
requests.ConnectionError #网络连接错误异常,如DNS查询失败,拒绝连接等
requests.HTTPError #HTTP异常错误
requests.URLRequired #URL缺失异常
requests.TooManyRedirects #超过最大定向次数,产生重定向异常
requests.ConnectTimeout #连接远程服务器超时异常
requests.Timeout #请求URL超时,产生超时异常
r.raise_for_status() #如果不是200,产生异常 requests.HTTPError
r.raise_for_status() 在方法内部判断r.status_code是否等于200,不需要增加额外的if语句,该语句便于利用 try-except 进行异常处理
try:
r=requests.get(url,timeout=30)
r.raise_for_status() #如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
7、HTTP协议
HTTP:Hypertext Transfer Protocol ,超文本传输协议
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议
HTTP协议采用URL作为定位网络资源的标识,URL格式如下:
http : // host [ :port ] [ path ]
- host:合法的Internet主机域名或IP地址
- port:端口号,缺省端口为80
- path:请求资源的路径
HTTP URL实例:
HTTP URL的理解:
- URL 是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源
GET <==>requests.get() #请求获取URL位置的资源
HEAD <==>requests.head() #请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST <==>requests.post() #请求向URL位置的资源后附加新的数据
PUT <==>requests.put() #请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH <==>requests.patch() #请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE <==>requests.delete() #请求删除URL位置存储的资源
理解PATCH和PUT的区别
假设URL位置有一组数据UserInfo,包括UserID,UserName等20个字段
需求:用户修改了UserName,其他不变
- 采用PATCH,仅向URL提交UserName的局部更新请求
- 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除
PATCH的最主要好处:节省网络带宽