requests

作者: 其徐如林 | 来源:发表于2018-09-01 22:57 被阅读0次
    1. get()方法
    import requests
    
    r = requests.get('https://www.baidu.com/')
    # <class 'requests.models.Response'>
    print(type(r))
    # 状态码
    print(r.status_code)
    # 返回的是str
    print(type(r.text))
    # 响应的文本内容
    print(r.text)
    # cookies的类型是RequestsCookieJar
    print(r.cookies)
    

    其他的请求,也是一句话

    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')
    
    

    在请求中添加参数:

    import requests
    
    data = {
        'name': 'germey',
        'age': 22
    }
    r = requests.get("http://httpbin.org/get", params=data)
    # 网页的返回类型是JOSN格式的
    print(r.text)
    

    请求的链接自动被构造成了:http://httpbin.org/get?age=22&name=germey

    解析返回结果得到一个Json格式

    import requests
    
    r = requests.get("http://httpbin.org/get")
    print(type(r.text))
    # 将返回结果是 Json 格式的字符串转化为字典
    print(r.json())
    print(type(r.json()))
    

    抓取网页

    import requests
    import re
    
    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'
    }
    # 加入headers模拟浏览器访问
    r = requests.get("https://www.zhihu.com/explore", headers=headers)
    pattern = re.compile('explore-feed.*?question_link.*?>(.*?)</a>', re.S)
    titles = re.findall(pattern, r.text)
    print(titles)
    

    如果抓取的是图片信息,需要用二进制解析:

    import requests
    
    r = requests.get("https://github.com/favicon.ico")
    # 直接这样输出会将图片转为字符串,会乱码
    print(r.text)
    # 输出二进制
    print(r.content)
    

    POST请求

    模拟表单提交一样,将一些数据提交到某个链接。

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

    Response

    import requests
    
    # status_code属性得到状态码
    r = requests.get('http://www.jianshu.com')
    print(type(r.status_code), r.status_code)
    #  headers属性得到Response Headers
    print(type(r.headers), r.headers)
    # cookies属性得到cookies
    print(type(r.cookies), r.cookies)
    # url属性得到URL
    print(type(r.url), r.url)
    # history 属性得到请求历史
    print(type(r.history), r.history)
    

    高级用法

    文件上传

    import requests
    
    files = {'file': open('favicon.ico', 'rb')}
    r = requests.post('http://httpbin.org/post', files=files)
    print(r.text)
    

    运行的结果:

    {
      "args": {}, 
      "data": "", 
      "files": {
        "file": "data:application/octet-stream;base64,AAAAAA...="
      }, 
      "form": {}, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Content-Length": "6665", 
        "Content-Type": "multipart/form-data; boundary=809f80b1a2974132b133ade1a8e8e058", 
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.10.0"
      }, 
      "json": null, 
      "origin": "60.207.237.16", 
      "url": "http://httpbin.org/post"
    }
    

    文件上传部分会单独有一个 files 字段来标识。

    Cookies

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

    我们也可以直接用 Cookies 来维持登录状态,首先登录知乎,将 Headers 中的 Cookies 复制下来

    import requests
    
     headers = {
            'cookies': 'tgw_l7_route=29b95235203ffc15742abb84032d7e75; _zap=1970b363-1921-4cc4-aed7-f3c2c4f5a47a; _xsrf=vxZRLb8Gh0BIQremmczNFeLx4hVz1EFK; d_c0="AIDmBvPeGw6PTpItKeK0AL02HnealibyVJI=|1535168552"; capsion_ticket="2|1:0|10:1535168561|14:capsion_ticket|44:ZGFmZWY4NDVlMTdlNGM1NjhlY2U0ZGExZTQ3ZDEwMTQ=|fc82cf9a1b3f9acfecf335b554a3fd580b8bf2519c04e5542235aca37b63f3a7"; z_c0="2|1:0|10:1535168583|4:z_c0|92:Mi4xcVI5cEJRQUFBQUFBa0tiNDh0NGJEaWNBQUFDRUFsVk5SMTJvV3dBSU9mcGtyUy1qSEZBM042a1JuV1pLUU9HTXdR|356ac6d95010fd75b9c1117217e393035e2a22756cd019aec55cbd46b136ef42"; q_c1=ec67944e57474b51843c2a907b124fc1|1535168583000|1535168583000',
            'Host': 'www.zhihu.com',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
        }
        r = requests.get('https://www.zhihu.com', headers=headers)
        print(r.text)
    

    通过 cookies 参数来设置,不过这样就需要构造 RequestsCookieJar 对象,而且需要分割一下 Cookies ,相对繁琐,不过效果是相同的,实例如下:

    import requests
    
    cookies = 'tgw_l7_route=29b95235203ffc15742abb84032d7e75; _zap=1970b363-1921-4cc4-aed7-f3c2c4f5a47a; _xsrf=vxZRLb8Gh0BIQremmczNFeLx4hVz1EFK; d_c0="AIDmBvPeGw6PTpItKeK0AL02HnealibyVJI=|1535168552"; capsion_ticket="2|1:0|10:1535168561|14:capsion_ticket|44:ZGFmZWY4NDVlMTdlNGM1NjhlY2U0ZGExZTQ3ZDEwMTQ=|fc82cf9a1b3f9acfecf335b554a3fd580b8bf2519c04e5542235aca37b63f3a7"; z_c0="2|1:0|10:1535168583|4:z_c0|92:Mi4xcVI5cEJRQUFBQUFBa0tiNDh0NGJEaWNBQUFDRUFsVk5SMTJvV3dBSU9mcGtyUy1qSEZBM042a1JuV1pLUU9HTXdR|356ac6d95010fd75b9c1117217e393035e2a22756cd019aec55cbd46b136ef42"; q_c1=ec67944e57474b51843c2a907b124fc1|1535168583000|1535168583000'
        jar = requests.cookies.RequestsCookieJar()
        headers = {
            'Host': 'www.zhihu.com',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0;WOW 64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
        }
        # ,然后将复制下来的 Cookies 利用 split() 方法分割
        for cookie in cookies.split(';'):
            key, value = cookie.split('=', 1)
            # 设置好每一个 Cookie 的 key 和 value
            jar.set(key, value)
    
        r = requests.get('http://www.zhihu.com', cookies=jar, headers = headers)
        print(r.text)
    

    会话维持

    利用 Session 我们可以做到模拟同一个会话,而且不用担心 Cookies 的问题

    import requests
    
    s = requests.Session()
    s.get('http://httpbin.org/cookies/set/number/123456789')
    r = s.get('http://httpbin.org/cookies')
    print(r.text)
    

    代理设置

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

    代理需要使用 HTTP Basic Auth

    import requests
    
    proxies = {
        'https': 'http://user:password@10.10.1.10:3128/',
    }
    requests.get('https://www.taobao.com', proxies=proxies)
    

    使用 SOCKS 协议代理,使用类似 http://user:password@host:port 这样的语法来设置代理。

    import requests
    
    proxies = {
        'http': 'socks5://user:password@host:port',
        'https': 'socks5://user:password@host:port'
    }
    requests.get('https://www.taobao.com', proxies=proxies)
    

    超时设置

    请求分为两个阶段,即 connect(连接)和 read(读取)。

    # 设置 timeout 值将会用作 connect 和 read 二者的 timeout 总和
    r = requests.get('https://www.taobao.com', timeout=1)
    # 分别指定
    r = requests.get('https://www.taobao.com', timeout=(5, 11))
    

    身份认证

    遇到必须要认证的网站验证,可以使用 Requests 自带的身份认证功能。

    import requests
    from requests.auth import HTTPBasicAuth
    # 传HTTPBasicAuth类
    r = requests.get('http://localhost:5000', auth=HTTPBasicAuth('username', 'password'))
    # 直接传一个元组,它会默认使用 HTTPBasicAuth 这个类来认证
    r = requests.get('http://localhost:5000', auth=('username', 'password'))
    print(r.status_code)
    

    使用 OAuth1 认证的方法:

    import requests
    from requests_oauthlib import OAuth1
    
    url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
    auth = OAuth1('YOUR_APP_KEY', 'YOUR_APP_SECRET',
                  'USER_OAUTH_TOKEN', 'USER_OAUTH_TOKEN_SECRET')
    requests.get(url, auth=auth)
    

    Prepared Request

    Request 的各个参数都可以通过一个 Request 对象来表示

    from requests import Request, Session
    
    url = 'http://httpbin.org/post'
    data = {
        'name': 'germey'
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
    }
    s = Session()
    req = Request('POST', url, data=data, headers=headers)
    prepped = s.prepare_request(req)
    r = s.send(prepped)
    print(r.text)
    

    有了 Request 这个对象,我们就可以将一个个请求当做一个独立的对象来看待,这样在进行队列调度的时候会非常方便,后面我们会有一节使用它来构造一个 Request 队列。

    相关文章

      网友评论

          本文标题:requests

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