Python 轻松处理HTTP——Requests库

第三方库Requests 擅长处理那些复杂的HTTP请求,cookie, header等内容,并且支持 Python 2.6—2.7以及3.3—3.7

提供了比python2中urllib,urllib2和python3中urllib.request,urllib.repsonse等模块更加简洁方便的API


安装Requests库

$ pip install requests


发送请求

Reponse响应对象

Request请求对象

发送数据和提交表单

文件上传

        流式上传

        上传多个文件

Cookie

超时处理

代理

SSL证书验证

客户端证书

流式响应体

CookieJar

会话Session


发送请求

>>> r = requests.get("http://www.baidu.com")    

        构建一个requests.Request对象,收到响应后返回requests.Response对象

        传递的关键字参数可以查看Request对象的构建方法参数


requests.get(url,params=None,**kwargs)

            params参数    接受字符串字典提供给URL作为查询字符串(query string)

>>> dic= {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=dic)
>>> r.url    #查看url
'http://httpbin.org/get?key2=value2&key1=value1'

                    字典里值为None的键都不会被添加到 URL 的查询字符串里。

                    可以将一个列表作为值传入

>>> dic= {'key1': 'value1', 'key2': ['value2', 'value3']}
>>> r = requests.get('http://httpbin.org/get', params=dic)
>>> r.url
'http://httpbin.org/get?key1=value1&key2=value2&key2=value3'


其他类型的请求方法

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

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

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

        requests.head(url,**kwargs)

        requests.delete(url,**kwargs)


requests.Reponse对象

            r.url              查看Reponse对象的URL

            r.request      返回响应的请求Request对象

            r.text            读取服务器响应的内容,自动解码来自服务器的内容,

            r.encoding      查看响应使用的编码,同时可以覆盖该属性来改变编码方式

                                    返回的编码方式为requests根据响应头部推测,不要过度依赖此机制,有时gbk编码会被使用ISO-8859-1编码来处理

            r.content      以字节方式读取请求响应体,可用于下载图片视频等,可以自动解码gzip和deflate传输编码的响应数据

            r.json()          使用requests内置的JSON解码器解码

                                    如果解码失败会抛出异常,有时即使唱功调用r.json()也并不意味着响应成功

                                    有的服务器会在失败的响应中包含一个 JSON 对象(比如 HTTP 500 的错误细节)。

                                      这种 JSON 会被解码返回。

                                                要检查请求是否成功,请使用 r.raise_for_status()或者检查r.status_code 是否和你的期望相同。

            r.raw                获取来自服务器的原始套接字,请求方法应确保设置stream=True

            r.headers        以字典的形式返回服务器响应头使用任意大小写来传递给索引或get()方法访问响应头字段

            r.cookies          返回RequestsCookieJar对象,允许以字典方式访问响应中包含的cookie

            r.history           该属性是一个Response对象的列表,可用来追踪重定向,对象的顺序时按照最老到最近的请求排序

            r.status_code                返回响应状态码

            r.ok                                如果响应状态吗小于400则返回True

            r.raise_for_status()        针对响应码抛出相应异常


requests.Request对象

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

            method    为请求方法http,https等等

            url             为URL地址

            params      该参数作为查询字符串,字典或者字节流

            headers      作为请求头的字典,所有的header值必须时string, bytestring unicode

            allow_redirects    布尔值,True表示禁用重定向处理,False表示禁用重定向处理

                                                HEAD请求方法默认不使用重定向

            auth             接受元组或者HTTPBasicAuth类用于身份验证


发送数据和提交表单     data参数

提交表单时应注意处理表单的URL,也就是表单字段的action属性,应该将URL设置为该action的地址,该地址可能为绝对地址或相对地址,进行相应的转换

            data            接受字典或包含元组的列表,字节流或文件对象作为请求体

                                    传递字典给data参数,自带你会自动编码为表单形式

                                    元组列表可以在表单多个元素使用同一个key时使用,

                                    还可以JSON编码的数据作为参数传递

>>> payload = (('key1', 'value1'), ('key1', 'value2')) 
>>> r = requests.post('http://httpbin.org/post', data=payload)
>>> payload = {'some': 'data'}
>>> r = requests.post(url, data=json.dumps(payload)

                                    其他类型会直接作为数据发送出去


            json            接受字典,并自动编码为JSON数据作为请求体

           

文件上传    files参数

                files    接受一个字典用于上传文件

>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}

>>> r = requests.post(url, files=files)

                    可以显示地设置文件名,文件类型和请求头

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

>>> r = requests.post(url, files=files)

                    也可以发送作为文件接受的字符串

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}

>>> r = requests.post(url, files=files)

                    要求使用二进制模式打开文件,因为Request可能会试图提供Content-length字段,这个值会被设为文件的字节数,如果用文本模式打开可能会出错


        流式上传,可以发送大的数据流或文件,仅需为请求体data参数提供一个文件对象即可,而无需先把他们读入内存

with open('massive-body') as f:
    requests.post('http://some.url/streamed', data=f)

        上传多个文件,需要把文件放到一个元组的列表中

