安装
pip install request
引用
import request
支持的python版本(2,3版本都支持)
python2.X 有这些库名可用: urllib, urllib2, urllib3, httplib, httplib2, requests
python3.X 有这些库名可用: urllib, urllib3, httplib2, requests
两者都有的urllib3和requests, 它们不是标准库.
urllib3 提供线程安全连接池和文件post支持,与urllib及urllib2的关系不大.
requests 自称HTTP for Humans, 使用更简洁方便
get请求
参数就url,params,返回的是一个Response类对象(源码太长了,自己用ctrl+b看源码),这个Response类有很多方法,常用的方法有:status_code,text,content,cookies,encoding,
注意:response.text和 response.context的区别
def get(url, params=None, **kwargs):
r"""Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send
in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
kwargs.setdefault('allow_redirects', True)
return request('get', url, params=params, **kwargs)
一个完整的get请求,应该包括请求行(url)和请求头(headers)、请求参数(params)
下面这个例子,没有定义headers , 可以抓包后,把headers参数值带上
import requests
url='https://www.sogo.com?'
para={'query':'tesla'}
'''不验证服务器的ssl证书,运行会警告D:\Python34\lib\site-packages\urllib3\connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning)
'''
r=requests.get(url,params=para, verify=False, allow_redirects=False)
#verify=True验证服务器的SSL证书,运行没有警告
#r=requests.get(url,params=para, verify=True, allow_redirects=False)
print('状态码是',r.status_code)
print('text的结果是',r.text) #返回的结果是in unicode,如果你想取文本,可以通过r.text
print('content的结果是',r.content)#返回的结果是in bytes,如果想取图片,则可以通过r.content
print('cookie的结果是',r.cookies)
print('encoding的结果是',r.encoding)#一般返回的结果是UTF-8
print('raw的结果',r.raw)
print('header的结果',r.headers) #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
POST请求
如果 body={“name1”:”value1”, “name2”,”value2”}
注意:当请求Body为json的时候,json=body 表示自动将python里面的字典,转为json格式参数了
response.json是应答的内容转成json
如果 body="name1=value1&name2=value2",就不用json格式的必备参数json=body,就必须要用data=body
def post(url, data=None, json=None, **kwargs):
r"""Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request('post', url, data=data, json=json, **kwargs)
练习:
找个自己公司内部的网站(最后是测试后台之类的简单的,无验证码的),用脚本实现登录
COOKIE修改成登陆后的(实现多少天免登陆)
COOKIES的修改
实例化一个对象,然后set值,把这个对象update到get请求对应的cookie里
coo = requests.cookies.RequestsCookieJar()
coo.set('cookie-name', 'cookie-value', path='/', domain='.xxx.com')
s.cookies.update(c)
怎么跨请求保持一个cookie
Session对象(会话对象)让你能够跨请求保持某些参数,同一个session的所有请求之间保持cookie.同一个主机发送多个请求,底层的TCP连接被重用,从而带来显著的性能提升。
# coding:utf-8
import requests
# 先打开登录首页,获取部分cookie
url = "https://passport.cnblogs.com/user/signin"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0"
} # get方法加个ser-Agent就可以了
r = requests.get(url, headers=headers,verify=False)
print r.cookies # 添加前的cookies
# 添加登录需要的两个cookie
coo = requests.cookies.RequestsCookieJar()
coo.set('.CNBlogsCookie', 'xxx') # 填上面抓包内容
coo.set('.Cnblogs.AspNetCore.Cookies','xxx') # 填上面抓包内容
r.cookies.update(c)
print r.cookies # 添加后的cookies