美文网首页
python爬虫8: Requests库使用

python爬虫8: Requests库使用

作者: dc630f46ee2d | 来源:发表于2017-11-07 00:14 被阅读0次

    前言

    Requests实现简单易用的HTTP库,基于urllib,比urllib方便,做爬虫使用Requests比urllib方便。

    GET基本用法

    1. 基本GET请求
    import requests
    response = requests.get('http://www.baidu.com')
    print(response.text)
    

    其中response.text是字符串类型

    1. 带参数的GET请求1
    import requests #package
    response = requests.get('http://httpbin.org/get?name=zhou&age=29') #__init__.py中的方法直接用包名.方法名
    

    ?分割参数和路径。&风格参数。

    3.使用字典传入参数发送GET请求

    dict = {'name':'zhou',
            'age':29
            }
    response = requests.get('http://httpbin.org/get',params=dict)
    print(response.text)
    
    1. 解析json.即将返回结果可以用dict保存
    dict = {'name':'zhou',
            'age':29
            }
    response = requests.get('http://httpbin.org/get',params=dict)
    print(response.json())
    

    response.json() 将json用python的dict类型保存

    1. 获取二进制数据 response.conent
    response = requests.get("https://github.com/favicon.ico")
    print(type(response.content))
    with open('2.icon', 'wb') as f:
        f.write(response.content)
    
    

    解释一下with...open() as f:等价于

    response = requests.get("https://github.com/favicon.ico")
    print(type(response.content))
    with open('2.icon', 'wb') as f:
        f.write(response.content)
    

    对于open()内置方法,第一个参数是文件全路径。第二个参数'wb'表示,以byte形式write.

    1. 添加headers

    有些网站爬虫的时候,如果不加上headers(比如请求的应用程序是什么),可能会出现响应不正确返回。

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

    输出500而不是200
    修改一下

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

    输出200

    POST基本用法

    post和get方法类型,唯一的区别可以添加数据到request body

    响应

    查看repsonse的一些属性

    import requests  # package.
    
    response = requests.get('http://www.jianshu.com') #__init__.py中的方法可以直接这样调用 
    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)
    

    输出如下
    <class 'int'> 200
    <class 'requests.structures.CaseInsensitiveDict'> {'Date': 'Sun, 05 Nov 2017 13:37:40 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/"85a833d01f43b34ca494a1f2d556eb57"', 'Cache-Control': 'max-age=0, private, must-revalidate', 'Set-Cookie': '_m7e_session=3547b198f318f3554b571be30322df3a; path=/; expires=Sun, 05 Nov 2017 19:37:40 -0000; HttpOnly', 'X-Request-Id': 'ab775f20-eb6c-490e-8fc8-e65a3b36de73', 'X-Runtime': '0.008022', 'Content-Encoding': 'gzip', 'X-Via': '1.1 shendianxin28:0 (Cdn Cache Server V2.0)', 'Connection': 'keep-alive'}
    <class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie _m7e_session=3547b198f318f3554b571be30322df3a for www.jianshu.com/>]>
    <class 'str'> http://www.jianshu.com/
    <class 'list'> []

    状态码类型是int 值 200
    headers类型是requests.structures.CaseInsensitiveDict
    cookies类型是requests.cookies.RequestsCookieJar
    等等其他

    状态码的判断

    访问一个不存在的页面,返回状态码为404

    import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
    response = requests.get('http://www.jianshu.com/hello.html')
    print(response.status_code)
    
    import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
    response = requests.get('http://www.jianshu.com')
    exit()  if not response.status_code == 200  else print('succesful') # 如果不等于200 退出程序,否则输出成功
    

    文件上传

    import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
    files = {'files': open('1.icon', 'rb')}
    response = requests.post('http://httpbin.org/post', files = files)
    print(response.text)
    

    获取cookies

    import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
    
    response = requests.get('https://www.baidu.com')
    print(response.cookies.items())
    for key, value in response.cookies.items():
        print(key + '=' + value)
    
    
    # a list of name-value tuples
    [('a', 'b'), ('c', 'd')]
    

    注意只有 a list of name-value tuples(list的成员都是tuple,tuple中只有两个值)才能用这种遍历方法,一般list不能用这个方法。
    for in 后面要加

    会话维持

    import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
    
    response = requests.get('http://httpbin.org/cookies/set/num/12312456')
    response = requests.get('http://httpbing.org/cookies')
    print(response.text)
    

    不会输出cookie值,相当于两个浏览器访问了访问了。

    创建一个session,用session发请求,可以拿到cookie

    s = requests.Session()
    s.get('http://httpbin.org/cookies/set/num/12312456')
    response = s.get('http://httpbin.org/cookies')
    print(response.text)
    

    输出如下

    {
      "cookies": {
        "num": "12312456"
      }
    }
    

    https证书验证

    有些证书并不是证书颁发机构下发的服务器的,浏览器不信任这个证书。以访问https://12306.cn为例,打开网站后就会下图提示这样的结果。

    屏幕快照 2017-11-06 上午12.52.38.png

    对于这种情况,如果使用requests库的话,会抛出一个异常

    import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
    
    response = requests.get('https://www.12306.cn')
    

    我们只需要设置verify参数为NO,就可以了,不再验证证书合法性

    import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
    
    response = requests.get('https://www.12306.cn', verify = False)
    

    现在虽然验证成功了。但是发现log窗口依然会报一个警告,如下。

    InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
      InsecureRequestWarning)
    

    将警告屏蔽掉不输出即可

    import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
    import urllib3
    urllib3.disable_warnings()
    response = requests.get('https://www.12306.cn', verify = False)
    

    代理

    import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
    proxy = {
        'http':'http://127.0.0.1:9734',
        'https': 'https://127.0.0.1:9734'
    }
    response = requests.get('https:wwww.taobao.com', proxy = proxy)
    

    http认证

    有些网站访问的时候会弹出框提示用户输入账号密码才能访问。这个就涉及到了http认证。即服务器查询用户是否有访问服务器资源的权限。

    import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
    import requests.auth
    auth = requests.auth.HTTPBasicAuth('user','123'); # requests.auth.HTTPBasicAuth 对象创建
    # print(type(auth))
    r = requests.get('http://120.27.34.24',auth=auth)
    

    超时设置

    设置允许最大的超时时间,如果一旦这个超时时间内依然没有返回,那么程序就不能正常运行了。

    import requests  # package,只能调用__init__.py中的方法,要调用request.auth.py的方法,需要import request.auth
    from requests.exceptions import  ReadTimeout
    try:
        response = requests.get('http://httpbin.org/get', timeout = 0.5)
        print(response.status_code)
    except ReadTimeout:
       print('Timeout')
    

    异常处理

    可以google requests,然后查看文档Exceptions,拿到所有的异常类

    import  requests.exceptions
    try:
        response = requests.get('http://httpbin.org/get', timeout = 0.1)
        print(response.status_code)
    except requests.exceptions.ReadTimeout:
        print('Timeout')
    except requests.exceptions.HTTPError:
        print('HTTPError')
    except requests.exceptions.ConnectionError:
        print('ConnectionError')
    

    参考

    相关文章

      网友评论

          本文标题:python爬虫8: Requests库使用

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