zoukankan      html  css  js  c++  java
  • 人性化的Requests模块(响应与编码、header处理、cookie处理、重定向与历史记录、代理设置)

    Requests库是第三方模块,需要额外进行安装。Requests是一个开源库

    • pip install requests
    • 去GitHub下载回来,进入解压文件,运行setup.py

    比urllib2实现方式的代码量少,下面是POST请求:

    import requests
    postdata= {'key':'value'}
    r = requests.post('http://www.cnblogs.com/login',data=postdata)
    print(r.content)
    
    • 下面是get请求,但有些get请求url包含参数,如:www.xxx.com?keyword=bolg;guguobao&pageindex=1,怎么简化url,requests提供其他方法:
    payload = {'opt':1}
    r = requests.get('https://i.cnblogs.com/EditPosts.aspx',params=payload)
    print r.url
    

    响应与编码

    import requests
    r = requests.get('http://www.baidu.com')
    print 'content -- >'+ r.content
    print 'text -- >'+ r.text
    print 'encoding -- >'+ r.encoding
    r.encoding='utf-8'
    print 'new text-- >'+r.text
    

    uploading-image-85581.png

    r.content 返回是字节,text返回文本形式

    • 如果输出结果为encoding -->encoding -- >ISO-8859-1,则说明实际的编码格式是UTF-8,由于Requests猜测错误,导致解析文本出现乱码。Requests提供解决方案,可以自行设置编码格式,r.encoding='utf-8'设置成UTF-8之后,“new text -->”就不会出现乱码。但这种方法笨拙。因此就有了:chardet,优秀的字符串/文件编码检测模块。

    • 安装pip install chardet

    • 安装完成后,使用chardet.detect()返回字典,其中confidence是检测精确度,encoding是编码方式

    import requests,chardet
    r = requests.get('http://www.baidu.com')
    print chardet.detect(r.content)
    r.encoding = chardet.detect(r.content)['encoding']
    print(r.text)
    
    • 运行结果
    C:Python27python.exe F:/python_scrapy/ch03/3.2.3_3.py
    {'confidence': 0.99, 'language': '', 'encoding': 'utf-8'}
    <!DOCTYPE html>
    <!--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 content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div ..
    .................
    Process finished with exit code 0
    
    

    3 请求头header处理

    • Requests对headers的处理和urllib2非常相似,在Requests的get函数添加headers参数
    import requests
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers={'User-Agent':user_agent}
    r = requests.get('http://www.baidu.com',headers=headers)
    print r.content
    
    

    响应码code和响应头header处理

    import requests
    r = requests.get('http://www.baidu.com')
    if r.status_code == requests.codes.ok:
        print r.status_code#响应码
        print r.headers#响应头
        print r.headers.get('content-type')#推荐使用这种获取方式,获取其中的某个字段
        print r.headers['content-type']#不推荐使用这种获取方式,因为不存在会抛出异常
    else:
        r.raise_for_status()
    

    cookie处理

    • 如果响应包含cookie的值,可以如下方式取出:
    import requests
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers={'User-Agent':user_agent}
    r = requests.get('http://www.baidu.com',headers=headers)
    #遍历出所有的cookie字段的值
    for cookie in r.cookies.keys():
        print cookie+':'+r.cookies.get(cookie)
    
    • 如果想自定义cookie发出去,使用以下方式:
    import requests
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers={'User-Agent':user_agent}
    cookies = dict(name='guguobao',age='10')
    r = requests.get('http://www.baidu.com',headers=headers,cookies=cookies)
    print r.text
    
    • 还有一种更加高级,且能自动处理Cookie的方式,有时候我们不需要关心Cookie值是多少,只是希望每次访问的时候,程序都会自动把cookie带上。Requests提供一个session的概念,在连续登录网页,处理登录跳转特别方便,不需要关注具体细节
    import requests
    loginUrl= 'http://www.xxx.com/login'
    s = requests.Session()
    #首先访问登录界面,作为游客,服务器会先分配一个cookie
    r = s.get(loginUrl,allow_redirects=True)
    datas={'name':'guguobao','passwd':'guguobao'}
    #向登录链接发送post请求,验证成功,游客权限转为会员权限
    r =s.post(loginUrl,data=datas,allow_redirects=True)
    print r.text
    
    
    • 这种使用Session函数处理Cookie的方式很常见

    重定向与历史记录

    • r =requests.get('http://www.baidu.com/',allow_redirects=True),将allow_redirects设置为True,允许重定向,FALSE不允许。可以通过r.hisory字段查看历史成功访问请求跳转信息:
    import requests
    r = requests.get('http://github.com')
    print r.url
    print r.status_code
    print r.history
    
    

    7 超时设置

    • r = requests.get('http://github.com',timeout=2)

    8 代理设置

    import requests
    proxies = {
      "http": "http://127.0.0.1:1080",
      "https": "http://127.0.0.1:1080",
    }
    r = requests.get("http://www.google.com", proxies=proxies)
    print r.text
    
    
    • 也可以通过环境变量HTTP_PROXY和HTTPS_PROXY来配置代理,但不常用。你的代理需要使用HTTP Basic Auth,可以使用http://user:password@host:端口
    proxies = {
      "http": "http://user:password@127.0.0.1:1080",
    ]
    
  • 相关阅读:
    取模和取余详解
    如何上传图片到博客园的文章中?
    Java并发关键字Volatile 详解
    MySQL查询基础
    MySQL基础
    Access denied for user 'root'@'localhost' Could not obtain connection
    获取和设置select的option值
    如何将long类型的时间变量转变为标准时间
    【Java】对文件或文件夹进行重命名
    安装GlassFish4 报错:unsupported major.minor version 51.0
  • 原文地址:https://www.cnblogs.com/guguobao/p/9404614.html
Copyright © 2011-2022 走看看