zoukankan      html  css  js  c++  java
  • [Python自学] 爬虫(3)Requests库

    一、requests库相关概念

    1.requests和urllib的区别

    1)requests的底层实现就是urllib

    2)requests在python2和python3比较通用,类、方法等基本一样。

    3)requests更简单易用

    4)requests能够自动帮我们解压响应数据

    2.requests文档

    官方中文文档:https://requests.readthedocs.io/zh_CN/latest/

    二、response响应

    1.获取响应内容文本(str)

    import requests

    response = requests.get("https://www.baidu.com") response.encoding = "utf-8" print(response.text) # response.text的类型是str

    使用response.encoding="utf-8"是为其设置一个解码类型,避免解码错误,形成乱码。

    这里需要注意,我们使用什么样的解码类型,要和响应数据使用编码类型一致,有些相应使用的是gbk编码,我们也需要用gbk来解码。这里要根据实际的情况来调整。

    2.获取响应内容二进制数据

    import requests
    response = requests.get("https://www.baidu.com")
    response.encoding = "utf-8"
    print(response.content)  # 获取二进制数据
    print(response.content.decode("utf-8"))  # 将二进制解码为"utf-8",类型是str,和response.text一样

    三、requests小技巧

    1.转换cookies为字典类型

    import requests
    
    response = requests.get("http://www.baidu.com")
    
    # RequestsCookieJar 对象
    print(response.cookies)  # <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
    # 将RequestsCookieJar对象转换为字典
    cookie_dict = requests.utils.dict_from_cookiejar(response.cookies)
    print(cookie_dict)  # {'BDORZ': '27315'}

    使用requests.utils.dict_from_cookiejar方法可以将response.cookies转换为字典,方便使用。

    注意:我们在浏览器中看到的cookie可能有很多,但这些cookies不一定是服务器一次性设置的,而是在不同的请求中分别设置的,所以我们通过response.cookies获取的cookie只是其中的一部分。

    2.url地址编解码

    import requests
    
    url = "http://www.baidu.com/s?wd=魔兽世界"
    
    # url编码
    url_encoded = requests.utils.quote(url)
    print(url_encoded)  # http%3A//www.baidu.com/s%3Fwd%3D%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C
    # url解码
    url_decoded = requests.utils.unquote(url_encoded)
    print(url_decoded)  # http://www.baidu.com/s?wd=魔兽世界

    3.忽略SSL证书验证

    当我们访问的HTTPS网站的证书不是花钱购买的证书(不被我们的机器认可,认为是不安全的,即浏览器上的小锁不是加锁状态),那么在发送请求的时候会提示证书验证失败。

    此时我们可以使用以下方法,不进行证书验证:

    import requests
    
    res = requests.get("https://www.12306.cn/mormhweb/", verify=False)  # 这里会出现一个强烈建议添加证书认证的警告
    print(res.content)

    4.设置requests请求超时时间

    import requests
    
    res = requests.get("https://www.12306.cn/mormhweb/", timeout=10)  # 10秒没响应就报异常,我们通过try except来捕获

    5.判断响应是否正常

    即判断响应状态码是否为200:

    import requests
    
    
    def _parse_url(url):
        response = requests.get(url, timeout=10)
        assert response.status_code == 200
        return response.content
    
    
    def parse_url(url):
        try:
            html_content = _parse_url(url)
        except Exception as err:
            print(err)
            html_content = None
    
        return html_content
    
    
    if __name__ == '__main__':
        cap_url = 'http://www.baidu.com/'
        print(parse_url(cap_url).decode('utf-8'))

    通过断言来研判响应状态码是否为200,如果不是200则抛出异常。

    6.使用retrying模块来重试请求

    import requests
    from retrying import retry  # 使用前要使用pip install retrying安装这个第三方模块
    
    
    @retry(stop_max_attempt_number=3)  # 使用retry装饰器,可以实现该函数最多尝试3次,如果还报错,则抛出异常
    def _parse_url(url):
        print("retry...")
        response = requests.get(url, timeout=10)
        assert response.status_code == 200
        return response.content
    
    def parse_url(url):
        try:
            html_content = _parse_url(url)
        except Exception as err:
            print(err)
            html_content = None
    
        return html_content
    
    
    if __name__ == '__main__':
        # cap_url = 'http://www.baidu.com/'
        cap_url = 'www.baidu.com/'  # 我们将url改成错误的,然后进行尝试retry的效果
        content = parse_url(cap_url)
        if content:
            print(content.decode('utf-8'))

    输出结果:

    retry...
    retry...
    retry...
    Invalid URL 'www.baidu.com/': No schema supplied. Perhaps you meant http://www.baidu.com/?

    可以看到,get请求被尝试了三次,三次都出错,才抛出异常,并被我们捕获。

    ===

  • 相关阅读:
    select,epoll,poll比较(网络资源总结)
    c++(重载、覆盖、隐藏)
    TCP状态转换图
    TCP心跳 | TCP keepAlive
    回车、换行、空格的ASCII码值—(附ASCII码表)
    C++ dlopen mini HOWTO 一篇非常好的介绍
    shell十三问
    linux IPC消息队列 的内核限制
    C++ string 类常用函数
    const用法的解惑
  • 原文地址:https://www.cnblogs.com/leokale-zz/p/12842096.html
Copyright © 2011-2022 走看看