requests上传文件Cookies设置

发布时间:2019-05-02 18:20:20编辑:Run阅读(4913)

    有的网站需要上传文件,requests也是可以实现的

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

    返回信息:

    image.pngimage.png

    里面包含files字段,而form字段为空,上传文件会单独有一个files字段来标识



    Cookies

    requests获取和设置Cookies只需要一步完成

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

    返回信息:

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

    key BDORZ

    value 27315


    当前,也可以直接用Cookie来维持登陆状态,以知乎为例,首先手动登陆知乎,将headers中的Cookie内容复制下来,如下

    image.png


    替换成自己的Cookie,将其设置到Headers里面,然后发送请求,代码如下:

    import requests
    from lxml import etree
    
    headers = {
        'Cookie': '_zap=f4035a0b-8bfb-48a5-aa70-b7d8f4869ba1; d_c0="ANCiqSDGFQ-PTtCXuKtT4JGPAeK9D1cRg6o=|1551939261"; _xsrf=2pscD3eR3N0O9jzliq2mz10TV2GgjiS1; l_n_c=1; q_c1=595a8a7635b94542b6b1c2c38ebbbf47|1556768730000|1551953498000; n_c=1; __utmc=51854390; l_cap_id="NmM5ZTFkNmQ0ZThkNGI0NDhiYmVmNjk2N2NlYTI0MjY=|1556779328|650703f96dd8d8a37edaad8d5e0881387e4b741b"; r_cap_id="YzdmODU3NDgyZmExNGRiYjlmY2Q4ZTRkZTU1OGM0ZTk=|1556779328|d53af2805f0470f6094cd6f89d77e5e951613f52"; cap_id="YmE4ZWUxNWQzYTUzNGRiOGIxMWRmZTdkZjgzOTIxY2Q=|1556779328|ee07cf5f16741ec8adf2260f5ee5b4721eee368d"; tgw_l7_route=060f637cd101836814f6c53316f73463; capsion_ticket="2|1:0|10:1556784084|14:capsion_ticket|44:OWQ1NWFhZWFkYjE3NDEyYmI1OTk5MjhmMDllZTQ5Y2M=|1e096bca37010e87064d5f808f1e751d91360682533003571a4831f394762b52"; z_c0="2|1:0|10:1556784104|4:z_c0|92:Mi4xZUtBQUJnQUFBQUFBMEtLcElNWVZEeVlBQUFCZ0FsVk42UEczWFFEZ3lsNlhuMWVSaE5ya3VyUkJwcFltWEVRNmJn|3cd3acf0dc8fd2d29d2d49bb0e1be9336228f3acefe04ffc0285def38ff993b3"; __utma=51854390.1875686252.1556768732.1556779331.1556784108.3; __utmb=51854390.0.10.1556784108; __utmz=51854390.1556784108.3.2.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/signin; __utmv=51854390.100--|2=registration_date=20170921=1^3=entry_date=20170921=1',
        'Host': 'www.zhihu.com',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    
    r = requests.get('https://www.zhihu.com', headers=headers).content.decode('utf-8')
    # 使用xptah解析html页面,获取登陆后的文章标题
    content = etree.HTML(r)
    tag_list = content.xpath("//a[@data-za-detail-view-element_name='Title']/text()")
    print(tag_list)

    返回信息:

    ['有哪些好用不火的软件?', '你见过最渣的渣女有多渣?', '三十岁左右的你,现在收入多少?', '如果好莱坞来拍《流浪地球》应该如何?', '你们看到过最丧的句子是什么?', '亲姐弟之间要不要避嫌?']



    当前也可以通过cookies参数来设置,需要构造RequestsCookieJar对象,需要分割一下cookies,相对麻烦,不过效果是相同的,代码如下:

    import requests
    from lxml import etree
    
    cookies = '_zap=f4035a0b-8bfb-48a5-aa70-b7d8f4869ba1; d_c0="ANCiqSDGFQ-PTtCXuKtT4JGPAeK9D1cRg6o=|1551939261"; _xsrf=2pscD3eR3N0O9jzliq2mz10TV2GgjiS1; l_n_c=1; q_c1=595a8a7635b94542b6b1c2c38ebbbf47|1556768730000|1551953498000; n_c=1; __utmc=51854390; l_cap_id="NmM5ZTFkNmQ0ZThkNGI0NDhiYmVmNjk2N2NlYTI0MjY=|1556779328|650703f96dd8d8a37edaad8d5e0881387e4b741b"; r_cap_id="YzdmODU3NDgyZmExNGRiYjlmY2Q4ZTRkZTU1OGM0ZTk=|1556779328|d53af2805f0470f6094cd6f89d77e5e951613f52"; cap_id="YmE4ZWUxNWQzYTUzNGRiOGIxMWRmZTdkZjgzOTIxY2Q=|1556779328|ee07cf5f16741ec8adf2260f5ee5b4721eee368d"; tgw_l7_route=060f637cd101836814f6c53316f73463; capsion_ticket="2|1:0|10:1556784084|14:capsion_ticket|44:OWQ1NWFhZWFkYjE3NDEyYmI1OTk5MjhmMDllZTQ5Y2M=|1e096bca37010e87064d5f808f1e751d91360682533003571a4831f394762b52"; z_c0="2|1:0|10:1556784104|4:z_c0|92:Mi4xZUtBQUJnQUFBQUFBMEtLcElNWVZEeVlBQUFCZ0FsVk42UEczWFFEZ3lsNlhuMWVSaE5ya3VyUkJwcFltWEVRNmJn|3cd3acf0dc8fd2d29d2d49bb0e1be9336228f3acefe04ffc0285def38ff993b3"; __utma=51854390.1875686252.1556768732.1556779331.1556784108.3; __utmb=51854390.0.10.1556784108; __utmz=51854390.1556784108.3.2.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/signin; __utmv=51854390.100--|2=registration_date=20170921=1^3=entry_date=20170921=1'
    jar = requests.cookies.RequestsCookieJar()
    headers = {'Host': 'www.zhihu.com',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
               }
    for cookie in cookies.split(';'):
        key, value = cookie.split('=', 1)
        jar.set(key, value)
    
    r = requests.get('https://www.zhihu.com', cookies=jar, headers=headers).content.decode('utf-8')
    # 使用xptah解析html页面,获取登陆后的文章标题
    content = etree.HTML(r)
    tag_list = content.xpath("//a[@data-za-detail-view-element_name='Title']/text()")
    print(tag_list)

    返回信息:

    ['你认为真正的好电影是什么样的?', '一个程序员的水平能差到什么程度?', '有什么是你面试很多次都失败后才知道的?', '一个人健身前和健身后有什么区别?', '香港警察真的像TVB演的那样吗?', '炫富真的很爽吗?']


    测试后,同样是可以登录知乎的。



    会话维持

    在requests中,如果直接利用get()或post()等方法的确可以做到模拟网页请求,但这实际上是相当于不同的会话,其实相当于你用了两个浏览器打开了不同的页面。

    设想一个场景,第一个请求利用post()方法登录了网站,第二次想获取成功登陆后的个人信息,又用了一次get()方法请求个人信息页面,这就相当于打开了两个浏览器,是完全两个不同的会话,肯定不能获取个人信息的。

    解决这个问题的方法就是维持同一个会话,也就是相当于打开一个新的浏览器选项卡,而不是打开一个新的浏览器,需要用到新的利器Session对象。

    利用它,可以方便的维护同一个会话,而不用担心cookies的问题

    错误示例如下

    import requests
    
    r1 = requests.get('http://httpbin.org/cookies/set/username/root')
    print(r1.text)
    r2 = requests.get('http://httpbin.org/cookies')
    print(r2.text)

    返回信息:

    image.png

    从显示的结果来看,很明显是两次请求


    Session的使用,正确的示例:

    import requests
    
    s = requests.Session()
    r1 = s.get('http://httpbin.org/cookies/set/username/root')
    print(r1.text)
    r2 = s.get('http://httpbin.org/cookies')
    print(r2.text)

    返回信息:

    image.png

    利用Session可以做到模拟同一个会话而不用担心cookies的问题,通常用于模拟登陆成功之后再进行下一步的操作。

关键字

上一篇: requests基本用法

下一篇: requests--证书验证