requests_requests库 - CSDN
精华内容
参与话题
  • python+requests中文官方教程: http://www.python-requests.org/zh_CN/latest/ Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们...

    python+requests中文官方教程:

    http://www.python-requests.org/zh_CN/latest/

    Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Python3 哦!

    • Beautiful is better than ugly.(美丽优于丑陋)
    • Explicit is better than implicit.(清楚优于含糊)
    • Simple is better than complex.(简单优于复杂)
    • Complex is better than complicated.(复杂优于繁琐)
    • Readability counts.(重要的是可读性)

    一、安装 Requests

    通过pip安装

    pip install requests

    或者,下载代码后安装:

    $ git clone git://github.com/kennethreitz/requests.git
    $ cd requests
    $ python setup.py install

    再懒一点,通过IDE安装吧,如pycharm!

    二、发送请求与传递参数

    先来一个简单的例子吧!让你了解下其威力:

    复制代码
    import requests
     
    r = requests.get(url='http://www.itwhy.org')    # 最基本的GET请求
    print(r.status_code)    # 获取返回状态
    r = requests.get(url='http://dict.baidu.com/s', params={'wd':'python'})   #带参数的GET请求
    print(r.url)
    print(r.text)   #打印解码后的返回数据
    复制代码

    很简单吧!不但GET方法简单,其他方法都是统一的接口样式哦!

    requests.get(‘https://github.com/timeline.json’) #GET请求
    requests.post(“http://httpbin.org/post”) #POST请求
    requests.put(“http://httpbin.org/put”) #PUT请求
    requests.delete(“http://httpbin.org/delete”) #DELETE请求
    requests.head(“http://httpbin.org/get”) #HEAD请求
    requests.options(“http://httpbin.org/get”) #OPTIONS请求

    PS:以上的HTTP方法,对于WEB系统一般只支持 GET 和 POST,有一些还支持 HEAD 方法。
    带参数的请求实例:

    import requests
    requests.get('http://www.dict.baidu.com/s', params={'wd': 'python'})    #GET参数实例
    requests.post('http://www.itwhy.org/wp-comments-post.php', data={'comment': '测试POST'})    #POST参数实例

    POST发送JSON数据:

    import requests
    import json
     
    r = requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some': 'data'}))
    print(r.json())

    定制header:

    复制代码
    import requests
    import json
     
    data = {'some': 'data'}
    headers = {'content-type': 'application/json',
               'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
     
    r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers)
    print(r.text)
    复制代码

    三、Response对象

    使用requests方法后,会返回一个response对象,其存储了服务器响应的内容,如上实例中已经提到的 r.text、r.status_code……
    获取文本方式的响应体实例:当你访问 r.text 之时,会使用其响应的文本编码进行解码,并且你可以修改其编码让 r.text 使用自定义的编码进行解码。

    r = requests.get('http://www.itwhy.org')
    print(r.text, '\n{}\n'.format('*'*79), r.encoding)
    r.encoding = 'GBK'
    print(r.text, '\n{}\n'.format('*'*79), r.encoding)

    其他响应:

    r.status_code #响应状态码
    r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取
    r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
    r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
    r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
    #*特殊方法*#
    r.json() #Requests中内置的JSON解码器
    r.raise_for_status() #失败请求(非200响应)抛出异常

    案例之一:

    复制代码
    import requests
     
    URL = 'http://ip.taobao.com/service/getIpInfo.php'  # 淘宝IP地址库API
    try:
        r = requests.get(URL, params={'ip': '8.8.8.8'}, timeout=1)
        r.raise_for_status()    # 如果响应状态码不是 200,就主动抛出异常
    except requests.RequestException as e:
        print(e)
    else:
        result = r.json()
        print(type(result), result, sep='\n')
    复制代码

    四、上传文件

    使用 Requests 模块,上传文件也是如此简单的,文件的类型会自动进行处理:

    复制代码
    import requests
     
    url = 'http://127.0.0.1:5000/upload'
    files = {'file': open('/home/lyb/sjzl.mpg', 'rb')}
    #files = {'file': ('report.jpg', open('/home/lyb/sjzl.mpg', 'rb'))}     #显式的设置文件名
     
    r = requests.post(url, files=files)
    print(r.text)
    复制代码

    更加方便的是,你可以把字符串当着文件进行上传:

    复制代码
    import requests
     
    url = 'http://127.0.0.1:5000/upload'
    files = {'file': ('test.txt', b'Hello Requests.')}     #必需显式的设置文件名
     
    r = requests.post(url, files=files)
    print(r.text)
    复制代码

    五、身份验证

    基本身份认证(HTTP Basic Auth):

    import requests
    from requests.auth import HTTPBasicAuth
     
    r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=HTTPBasicAuth('user', 'passwd'))
    # r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=('user', 'passwd'))    # 简写
    print(r.json())

    另一种非常流行的HTTP身份认证形式是摘要式身份认证,Requests对它的支持也是开箱即可用的:

    requests.get(URL, auth=HTTPDigestAuth('user', 'pass'))

    六、Cookies与会话对象

    如果某个响应中包含一些Cookie,你可以快速访问它们:

    import requests
     
    r = requests.get('http://www.google.com.hk/')
    print(r.cookies['NID'])
    print(tuple(r.cookies))

    要想发送你的cookies到服务器,可以使用 cookies 参数:

    复制代码
    import requests
     
    url = 'http://httpbin.org/cookies'
    cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'}
    # 在Cookie Version 0中规定空格、方括号、圆括号、等于号、逗号、双引号、斜杠、问号、@,冒号,分号等特殊符号都不能作为Cookie的内容。
    r = requests.get(url, cookies=cookies)
    print(r.json())
    复制代码

    会话对象让你能够跨请求保持某些参数,最方便的是在同一个Session实例发出的所有请求之间保持cookies,且这些都是自动处理的,甚是方便。
    下面就来一个真正的实例,如下是快盘签到脚本:

    复制代码
    import requests
     
    headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
               'Accept-Encoding': 'gzip, deflate, compress',
               'Accept-Language': 'en-us;q=0.5,en;q=0.3',
               'Cache-Control': 'max-age=0',
               'Connection': 'keep-alive',
               'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
     
    s = requests.Session()
    s.headers.update(headers)
    # s.auth = ('superuser', '123')
    s.get('https://www.kuaipan.cn/account_login.htm')
     
    _URL = 'http://www.kuaipan.cn/index.php'
    s.post(_URL, params={'ac':'account', 'op':'login'},
           data={'username':'****@foxmail.com', 'userpwd':'********', 'isajax':'yes'})
    r = s.get(_URL, params={'ac':'zone', 'op':'taskdetail'})
    print(r.json())
    s.get(_URL, params={'ac':'common', 'op':'usersign'})
    复制代码

    七、超时与异常

    timeout 仅对连接过程有效,与响应体的下载无关。

    >>> requests.get('http://github.com', timeout=0.001)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)

    所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException:ConnectionError、HTTPError、Timeout、TooManyRedirects。

    转自:http://www.itwhy.org/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/Python/python-%E7%AC%AC%E4%B8%89%E6%96%B9-http-%E5%BA%93-requests-%E5%AD%A6%E4%B9%A0.html

     

    requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的:

    python的标准库urllib2提供了大部分需要的HTTP功能,但是API太逆天了,一个简单的功能就需要一大堆代码。

    我也看了下requests的文档,确实很简单,适合我这种懒人。下面就是一些简单指南。

    插播个好消息!刚看到requests有了中文翻译版,建议英文不好的看看,内容也比我的博客好多了,具体链接是:http://cn.python-requests.org/en/latest/(不过是v1.1.0版,另抱歉,之前贴错链接了)。

    1. 安装

    安装很简单,我是win系统,就在这里下载了安装包(网页中download the zipball处链接),然后$ python setup.py install就装好了。
    当然,有easy_installpip的朋友可以直接使用:easy_install requests或者pip install requests来安装。
    至于Linux用户,这个页面还有其他安装方法。
    测试:在IDLE中输入import requests,如果没提示错误,那说明已经安装成功了!

    2. 小试牛刀

    >>>import requests
    >>> r = requests.get('http://www.zhidaow.com')  # 发送请求
    >>> r.status_code  # 返回码 
    200
    >>> r.headers['content-type']  # 返回头部信息
    'text/html; charset=utf8'
    >>> r.encoding  # 编码信息
    'utf-8'
    >>> r.text  #内容部分(PS,由于编码问题,建议这里使用r.content)
    u'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"...'
    ...
    

    是不是很简单?比urllib2和urllib简单直观的多?!那请接着看快速指南吧。

    3. 快速指南

    3.1 发送请求

    发送请求很简单的,首先要导入requests模块:

    >>>import requests
    

    接下来让我们获取一个网页,例如我个人博客的首页:

    >>>r = requests.get('http://www.zhidaow.com')
    

    接下来,我们就可以使用这个r的各种方法和函数了。
    另外,HTTP请求还有很多类型,比如POST,PUT,DELETE,HEAD,OPTIONS。也都可以用同样的方式实现:

    >>> r = requests.post("http://httpbin.org/post")
    >>> r = requests.put("http://httpbin.org/put")
    >>> r = requests.delete("http://httpbin.org/delete")
    >>> r = requests.head("http://httpbin.org/get")
    >>> r = requests.options("http://httpbin.org/get")
    

    因为目前我还没用到这些,所以没有深入研究。

    3.2 在URLs中传递参数

    有时候我们需要在URL中传递参数,比如在采集百度搜索结果时,我们wd参数(搜索词)和rn参数(搜素结果数量),你可以手工组成URL,requests也提供了一种看起来很NB的方法:

    >>> payload = {'wd': '张亚楠', 'rn': '100'}
    >>> r = requests.get("http://www.baidu.com/s", params=payload)
    >>> print r.url
    u'http://www.baidu.com/s?rn=100&wd=%E5%BC%A0%E4%BA%9A%E6%A5%A0'
    

    上面wd=的乱码就是“张亚楠”的转码形式。(好像参数按照首字母进行了排序。)

    3.3 获取响应内容

    可以通过r.text来获取网页的内容。

    >>> r = requests.get('https://www.zhidaow.com')
    >>> r.text
    u'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"...'
    

    文档里说,requests会自动将内容转码。大多数unicode字体都会无缝转码。但我在cygwin下使用时老是出现UnicodeEncodeError错误,郁闷。倒是在python的IDLE中完全正常。
    另外,还可以通过r.content来获取页面内容。

    >>> r = requests.get('https://www.zhidaow.com')
    >>> r.content
    b'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"...'
    

    文档中说r.content是以字节的方式去显示,所以在IDLE中以b开头。但我在cygwin中用起来并没有,下载网页正好。所以就替代了urllib2的urllib2.urlopen(url).read()功能。(基本上是我用的最多的一个功能。)

    3.4 获取网页编码

    可以使用r.encoding来获取网页编码。

    >>> r = requests.get('http://www.zhidaow.com')
    >>> r.encoding
    'utf-8'
    

    当你发送请求时,requests会根据HTTP头部来猜测网页编码,当你使用r.text时,requests就会使用这个编码。当然你还可以修改requests的编码形式。

    >>> r = requests.get('http://www.zhidaow.com')
    >>> r.encoding
    'utf-8'
    >>>r.encoding = 'ISO-8859-1'
    

    像上面的例子,对encoding修改后就直接会用修改后的编码去获取网页内容。

    3.5 json

    像urllib和urllib2,如果用到json,就要引入新模块,如jsonsimplejson,但在requests中已经有了内置的函数,r.json()。就拿查询IP的API来说:

    >>>r = requests.get('http://ip.taobao.com/service/getIpInfo.php?ip=122.88.60.28')
    >>>r.json()['data']['country']
    '中国'
    

    3.6 网页状态码

    我们可以用r.status_code来检查网页的状态码。

    >>>r = requests.get('http://www.mengtiankong.com')
    >>>r.status_code
    200
    >>>r = requests.get('http://www.mengtiankong.com/123123/')
    >>>r.status_code
    404
    >>>r = requests.get('http://www.baidu.com/link?url=QeTRFOS7TuUQRppa0wlTJJr6FfIYI1DJprJukx4Qy0XnsDO_s9baoO8u1wvjxgqN')
    >>>r.url
    u'http://www.zhidaow.com/
    >>>r.status_code
    200
    

    前两个例子很正常,能正常打开的返回200,不能正常打开的返回404。但第三个就有点奇怪了,那个是百度搜索结果中的302跳转地址,但状态码显示是200,接下来我用了一招让他原形毕露:

    >>>r.history
    (<Response [302]>,)
    

    这里能看出他是使用了302跳转。也许有人认为这样可以通过判断和正则来获取跳转的状态码了,其实还有个更简单的方法:

    >>>r = requests.get('http://www.baidu.com/link?url=QeTRFOS7TuUQRppa0wlTJJr6FfIYI1DJprJukx4Qy0XnsDO_s9baoO8u1wvjxgqN', allow_redirects = False)
    >>>r.status_code
    302
    

    只要加上一个参数allow_redirects,禁止了跳转,就直接出现跳转的状态码了,好用吧?我也利用这个在最后一掌做了个简单的获取网页状态码的小应用,原理就是这个。

    3.7 响应头内容

    可以通过r.headers来获取响应头内容。

    >>>r = requests.get('http://www.zhidaow.com')
    >>> r.headers
    {
        'content-encoding': 'gzip',
        'transfer-encoding': 'chunked',
        'content-type': 'text/html; charset=utf-8';
        ...
    }
    

    可以看到是以字典的形式返回了全部内容,我们也可以访问部分内容。

    >>> r.headers['Content-Type']
    'text/html; charset=utf-8'
    
    >>> r.headers.get('content-type')
    'text/html; charset=utf-8'
    

    3.8 设置超时时间

    我们可以通过timeout属性设置超时时间,一旦超过这个时间还没获得响应内容,就会提示错误。

    >>> requests.get('http://github.com', timeout=0.001)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
    

    3.9 代理访问

    采集时为避免被封IP,经常会使用代理。requests也有相应的proxies属性。

    import requests
    
    proxies = {
      "http": "http://10.10.1.10:3128",
      "https": "http://10.10.1.10:1080",
    }
    
    requests.get("http://www.zhidaow.com", proxies=proxies)
    

    如果代理需要账户和密码,则需这样:

    proxies = {
        "http": "http://user:pass@10.10.1.10:3128/",
    }
    

    3.10 请求头内容

    请求头内容可以用r.request.headers来获取。

    >>> r.request.headers
    {'Accept-Encoding': 'identity, deflate, compress, gzip',
    'Accept': '*/*', 'User-Agent': 'python-requests/1.2.3 CPython/2.7.3 Windows/XP'}
    

    3.11 自定义请求头部

    伪装请求头部是采集时经常用的,我们可以用这个方法来隐藏:

    r = requests.get('http://www.zhidaow.com')
    print r.request.headers['User-Agent']
    #python-requests/1.2.3 CPython/2.7.3 Windows/XP
    
    headers = {'User-Agent': 'alexkh'}
    r = requests.get('http://www.zhidaow.com', headers = headers)
    print r.request.headers['User-Agent']
    #alexkh
    

    3.12 持久连接keep-alive

    requests的keep-alive是基于urllib3,同一会话内的持久连接完全是自动的。同一会话内的所有请求都会自动使用恰当的连接。

    也就是说,你无需任何设置,requests会自动实现keep-alive。

    4. 简单应用

    4.1 获取网页返回码

    def get_status(url):
        r = requests.get(url, allow_redirects = False)
        return r.status_code
    
    print get_status('http://www.zhidaow.com') 
    #200
    print get_status('http://www.zhidaow.com/hi404/')
    #404
    print get_status('http://mengtiankong.com')
    #301
    print get_status('http://www.baidu.com/link?url=QeTRFOS7TuUQRppa0wlTJJr6FfIYI1DJprJukx4Qy0XnsDO_s9baoO8u1wvjxgqN')
    #302
    print get_status('http://www.huiya56.com/com8.intre.asp?46981.html')
    #500
    

    后记

    1、官方文档
    requests的具体安装过程请看:http://docs.python-requests.org/en/latest/user/install.html#install
    requests的官方指南文档:http://docs.python-requests.org/en/latest/user/quickstart.html
    requests的高级指南文档:http://docs.python-requests.org/en/latest/user/advanced.html#advanced
    2、本文内容部分翻译自官方文档,部分自己归纳。
    3、大多数用的IDLE格式,累死了,下次直接用编辑器格式,这样更符合我的习惯。
    4、还是那句话,有问题留言或email。
    5、图注:requests官方文档上的一只老鳖。

    转载出处:http://www.zhidaow.com/post/python-requests-install-and-brief-introduction

    展开全文
  • python3 requests详解

    万次阅读 多人点赞 2018-07-26 13:37:11
    requests库是一个常用的...一、 requests模块的安装 首先我们要继续requests模块的安装。 1、 pip命令安装 windows系统下只需要在命令行输入命令 pip install requests 即可安装 在 linux 系统下,只需要输入命...

    requests库是一个常用的用于http请求的模块,它使用python语言编写,可以方便的对网页进行爬取,是学习python爬虫的较好的http请求模块。

    一、 requests模块的安装

    首先我们要继续requests模块的安装。

    1、 pip命令安装

    • windows系统下只需要在命令行输入命令 pip install requests 即可安装
    • 在 linux 系统下,只需要输入命令 sudo pip install requests ,即可安装。

    2、下载安装包安装

    由于pip命令可能安装失败所以有时我们要通过下载第三方库文件来进行安装。
    github上的地址为:https://github.com/requests/requests 
    下载文件到本地之后,解压到python安装目录。 
    之后打开解压文件,在此处运行命令行并输入:python setup.py install 即可。
    之后我们测试requests模块是否安装正确,在交互式环境中输入 import requests 如果没有任何报错,说明requests模块我们已经安装成功了

    二、requests模块的使用方法

    1、requests库的七个主要方法

    方法 解释
    requests.request() 构造一个请求,支持以下各种方法
    requests.get() 获取html的主要方法
    requests.head() 获取html头部信息的主要方法
    requests.post() 向html网页提交post请求的方法
    requests.put() 向html网页提交put请求的方法
    requests.patch() 向html提交局部修改的请求
    requests.delete() 向html提交删除请求

    (1)requests.get()

    这个方法是我们平时最常用的方法之一,通过这个方法我们可以了解到其他的方法,所以我们详细介绍这个方法。 
    具体参数是:

    r=requests.get(url,params,**kwargs)
    • url: 需要爬取的网站地址。
    • params: 翻译过来就是参数, url中的额外参数,字典或者字节流格式,可选。
    • **kwargs : 12个控制访问的参数

    我们先来讲讲**kwargs:
    **kwargs有以下的参数,对于requests.get,其第一个参数被提出来了。

    • params:字典或字节序列, 作为参数增加到url中,使用这个参数可以把一些键值对以?key1=value1&key2=value2的模式增加到url中

       

      例如:kv = {'key1':' values', 'key2': 'values'} 
      r = requests.get('http:www.python123.io/ws', params=kw)

    • data:字典,字节序或文件对象,重点作为向服务器提供或提交资源是提交,,作为request的内容,与params不同的是,data提交的数据并不放在url链接里, 而是放在url链接对应位置的地方作为数据来存储。,它也可以接受一个字符串对象。
    • json:json格式的数据, json合适在相关的html,http相关的web开发中非常常见, 也是http最经常使用的数据格式, 他是作为内容部分可以向服务器提交。

       

      例如:kv = {'key1': 'value1'} 
      r = requests.post('http://python123.io/ws', json=kv)

    • headers:字典是http的相关语,对应了向某个url访问时所发起的http的头i字段, 可以用这个字段来定义http的访问的http头,可以用来模拟任何我们想模拟的浏览器来对url发起访问。

       

      例子: hd = {'user-agent': 'Chrome/10'} 
      r = requests.post('http://python123.io/ws', headers=hd)

    • cookies:字典或CookieJar,指的是从http中解析cookie
    • auth:元组,用来支持http认证功能
    • files:字典, 是用来向服务器传输文件时使用的字段。

       

      例子:fs = {'files': open('data.txt', 'rb')} 
      r = requests.post('http://python123.io/ws', files=fs)

    • timeout: 用于设定超时时间, 单位为秒,当发起一个get请求时可以设置一个timeout时间, 如果在timeout时间内请求内容没有返回, 将产生一个timeout的异常。
    • proxies:字典, 用来设置访问代理服务器。
    • allow_redirects: 开关, 表示是否允许对url进行重定向, 默认为True。
    • stream: 开关, 指是否对获取内容进行立即下载, 默认为True。
    • verify:开关, 用于认证SSL证书, 默认为True。
    • cert: 用于设置保存本地SSL证书路径

    其中response对象有以下属性:

    属性 说明
    r.status_code http请求的返回状态,若为200则表示请求成功。
    r.text http响应内容的字符串形式,即返回的页面内容
    r.encoding 从http header 中猜测的相应内容编码方式
    r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
    r.content http响应内容的二进制形式

    举例说明:

    >>> import requests
    >>> r=requests.get("http://www.baidu.com")
    >>> r.status_code
    200
    >>>  r.encoding
    'ISO-8859-1'
    >>> r.apparent_encoding
    'utf-8'
    >>> r.text
    '<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8>ipt> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">æ\x9b´å¤\x9a产å\x93\x81</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a com/ class=cp-feedback>æ\x84\x8fè§\x81å\x8f\x8dé¦\x88</a>&nbsp;京ICPè¯\x81030173å\x8f·&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'
    >>> r.encoding='utf-8'
    >>> r.text
    '<!DOCTYPE html>\r\n<!--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 chref=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css="h读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'

    (以上r.text内容过长,自行删除了部分,看出编码效果即可)

    requests库的异常

    注意requests库有时会产生异常,比如网络连接错误、http错误异常、重定向异常、请求url超时异常等等。所以我们需要判断r.status_codes是否是200,在这里我们怎么样去捕捉异常呢?

    这里我们可以利用r.raise_for_status() 语句去捕捉异常,该语句在方法内部判断r.status_code是否等于200,如果不等于,则抛出异常。

    于是在这里我们有一个爬取网页的通用代码框架:

    try:
        r=requests.get(url,timeout=30)#请求超时时间为30秒
        r.raise_for_status()#如果状态不是200,则引发异常
        r.encoding=r.apparent_encoding #配置编码
        return r.text
    except:
        return "产生异常" 
    

    (2) request.head()

    看代码:

    >>> r=requests.head("http://httpbin.org/get")
    >>>r.headers
     {'Connection': 'keep-alive', 'Server': 'meinheld/0.6.1', 'Date': 'Mon, 20 Nov 2017 08:08:46 GMT', 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true', 'X-Powered-By': 'Flask', 'X-Processed-Time': '0.000658988952637', 'Content-Length': '268', 'Via': '1.1 vegur'}
    

    (3)requests.post()

    1、向url post一个字典:

    >>> payload={"key1":"value1","key2":"value2"}
    >>> r=requests.post("http://httpbin.org/post",data=payload)
    >>> print(r.text)
    {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "key1": "value1", 
        "key2": "value2"
      }, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "close", 
        "Content-Length": "23", 
        "Content-Type": "application/x-www-form-urlencoded", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "json": null, 
      "origin": "218.197.153.150", 
      "url": "http://httpbin.org/post"
    }
    

    2、向url post 一个字符串,自动编码为data

    >>>r=requests.post("http://httpbin.org/post",data='helloworld')
    >>>print(r.text)
    {
      "args": {}, 
      "data": "helloworld", 
      "files": {}, 
      "form": {}, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "close", 
        "Content-Length": "10", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "json": null, 
      "origin": "218.197.153.150", 
      "url": "http://httpbin.org/post"
    }
    

    3.向url post一个文件

    >>> import requests
    >>> files = {'files':open('F:\\python\\test\\test_case\\files.txt','rb')}
    >>> r = requests.post('https://httpbin.org/post',files=files)
    >>> print(r.text)
    {
        "args":{
    
        },
        "data":"",
        "files":{
            "files":"hello worle!"
        },
        "form":{
    
        },
        "headers":{
            "Accept":"*/*",
            "Accept-Encoding":"gzip, deflate",
            "Connection":"close",
            "Content-Length":"158",
            "Content-Type":"multipart/form-data; boundary=d2fb307f28aeb57b932d867f80f2f600",
            "Host":"httpbin.org",
            "User-Agent":"python-requests/2.19.1"
        },
        "json":null,
        "origin":"113.65.2.187",
        "url":"https://httpbin.org/post"
    }
    

    (5)requests.put()

    看代码:

    >>> payload={"key1":"value1","key2":"value2"}
    >>> r=requests.put("http://httpbin.org/put",data=payload)
    >>> print(r.text)
    {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "key1": "value1", 
        "key2": "value2"
      }, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "close", 
        "Content-Length": "23", 
        "Content-Type": "application/x-www-form-urlencoded", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "json": null, 
      "origin": "218.197.153.150", 
      "url": "http://httpbin.org/put"
    

    (6)requests.patch()

    requests.patchrequest.put类似。 
    两者不同的是: 
    当我们用patch时仅需要提交需要修改的字段。 
    而用put时,必须将20个字段一起提交到url,未提交字段将会被删除。 
    patch的好处是:节省网络带宽。

    (7)requests.request()

    requests.request()支持其他所有的方法。 
    requests.request(method,url,**kwargs)

    • method: “GET”、”HEAD”、”POST”、”PUT”、”PATCH”等等
    • url: 请求的网址
    • **kwargs: 控制访问的参数
    展开全文
  • 数据爬虫(三):python中requests库使用方法详解

    万次阅读 多人点赞 2019-07-01 10:49:41
    一、什么是Requests Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库。它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求。 ⼀句话——Python实现的简单易...

    一、什么是Requests

    Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库。它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求。

    ⼀句话——Python实现的简单易⽤的HTTP库

    二、安装Requests库

    进入命令行win+R执行

    命令:pip install requests

    项目导入:import requests

    三、各种请求方式

    直接上代码,不明白可以查看我的urllib的基本使用方法

    import requests
    requests.post('http://httpbin.org/post')
    requests.put('http://httpbin.org/put')
    requests.delete('http://httpbin.org/delete')
    requests.head('http://httpbin.org/get')
    requests.options('http://httpbin.org/get')

    这么多请求方式,都有什么含义,所以问下度娘:

    1. GET: 请求指定的页面信息,并返回实体主体。
    2. HEAD: 只请求页面的首部。
    3. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
    4. PUT: 从客户端向服务器传送的数据取代指定的文档的内容。
    5. DELETE: 请求服务器删除指定的页面。
    6. get 和 post比较常见 GET请求将提交的数据放置在HTTP请求协议头中
    7. POST提交的数据则放在实体数据中

    (1)、基本的GET请求

    import requests
    
    response = requests.get('http://httpbin.org/get')
    print(response.text)

    返回值:

    {
      "args": {}, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "close", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "origin": "183.64.61.29", 
      "url": "http://httpbin.org/get"
    }
    

    (2)、带参数的GET请求

    将name和age传进去

    import requests
    response = requests.get("http://httpbin.org/get?name=germey&age=22")
    print(response.text)
    {
      "args": {
        "age": "22", 
        "name": "germey"
      }, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "close", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "origin": "183.64.61.29", 
      "url": "http://httpbin.org/get?name=germey&age=22"
    }
    

    或者使用params的方法:

    import requests
    
    data = {
     'name': 'germey',
     'age': 22
    }
    response = requests.get("http://httpbin.org/get", params=data)
    print(response.text)

    返回值一样

    (3)、解析json

    将返回值已json的形式展示:

    import requests
    import json
    
    response = requests.get("http://httpbin.org/get")
    print(type(response.text))
    print(response.json())
    print(json.loads(response.text))
    print(type(response.json()))

    返回值:

    <class 'str'>
    {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '183.64.61.29', 'url': 'http://httpbin.org/get'}
    {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '183.64.61.29', 'url': 'http://httpbin.org/get'}
    <class 'dict'>

    (4)、获取二进制数据

    记住返回值.content就ok了

    import requests
    
    response = requests.get("https://github.com/favicon.ico")
    print(type(response.text), type(response.content))
    print(response.text)
    print(response.content)

    返回值为二进制不必再进行展示,

    (5)、添加headers

    有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错,如下

    import requests
    
    response = requests.get("https://www.zhihu.com/explore")
    print(response.text)

    返回值:

    <html><body><h1>500 Server Error</h1>
    An internal server error occured.
    </body></html>

    当传入headers时:

    import requests
    
    headers = {
     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
    }
    response = requests.get("https://www.zhihu.com/explore", headers=headers)
    print(response.text)

    成功返回网页源代码不做展示

    (6)、基本POST请求

    不明白见我博文urllib的使用方法

    import requests
    
    data = {'name': 'germey', 'age': '22'}
    response = requests.post("http://httpbin.org/post", data=data)
    print(response.text)

    返回:

    {
      "args": {}, 
      "data": "", 
      "files": {}, 
      "form": {
        "age": "22", 
        "name": "germey"
      }, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "close", 
        "Content-Length": "18", 
        "Content-Type": "application/x-www-form-urlencoded", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "json": null, 
      "origin": "183.64.61.29", 
      "url": "http://httpbin.org/post"
    }
    

    三、响应

    response属性

    import requests
    
    response = requests.get('http://www.jianshu.com')
    print(type(response.status_code), response.status_code)
    print(type(response.headers), response.headers)
    print(type(response.cookies), response.cookies)
    print(type(response.url), response.url)
    print(type(response.history), response.history)

    return:

    <class 'int'> 200
    <class 'requests.structures.CaseInsensitiveDict'> {'Date': 'Thu, 01 Feb 2018 20:47:08 GMT', 'Server': 'Tengine', 'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'X-Content-Type-Options': 'nosniff', 'ETag': 'W/"9f70e869e7cce214b6e9d90f4ceaa53d"', 'Cache-Control': 'max-age=0, private, must-revalidate', 'Set-Cookie': 'locale=zh-CN; path=/', 'X-Request-Id': '366f4cba-8414-4841-bfe2-792aeb8cf302', 'X-Runtime': '0.008350', 'Content-Encoding': 'gzip', 'X-Via': '1.1 gjf22:8 (Cdn Cache Server V2.0), 1.1 PSzqstdx2ps251:10 (Cdn Cache Server V2.0)', 'Connection': 'keep-alive'}
    <class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie locale=zh-CN for www.jianshu.com/>]>
    <class 'str'> https://www.jianshu.com/
    <class 'list'> [<Response [301]>]

    状态码判断:常见的网页状态码:

    100: ('continue',),
    101: ('switching_protocols',),
    102: ('processing',),
    103: ('checkpoint',),
    122: ('uri_too_long', 'request_uri_too_long'),
    200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'),
    201: ('created',),
    202: ('accepted',),
    203: ('non_authoritative_info', 'non_authoritative_information'),
    204: ('no_content',),
    205: ('reset_content', 'reset'),
    206: ('partial_content', 'partial'),
    207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'),
    208: ('already_reported',),
    226: ('im_used',),
    
    # Redirection.
    300: ('multiple_choices',),
    301: ('moved_permanently', 'moved', '\\o-'),
    302: ('found',),
    303: ('see_other', 'other'),
    304: ('not_modified',),
    305: ('use_proxy',),
    306: ('switch_proxy',),
    307: ('temporary_redirect', 'temporary_moved', 'temporary'),
    308: ('permanent_redirect',
     'resume_incomplete', 'resume',), # These 2 to be removed in 3.0
    
    # Client Error.
    400: ('bad_request', 'bad'),
    401: ('unauthorized',),
    402: ('payment_required', 'payment'),
    403: ('forbidden',),
    404: ('not_found', '-o-'),
    405: ('method_not_allowed', 'not_allowed'),
    406: ('not_acceptable',),
    407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'),
    408: ('request_timeout', 'timeout'),
    409: ('conflict',),
    410: ('gone',),
    411: ('length_required',),
    412: ('precondition_failed', 'precondition'),
    413: ('request_entity_too_large',),
    414: ('request_uri_too_large',),
    415: ('unsupported_media_type', 'unsupported_media', 'media_type'),
    416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'),
    417: ('expectation_failed',),
    418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'),
    421: ('misdirected_request',),
    422: ('unprocessable_entity', 'unprocessable'),
    423: ('locked',),
    424: ('failed_dependency', 'dependency'),
    425: ('unordered_collection', 'unordered'),
    426: ('upgrade_required', 'upgrade'),
    428: ('precondition_required', 'precondition'),
    429: ('too_many_requests', 'too_many'),
    431: ('header_fields_too_large', 'fields_too_large'),
    444: ('no_response', 'none'),
    449: ('retry_with', 'retry'),
    450: ('blocked_by_windows_parental_controls', 'parental_controls'),
    451: ('unavailable_for_legal_reasons', 'legal_reasons'),
    499: ('client_closed_request',),
    
    # Server Error.
    500: ('internal_server_error', 'server_error', '/o\\', '✗'),
    501: ('not_implemented',),
    502: ('bad_gateway',),
    503: ('service_unavailable', 'unavailable'),
    504: ('gateway_timeout',),
    505: ('http_version_not_supported', 'http_version'),
    506: ('variant_also_negotiates',),
    507: ('insufficient_storage',),
    509: ('bandwidth_limit_exceeded', 'bandwidth'),
    510: ('not_extended',),
    511: ('network_authentication_required', 'network_auth', 'network_authentication'),

    四、高级操作

    (1)、文件上传

    使用 Requests 模块,上传文件也是如此简单的,文件的类型会自动进行处理:

    实例:

    import requests
    
    files = {'file': open('cookie.txt', 'rb')}
    response = requests.post("http://httpbin.org/post", files=files)
    print(response.text)

    这是通过测试网站做的一个测试,返回值如下:

    {
      "args": {}, 
      "data": "", 
      "files": {
        "file": "#LWP-Cookies-2.0\r\nSet-Cookie3: BAIDUID=\"D2B4E137DE67E271D87F03A8A15DC459:FG=1\"; path=\"/\"; domain=\".baidu.com\"; path_spec; domain_dot; expires=\"2086-02-13 11:15:12Z\"; version=0\r\nSet-Cookie3: BIDUPSID=D2B4E137DE67E271D87F03A8A15DC459; path=\"/\"; domain=\".baidu.com\"; path_spec; domain_dot; expires=\"2086-02-13 11:15:12Z\"; version=0\r\nSet-Cookie3: H_PS_PSSID=25641_1465_21087_17001_22159; path=\"/\"; domain=\".baidu.com\"; path_spec; domain_dot; discard; version=0\r\nSet-Cookie3: PSTM=1516953672; path=\"/\"; domain=\".baidu.com\"; path_spec; domain_dot; expires=\"2086-02-13 11:15:12Z\"; version=0\r\nSet-Cookie3: BDSVRTM=0; path=\"/\"; domain=\"www.baidu.com\"; path_spec; discard; version=0\r\nSet-Cookie3: BD_HOME=0; path=\"/\"; domain=\"www.baidu.com\"; path_spec; discard; version=0\r\n"
      }, 
      "form": {}, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "close", 
        "Content-Length": "909", 
        "Content-Type": "multipart/form-data; boundary=84835f570cfa44da8f4a062b097cad49", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "json": null, 
      "origin": "183.64.61.29", 
      "url": "http://httpbin.org/post"
    }

    (2)、获取cookie

    当需要cookie时,直接调用response.cookie:(response为请求后的返回值)

    import requests
    
    response = requests.get("https://www.baidu.com")
    print(response.cookies)
    for key, value in response.cookies.items():
     print(key + '=' + value)

    输出结果:

    <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
    BDORZ=27315

    (3)、会话维持、模拟登陆

    如果某个响应中包含一些Cookie,你可以快速访问它们:

    import requests
     
    r = requests.get('http://www.google.com.hk/')
    print(r.cookies['NID'])
    print(tuple(r.cookies))

    要想发送你的cookies到服务器,可以使用 cookies 参数:

    import requests
     
    url = 'http://httpbin.org/cookies'
    cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'}
    # 在Cookie Version 0中规定空格、方括号、圆括号、等于号、逗号、双引号、斜杠、问号、@,冒号,分号等特殊符号都不能作为Cookie的内容。
    r = requests.get(url, cookies=cookies)
    print(r.json())

    (4)、证书验证

    因为12306有一个错误证书,我们那它的网站做测试会出现下面的情况,证书不是官方证书,浏览器会识别出一个错误

    import requests
    
    response = requests.get('https://www.12306.cn')
    print(response.status_code)

    返回值:

    怎么正常进入这样的网站了,代码如下:

    import requests
    from requests.packages import urllib3
    urllib3.disable_warnings()
    response = requests.get('https://www.12306.cn', verify=False)
    print(response.status_code)

    将verify设置位False即可,返回的状态码为200

    urllib3.disable_warnings()这条命令主要用于消除警告信息

    (5)、代理设置

    在进行爬虫爬取时,有时候爬虫会被服务器给屏蔽掉,这时采用的方法主要有降低访问时间,通过代理ip访问,如下:

    import requests
    
    proxies = {
     "http": "http://127.0.0.1:9743",
     "https": "https://127.0.0.1:9743",
    }
    
    response = requests.get("https://www.taobao.com", proxies=proxies)
    print(response.status_code)

    ip可以从网上抓取,或者某宝购买

    如果代理需要设置账户名和密码,只需要将字典更改为如下:
    proxies = {
    "http":"http://user:password@127.0.0.1:9999"
    }
    如果你的代理是通过sokces这种方式则需要pip install "requests[socks]"
    proxies= {
    "http":"socks5://127.0.0.1:9999",
    "https":"sockes5://127.0.0.1:8888"
    }

    (6)、超时设置

    访问有些网站时可能会超时,这时设置好timeout就可以解决这个问题

    import requests
    from requests.exceptions import ReadTimeout
    try:
     response = requests.get("http://httpbin.org/get", timeout = 0.5)
     print(response.status_code)
    except ReadTimeout:
     print('Timeout')

    正常访问,状态吗返回200

    (7)、认证设置

    如果碰到需要认证的网站可以通过requests.auth模块实现

    import requests
    
    from requests.auth import HTTPBasicAuth
    
    response = requests.get("http://120.27.34.24:9001/",auth=HTTPBasicAuth("user","123"))
    print(response.status_code)

    当然这里还有一种方式

    import requests
    
    response = requests.get("http://120.27.34.24:9001/",auth=("user","123"))
    print(response.status_code)

    (8)、异常处理

    遇到网络问题(如:DNS查询失败、拒绝连接等)时,Requests会抛出一个ConnectionError 异常。

    遇到罕见的无效HTTP响应时,Requests则会抛出一个 HTTPError 异常。

    若请求超时,则抛出一个 Timeout 异常。

    若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。

    所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException 。

    weiker原创,转载请附上链接:http://mathlabs.cn

     

     

    展开全文
  • Python-第三方库requests详解

    万次阅读 多人点赞 2018-11-08 16:54:19
    Requests 是用Python语言编写,基于 urllib,采用 Apache2 ...Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Python3 哦! 希望我的博客对您有用。 阿...

    Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Python3 哦!

    希望我的博客对您有用。

    阿里云最高1888通用代金券,送给你!

    • Beautiful is better than ugly.(美丽优于丑陋)
    • Explicit is better than implicit.(清楚优于含糊)
    • Simple is better than complex.(简单优于复杂)
    • Complex is better than complicated.(复杂优于繁琐)
    • Readability counts.(重要的是可读性)

    一、安装 Requests

    通过pip安装

    pip install requests

    或者,下载代码后安装:

    $ git clone git://github.com/kennethreitz/requests.git
    $ cd requests
    $ python setup.py install

    再懒一点,通过IDE安装吧,如pycharm!

    二、发送请求与传递参数

    先来一个简单的例子吧!让你了解下其威力:

    复制代码

    import requests
     
    r = requests.get(url='http://www.itwhy.org')    # 最基本的GET请求
    print(r.status_code)    # 获取返回状态
    r = requests.get(url='http://dict.baidu.com/s', params={'wd':'python'})   #带参数的GET请求
    print(r.url)
    print(r.text)   #打印解码后的返回数据

    复制代码

    很简单吧!不但GET方法简单,其他方法都是统一的接口样式哦!

    requests.get(‘https://github.com/timeline.json’) #GET请求
    requests.post(“http://httpbin.org/post”) #POST请求
    requests.put(“http://httpbin.org/put”) #PUT请求
    requests.delete(“http://httpbin.org/delete”) #DELETE请求
    requests.head(“http://httpbin.org/get”) #HEAD请求
    requests.options(“http://httpbin.org/get”) #OPTIONS请求

    PS:以上的HTTP方法,对于WEB系统一般只支持 GET 和 POST,有一些还支持 HEAD 方法。
    带参数的请求实例:

    import requests
    requests.get('http://www.dict.baidu.com/s', params={'wd': 'python'})    #GET参数实例
    requests.post('http://www.itwhy.org/wp-comments-post.php', data={'comment': '测试POST'})    #POST参数实例

    POST发送JSON数据:

    import requests
    import json
     
    r = requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some': 'data'}))
    print(r.json())

    定制header:

    复制代码

    import requests
    import json
     
    data = {'some': 'data'}
    headers = {'content-type': 'application/json',
               'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
     
    r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers)
    print(r.text)

    复制代码

    三、Response对象

    使用requests方法后,会返回一个response对象,其存储了服务器响应的内容,如上实例中已经提到的 r.text、r.status_code……
    获取文本方式的响应体实例:当你访问 r.text 之时,会使用其响应的文本编码进行解码,并且你可以修改其编码让 r.text 使用自定义的编码进行解码。

    r = requests.get('http://www.itwhy.org')
    print(r.text, '\n{}\n'.format('*'*79), r.encoding)
    r.encoding = 'GBK'
    print(r.text, '\n{}\n'.format('*'*79), r.encoding)

    其他响应:

    r.status_code #响应状态码
    r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取
    r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
    r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
    r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
    #*特殊方法*#
    r.json() #Requests中内置的JSON解码器
    r.raise_for_status() #失败请求(非200响应)抛出异常

    案例之一:

    复制代码

    import requests
     
    URL = 'http://ip.taobao.com/service/getIpInfo.php'  # 淘宝IP地址库API
    try:
        r = requests.get(URL, params={'ip': '8.8.8.8'}, timeout=1)
        r.raise_for_status()    # 如果响应状态码不是 200,就主动抛出异常
    except requests.RequestException as e:
        print(e)
    else:
        result = r.json()
        print(type(result), result, sep='\n')

    复制代码

    四、上传文件

    使用 Requests 模块,上传文件也是如此简单的,文件的类型会自动进行处理:

    复制代码

    import requests
     
    url = 'http://127.0.0.1:5000/upload'
    files = {'file': open('/home/lyb/sjzl.mpg', 'rb')}
    #files = {'file': ('report.jpg', open('/home/lyb/sjzl.mpg', 'rb'))}     #显式的设置文件名
     
    r = requests.post(url, files=files)
    print(r.text)

    复制代码

    更加方便的是,你可以把字符串当着文件进行上传:

    复制代码

    import requests
     
    url = 'http://127.0.0.1:5000/upload'
    files = {'file': ('test.txt', b'Hello Requests.')}     #必需显式的设置文件名
     
    r = requests.post(url, files=files)
    print(r.text)

    复制代码

    五、身份验证

    基本身份认证(HTTP Basic Auth):

    import requests
    from requests.auth import HTTPBasicAuth
     
    r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=HTTPBasicAuth('user', 'passwd'))
    # r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=('user', 'passwd'))    # 简写
    print(r.json())

    另一种非常流行的HTTP身份认证形式是摘要式身份认证,Requests对它的支持也是开箱即可用的:

    requests.get(URL, auth=HTTPDigestAuth('user', 'pass'))

    六、Cookies与会话对象

    如果某个响应中包含一些Cookie,你可以快速访问它们:

    import requests
     
    r = requests.get('http://www.google.com.hk/')
    print(r.cookies['NID'])
    print(tuple(r.cookies))

    要想发送你的cookies到服务器,可以使用 cookies 参数:

    复制代码

    import requests
     
    url = 'http://httpbin.org/cookies'
    cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'}
    # 在Cookie Version 0中规定空格、方括号、圆括号、等于号、逗号、双引号、斜杠、问号、@,冒号,分号等特殊符号都不能作为Cookie的内容。
    r = requests.get(url, cookies=cookies)
    print(r.json())

    复制代码

    会话对象让你能够跨请求保持某些参数,最方便的是在同一个Session实例发出的所有请求之间保持cookies,且这些都是自动处理的,甚是方便。
    下面就来一个真正的实例,如下是快盘签到脚本:

    复制代码

    import requests
     
    headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
               'Accept-Encoding': 'gzip, deflate, compress',
               'Accept-Language': 'en-us;q=0.5,en;q=0.3',
               'Cache-Control': 'max-age=0',
               'Connection': 'keep-alive',
               'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
     
    s = requests.Session()
    s.headers.update(headers)
    # s.auth = ('superuser', '123')
    s.get('https://www.kuaipan.cn/account_login.htm')
     
    _URL = 'http://www.kuaipan.cn/index.php'
    s.post(_URL, params={'ac':'account', 'op':'login'},
           data={'username':'****@foxmail.com', 'userpwd':'********', 'isajax':'yes'})
    r = s.get(_URL, params={'ac':'zone', 'op':'taskdetail'})
    print(r.json())
    s.get(_URL, params={'ac':'common', 'op':'usersign'})

    复制代码

    七、超时与异常

    timeout 仅对连接过程有效,与响应体的下载无关。

    >>> requests.get('http://github.com', timeout=0.001)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)

    所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException:ConnectionError、HTTPError、Timeout、TooManyRedirects。

    转自:http://www.itwhy.org/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/python/python-%E7%AC%AC%E4%B8%89%E6%96%B9-http-%E5%BA%93-requests-%E5%AD%A6%E4%B9%A0.html

     

    requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的:

    python的标准库urllib2提供了大部分需要的HTTP功能,但是API太逆天了,一个简单的功能就需要一大堆代码。

    我也看了下requests的文档,确实很简单,适合我这种懒人。下面就是一些简单指南。

    插播个好消息!刚看到requests有了中文翻译版,建议英文不好的看看,内容也比我的博客好多了,具体链接是:http://cn.python-requests.org/en/latest/(不过是v1.1.0版,另抱歉,之前贴错链接了)。

    1. 安装

    安装很简单,我是win系统,就在这里下载了安装包(网页中download the zipball处链接),然后$ python setup.py install就装好了。
    当然,有easy_installpip的朋友可以直接使用:easy_install requests或者pip install requests来安装。
    至于linux用户,这个页面还有其他安装方法。
    测试:在IDLE中输入import requests,如果没提示错误,那说明已经安装成功了!

    2. 小试牛刀

    >>>import requests
    >>> r = requests.get('http://www.zhidaow.com')  # 发送请求
    >>> r.status_code  # 返回码 
    200
    >>> r.headers['content-type']  # 返回头部信息
    'text/html; charset=utf8'
    >>> r.encoding  # 编码信息
    'utf-8'
    >>> r.text  #内容部分(PS,由于编码问题,建议这里使用r.content)
    u'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"...'
    ...
    

    是不是很简单?比urllib2和urllib简单直观的多?!那请接着看快速指南吧。

    3. 快速指南

    3.1 发送请求

    发送请求很简单的,首先要导入requests模块:

    >>>import requests
    

    接下来让我们获取一个网页,例如我个人博客的首页:

    >>>r = requests.get('http://www.zhidaow.com')
    

    接下来,我们就可以使用这个r的各种方法和函数了。
    另外,HTTP请求还有很多类型,比如POST,PUT,DELETE,HEAD,OPTIONS。也都可以用同样的方式实现:

    >>> r = requests.post("http://httpbin.org/post")
    >>> r = requests.put("http://httpbin.org/put")
    >>> r = requests.delete("http://httpbin.org/delete")
    >>> r = requests.head("http://httpbin.org/get")
    >>> r = requests.options("http://httpbin.org/get")
    

    因为目前我还没用到这些,所以没有深入研究。

    3.2 在URLs中传递参数

    有时候我们需要在URL中传递参数,比如在采集百度搜索结果时,我们wd参数(搜索词)和rn参数(搜素结果数量),你可以手工组成URL,requests也提供了一种看起来很NB的方法:

    >>> payload = {'wd': '张亚楠', 'rn': '100'}
    >>> r = requests.get("http://www.baidu.com/s", params=payload)
    >>> print r.url
    u'http://www.baidu.com/s?rn=100&wd=%E5%BC%A0%E4%BA%9A%E6%A5%A0'
    

    上面wd=的乱码就是“张亚楠”的转码形式。(好像参数按照首字母进行了排序。)

    3.3 获取响应内容

    可以通过r.text来获取网页的内容。

    >>> r = requests.get('https://www.zhidaow.com')
    >>> r.text
    u'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"...'
    

    文档里说,requests会自动将内容转码。大多数unicode字体都会无缝转码。但我在cygwin下使用时老是出现UnicodeEncodeError错误,郁闷。倒是在python的IDLE中完全正常。
    另外,还可以通过r.content来获取页面内容。

    >>> r = requests.get('https://www.zhidaow.com')
    >>> r.content
    b'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"...'
    

    文档中说r.content是以字节的方式去显示,所以在IDLE中以b开头。但我在cygwin中用起来并没有,下载网页正好。所以就替代了urllib2的urllib2.urlopen(url).read()功能。(基本上是我用的最多的一个功能。)

    3.4 获取网页编码

    可以使用r.encoding来获取网页编码。

    >>> r = requests.get('http://www.zhidaow.com')
    >>> r.encoding
    'utf-8'
    

    当你发送请求时,requests会根据HTTP头部来猜测网页编码,当你使用r.text时,requests就会使用这个编码。当然你还可以修改requests的编码形式。

    >>> r = requests.get('http://www.zhidaow.com')
    >>> r.encoding
    'utf-8'
    >>>r.encoding = 'ISO-8859-1'
    

    像上面的例子,对encoding修改后就直接会用修改后的编码去获取网页内容。

    3.5 json

    像urllib和urllib2,如果用到json,就要引入新模块,如jsonsimplejson,但在requests中已经有了内置的函数,r.json()。就拿查询IP的API来说:

    >>>r = requests.get('http://ip.taobao.com/service/getIpInfo.php?ip=122.88.60.28')
    >>>r.json()['data']['country']
    '中国'
    

    3.6 网页状态码

    我们可以用r.status_code来检查网页的状态码。

    >>>r = requests.get('http://www.mengtiankong.com')
    >>>r.status_code
    200
    >>>r = requests.get('http://www.mengtiankong.com/123123/')
    >>>r.status_code
    404
    >>>r = requests.get('http://www.baidu.com/link?url=QeTRFOS7TuUQRppa0wlTJJr6FfIYI1DJprJukx4Qy0XnsDO_s9baoO8u1wvjxgqN')
    >>>r.url
    u'http://www.zhidaow.com/
    >>>r.status_code
    200
    

    前两个例子很正常,能正常打开的返回200,不能正常打开的返回404。但第三个就有点奇怪了,那个是百度搜索结果中的302跳转地址,但状态码显示是200,接下来我用了一招让他原形毕露:

    >>>r.history
    (<Response [302]>,)
    

    这里能看出他是使用了302跳转。也许有人认为这样可以通过判断和正则来获取跳转的状态码了,其实还有个更简单的方法:

    >>>r = requests.get('http://www.baidu.com/link?url=QeTRFOS7TuUQRppa0wlTJJr6FfIYI1DJprJukx4Qy0XnsDO_s9baoO8u1wvjxgqN', allow_redirects = False)
    >>>r.status_code
    302
    

    只要加上一个参数allow_redirects,禁止了跳转,就直接出现跳转的状态码了,好用吧?我也利用这个在最后一掌做了个简单的获取网页状态码的小应用,原理就是这个。

    3.7 响应头内容

    可以通过r.headers来获取响应头内容。

    >>>r = requests.get('http://www.zhidaow.com')
    >>> r.headers
    {
        'content-encoding': 'gzip',
        'transfer-encoding': 'chunked',
        'content-type': 'text/html; charset=utf-8';
        ...
    }
    

    可以看到是以字典的形式返回了全部内容,我们也可以访问部分内容。

    >>> r.headers['Content-Type']
    'text/html; charset=utf-8'
    
    >>> r.headers.get('content-type')
    'text/html; charset=utf-8'
    

    3.8 设置超时时间

    我们可以通过timeout属性设置超时时间,一旦超过这个时间还没获得响应内容,就会提示错误。

    >>> requests.get('http://github.com', timeout=0.001)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
    

    3.9 代理访问

    采集时为避免被封IP,经常会使用代理。requests也有相应的proxies属性。

    import requests
    
    proxies = {
      "http": "http://10.10.1.10:3128",
      "https": "http://10.10.1.10:1080",
    }
    
    requests.get("http://www.zhidaow.com", proxies=proxies)
    

    如果代理需要账户和密码,则需这样:

    proxies = {
        "http": "http://user:pass@10.10.1.10:3128/",
    }
    

    3.10 请求头内容

    请求头内容可以用r.request.headers来获取。

    >>> r.request.headers
    {'Accept-Encoding': 'identity, deflate, compress, gzip',
    'Accept': '*/*', 'User-Agent': 'python-requests/1.2.3 CPython/2.7.3 Windows/XP'}
    

    3.11 自定义请求头部

    伪装请求头部是采集时经常用的,我们可以用这个方法来隐藏:

    r = requests.get('http://www.zhidaow.com')
    print r.request.headers['User-Agent']
    #python-requests/1.2.3 CPython/2.7.3 Windows/XP
    
    headers = {'User-Agent': 'alexkh'}
    r = requests.get('http://www.zhidaow.com', headers = headers)
    print r.request.headers['User-Agent']
    #alexkh
    

    3.12 持久连接keep-alive

    requests的keep-alive是基于urllib3,同一会话内的持久连接完全是自动的。同一会话内的所有请求都会自动使用恰当的连接。

    也就是说,你无需任何设置,requests会自动实现keep-alive。

    4. 简单应用

    4.1 获取网页返回码

    def get_status(url):
        r = requests.get(url, allow_redirects = False)
        return r.status_code
    
    print get_status('http://www.zhidaow.com') 
    #200
    print get_status('http://www.zhidaow.com/hi404/')
    #404
    print get_status('http://mengtiankong.com')
    #301
    print get_status('http://www.baidu.com/link?url=QeTRFOS7TuUQRppa0wlTJJr6FfIYI1DJprJukx4Qy0XnsDO_s9baoO8u1wvjxgqN')
    #302
    print get_status('http://www.huiya56.com/com8.intre.asp?46981.html')
    #500
    

    后记

    1、官方文档
    requests的具体安装过程请看:http://docs.python-requests.org/en/latest/user/install.html#install
    requests的官方指南文档:http://docs.python-requests.org/en/latest/user/quickstart.html
    requests的高级指南文档:http://docs.python-requests.org/en/latest/user/advanced.html#advanced
    2、本文内容部分翻译自官方文档,部分自己归纳。
    3、大多数用的IDLE格式,累死了,下次直接用编辑器格式,这样更符合我的习惯。
    4、还是那句话,有问题留言或email。
    5、图注:requests官方文档上的一只老鳖。

    转载出处:http://www.zhidaow.com/post/python-requests-install-and-brief-introduction

    如果我的博客对您有用,请您务必扫码,您得红包,我也能得红包!谢谢!

    希望我的博客对您有用。

    阿里云最高1888通用代金券,送给你!

    展开全文
  • 本课程是一个Python爬虫实战课程,课程主要使用Requests+BeautifulSoup实现爬虫,课程包括五个部分: 第一部分:CSS选择器,主要讲解类选择器,ID选择器,标签选择器,伪类和伪元素,以及组合选择器等...
  • 测试本地接口 127.0.0.1:8899/api/strategies?token=776ed74c99cefe962e8efa59a30ee79a182876ef,发现报错: 但可以在浏览器中打开… 原因是没有加 协议 … 浏览器是自动加协议的 … 应该去请求: ...
  • 学习过程中遇到的坑

    2020-06-21 14:59:40
    学习过程中遇到的坑 1.输入的url中带有中文字符或在url前多加了空格报错:requests.exceptions.InvalidSchema: No connection adapters were found for ‘“https://www.baidu.com/”’ ...
  • 问题:requests.exceptions.InvalidSchema: No connection adapters 原因:在url后面加了一个逗号,导致连接不了
  • No connection adapters were found for ‘%s’" % url) url = 'XXX.XXX.XXXXX/api' payload = { 'A': '1124', 'B': '11213', 'C': '1214', 'text': t...
  • 版权说明:未经许可,不得转载 ...“requests.exceptions.InvalidSchema: No connection adapters were found for...” 报错代码如下: r = requests.get(' http://blog.sina.com.cn/weekdawn...
  • [331]python之requests的基本使用

    千次阅读 2020-05-23 18:46:31
    简介 Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,...pip快速安装pip install requests 二、使用 &amp;nbsp; 1、先上一串代码 import requests response ...
  • Requests.request()方法分享【一】

    千次阅读 2020-09-30 14:56:18
    request() 源码、get请求使用request()
  • 最近在学习python爬虫的相关知识 但是时常发现requests.get(url)后 输出中文是乱码 <title>iP��ַ��ѯ--�ֻ������ѯ������ | ���������ѯ | iP��ַ�����ز�ѯ | ����...
  • python下载安装requests

    万次阅读 2019-01-31 18:01:07
    爬虫需要用到requests模块,需要安装 pip install requests
  • requests和scrapy框架比较

    万次阅读 2018-05-17 22:52:57
    相同点:对比:小的项目,或者深度定制建议使用requests大的项目,并发量大的建议使用scrapy
  • Py之requests:python的requests包的简介、安装、使用方法详细攻略 目录 requests包的简介 requests包的安装 requests包的使用方法 requests包的简介 requests是为人类构建的Python的一个优雅而...
  • 关于解决Python中requests模块在PyCharm工具中导入问题

    万次阅读 多人点赞 2018-05-28 14:39:37
    问题引入:今天在学习Python网络请求的时候,导入requests模块时一直报红色波浪线,如图:反复折腾,一直以为自己没有安装requests模块,反复安装反复卸载:安装方法:首先 cd 进入C:\Python27\Scripts 执行 pip ...
  • 在调试代码的时候,出现“ImportError: No module named ‘requests’ ”错误信息。从提示信息可以看出,出现这个错误,是因为没有导入requests模块。 下面介绍两种安装requests模块的方式。 1.通过命令行工具...
  • 关于python中requests模块导入问题

    万次阅读 多人点赞 2017-08-14 17:09:05
    今天使用Pycharm来抓取网页图片时候,要导入requests模块,但是在pycharm中import requests 时候报错。 原因: python中还没有安装requests库 解决办法: 1.先找到自己python安装目录下的pip 2.在自己的电脑里...
  • Python——安装requests第三方库

    万次阅读 多人点赞 2016-11-16 21:15:02
    一、介绍 requests是Python的一个HTTP客户端库,跟urllib,urllib2类似,不过requests的优势在于使用简单,相同一个功能,用requests实现起来代码量要少很多。...所以,使用requests方便的多。 二、下
1 2 3 4 5 ... 20
收藏数 320,768
精华内容 128,307
关键字:

requests