[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请求被尝试了三次,三次都出错,才抛出异常,并被我们捕获。

 

 

 

===

posted @ 2020-05-15 15:29  风间悠香  阅读(315)  评论(0编辑  收藏  举报