美文网首页
Python笔记 - Requests

Python笔记 - Requests

作者: Jansid | 来源:发表于2017-11-24 16:22 被阅读14次

    Requests是一个用Python语言编写的基于urllib3的网络请求库,它比urllib3使用更加方便,在做网络请求中,时常使用到它。

    安装

    输入下方的语句就可以进行自动安装了

    pip3 install requests
    

    GET请求

    请求页面
    response = requests.get('http://www.baidu.com')
    print(response.status_code)
    print(response.text)
    

    只需要上面两调语句,就可以获取到百度搜索的页面信息并打印出来了。
    response是一个Response类型的对象,其中包含了所有的请求结果
    response.status_code为请求状态码,显示200则表示请求成功。
    response.text为请求结果的文本信息。

    文件下载

    requests也可以用来下载,并且操作起来也很简单,只需要4行代码就可以下载一张图片了。

    response = requests.get('https://github.com/favicon.ico')
    with open('favicon.ico', 'wb') as f:
        f.write(response.content)  # 二进制文件
        f.close()
    

    response.content 表示结果的二进制数据,可用来下载图片、音频、视频等文件。

    POST请求

    文件上传

    requests也可用来上传文件,这里可以使用一个测试网站来进行测试。

    files = {'file': open('favicon.ico', 'rb')}  # 将文件读取为二进制数据
    response = requests.post('http://httpbin.org/post', files=files)
    print(response.text)
    

    上传成功后网站会返回一个json格式的字符串,从中可以看出图片经过了转码后才进行上传。

    获取Cookie

    在做爬虫时,经常会碰到需要登入的情况,而cookie就可以用来模拟登录,一般的登入信息都会存放在cookie中。

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

    这样我们就可以获取访问百度时的cookie。一般使用浏览器打开某个网站并登陆后,我们可以使用浏览器带的审查工具获取登录后的cookie,并且可以利用这个cookie来进行模拟用户登录。

    模拟登录

    使用含有登录信息的cookie来进行网站的模拟登录,可以使用测试网站来进行测试。

    s = requests.Session()
    # 先设置一个cookie信息,模拟已登录的账号
    s.get('http://httpbin.org/cookies/set/number/123456')
    response = s.get('http://httpbin.org/cookies')
    print(response.text)
    

    执行代码,可以看到返回的信息为:

    {
      "cookies": {
        "number": "123456"
      }
    }
    

    从结果我们可以看出目前登录的信息。

    证书验证

    https协议的网址在访问时浏览器都会验证证书,如果证书异常浏览器会进行提示,典型的网站就是12306购票网了。

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

    执行上方代码时,会抛出requests.exceptions.SSLError异常,提示证书验证失败。但是我们知道12306这个网站是正规的,所以通常在使用浏览器访问12306时都会点击继续访问,而requests可以选择关闭证书认证。改写上方代码:

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

    这个时候,再次执行代码,可以看到状态码是正常返回了200,但是还有一个警告信息 InsecureRequestWarning 提示https访问没有验证证书,强烈建议添加证书验证。这个警告也是可以关闭的,因为requests是基于urllib3这个库的,所以需要引入一下这个库,然后在进行https链接请求前加上 urllib3.disable_warnings() 即可。再次执行上面的代码,会发现这次只会打印200请求码了。
    requests在请求https网址时,不仅可以关闭证书验证,还可以自己指定一个证书:

    response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))
    print(response.status_code)
    

    代理设置

    某些网站有反爬取措施,当我们在某个时间段访问量过多的时候会进行封IP处理,这个时候就需要用代理来完成请求了。

    proxies = {
        # 协议: 代理地址:端口号
        'http': 'http://127.0.0.1:9743',
        'https': 'https://127.0.0.1:9743',
        # 需要账户密码的代理只需将信息填写在地址前方即可
        'http': 'http://user:password@127.0.0.1:9743'
    }
    response = requests.get('http://httpbin.org', proxies=proxies)
    print(response.status_code)
    

    认证设置

    有一些网站在登录时需要进行认证,requests也可以进行此操作,并且有两种方式。

    # 1. 导入HTTPBasicAuth类
    response = requests.get('http://httpbin.org', auth=HTTPBasicAuth('user', '123'))
    # 2. 不导入类
    response = requests.get('http://httpbin.org', auth=('user', '123'))
    print(response.status_code
    

    异常处理

    在网络请求中会存在各种问题,接下来看看requests库的异常处理

    try:
        response = requests.get('http://httpbin.org/get', timeout=0.2)
        print(response.status_code)
    except ReadTimeout:  # 连接超时异常
        print('Timeout')
    except HTTPError:  # http链接异常
        print('Http error')
    except ConnectionError:  # 连接异常(dns域名解析失败,请求拒绝等)
        print('Connection Error')
    except RequestException:  # 请求异常
        print('Error')
    

    RequestException是其他异常的父类

    相关文章

      网友评论

          本文标题:Python笔记 - Requests

          本文链接:https://www.haomeiwen.com/subject/ucwtbxtx.html