#
#上传多个图像文件到表单
>>> url = 'http://httpbin.org/post'
>>> multiple_files = [
        ('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
        ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
>>> r = requests.post(url, files=multiple_files)

Cookie    cookies参数

        大多数网站都是用cookie来跟踪用户是否登陆,一旦登陆,就会将服务器生成的令牌,登陆有效期限和状态跟踪信息等信息保存在cookie中,网站会把cookie用作信息验证,当浏览网站中每个页面时都会发送给服务器

         但是对于网站比较复杂,会更改调整cookie,或者不想要在代码中cookie时,可以使用会话Session对象来持续跟踪会话信息

            cookies        接受字典或CookieJar对象

>>> jar = requests.cookies.RequestsCookieJar()
>>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
>>> jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
>>> r = requests.get('http://httpbin.org/cookies', cookies=jar)

超时    timeout参数

            为了防止服务器不能及时响应,大部分发到外部服务器的请求端都应该带timeout参数  

             如果没有显示指定timeout值,Requests一般不会进行超时处理,代码可能会阻塞若干分钟甚至更长时间

             超时可分为连接超时,和读取超时

                    连接超时指客户端实现到远程机器端口的连接(connect())时的超时时间

                    读取超时指客户端连接到服务器,并发送http请求后,等待服务器发送响应的时间  

                timeout        该参数设置多少秒后停止等待响应

                                        只针对连接过程有效,与下载响应体的时间无关

                                        可以传递一个元组,分别指定connect和read的timeout

r = requests.get('https://github.com', timeout=5)
r = requests.get('https://github.com', timeout=(3.05, 27))    
r = requests.get('https://github.com', timeout=None)        #设为None为永远等待

代理    proxies参数

                proxies          接受一个字典参数来为任意请求方法配置单个请求

                                也可以通过环境变量HTTP_PROXY和HTTPS_PROXY来配置代理

proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}

requests.get("http://example.org", proxies=proxies)

                                字典键为请求方法,代理 URL 必须包含连接方式


                                如果代理需要使用HTTP Basic Auth,可以使用http://user:pasword@host语法

proxies = {
    "http": "http://user:[email protected]:3128/",
}

                                要为某个特定的连接方式或者主机设置代理,使用 scheme://hostname 作为 key,它会针对指定的主机和连接方式进行匹配。

proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}


SSL证书验证    verify参数

            verify            该参数用于为HTTPS验证SSL证书,传入CA_BUNDLE文件的路径名,或者可信任CA证书文件的文件加路径

                                    如果verify设为文件夹路径,文件加必须通过OpenSSL提供的c_rehash工具处理

                                    设为False则表示忽略对SSL证书的验证,默认为True

                                    如果认证失败会引发SSLError

                    verify仅用于主机证书,私有证书,需要传递CA_BUNDLE文件,也可以设置REQUEST_CA_BUNDLE环境变量


客户端证书    cert参数

                cert              指定一个本地证书用于客户端证书,可以时单个文件(包含密钥和证书),或者一个包含两个文件路径的元组

                                        如果指定了错误路径或无效证书会引发SSLError

                                        本地证书的私有key必须时解密状态,目前不支持加密的key


流式响应体    stream参数

                stream        默认情况下,当进行网络请求后,响应体会立即被下载,stream参数可以推迟下载响应体,直到访问Response.content属性

tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
r = requests.get(tarball_url, stream=True)

                                    此时只有响应头被下载,连接保持打开状态,允许我们为响应头设置条件来获取内容

if int(r.headers['content-length']) < TOO_LONG:
  content = r.content
  ...

CookieJar 

            requests.utils.add_dict_to_cookiejar(cookiejar, cookie_dict)

                将cookie_dict字典中数据添加到类型为CookieJar的cookiejar参数中并返回


            request.utils.cookiejar_from_dict(cookie_dict, cookiejar=None,overwrite=True)

                将cookie_dict字典中的数据插入到cookiejar对象中,如果overwrite为False将不更改cookiejar参数对象,而是返回一个新对象


    request.cookies.RequestsCookieJar(policy=None) 构造一个RequestsCookieJar对象

            RequestsCookieJar对象可以按照字典方式操作,并有一些其他的方法

             cj.get(name, default=None)

            cj.get_dict()            返回字典形式

            cj.set(name,value)        

            cj.update()

            cj.clear_session_cookies()    清除会话cookie


会话Session

        会话对象可以为请求保持某些参数,他也会在同一个Session实例发出的所有请求之间保持COOKIE

        如果向同一主机发送多个请求,底层TCP连接将会被重用


        requests.Session会话对象拥有主要的Requests API的所有方法

>>> s = requests.Session()
>>> s.get('http://httpbin.org/get')
使用上下文管理器,这样就可以确保with代码块退出后即使发生一出场会话也能被关闭
>>> with requests.Session() as s:
>>>     s.get('http://httpbin.org/get')

       

会话可以为请求方法提供缺省数据,任何传递给请求方法的字典都会与设置会话层数据合并,并且方法层的参数可以覆盖会话层的数据

        不过就算使用了会话,方法层的参数不会被跨域请求保持

s = requests.Session()
#只会和第一个请求发送方法传递的cookie
r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'

r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {}}'

        如果手动为会话添加cookie,则使用Cookie utility函数来操作Session.cookies


      

你可能感兴趣的:(Python,Python爬虫)