python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > requests高级用法

Python之requests高级用法详解

作者:ZhiHuaWei

这篇文章主要介绍了Python之requests高级用法详解,http协议是无状态的, 服务器无法区分多个请求是否来自同一个人,因此需要用cookie来进行标识,一般如果需要登录才能访问的网站就需要发送cookie信息,需要的朋友可以参考下

设置请求头(headers)

在爬虫操作中,经常需要携带请求头信息(比如User-Agent、Referer、Host、Origin、Cookie)才能正常访问。

User-Agent : 浏览器名称,服务器可以知道该请求是从哪个浏览器过来的,在爬虫中经常需要设置这个参数来伪装我们的请求是从浏览器中过来的,这个值也是我们最经常应用的;Referer : 表示当前请求是从哪个url过来的,在有些反爬虫请求中,如果不是从指定页面访问该请求,就不会有相关响应;

Host : 标识请求将要达到那台主机,并会在服务端被验证,如果不符合,就不能正确处理客户端的请求;

Origin : 说明最初请求是从哪里发起的。Referer显示来源页面的完整地址,而Origin显示来源页面的Origin: protocal+host,不包含路径等信息,也就不会包含含有用户信息的敏感内容,跟Referer相似,但是Origin只能用于post请求。Referer适用于所有请求;因此Origin较Referer更安全,多用于防范CSRF攻击;

Cookie : http协议是无状态的, 服务器无法区分多个请求是否来自同一个人,因此需要用cookie来进行标识,一般如果需要登录才能访问的网站就需要发送cookie信息。

GET请求代码示例

    # 引入requests库
    import requests
    
    # 声明定义请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
    }
    # 向指定的url发送请求,并返回
    url = 'https://www.baidu.com/s'
    # 传入参数
    data = {
        'wd': '中国'
    }
    r = requests.get(url=url, params=data, headers=headers)
    print(r.text)

POST请求代码示例

    # 引入requests库
    import requests
    
    # 声明定义请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
    }
    # 请求地址
    post_url = 'https://fanyi.baidu.com/sug'
    # 参数
    form_data = {
        'kw': 'baby'
    }
    # 进行post请求
    req = requests.post(url=post_url, data=form_data, headers=headers)
    print('json:', req.json())

设置代理服务器IP(proxy)

使用requests添加代理也是非常简单,只要在请求方法中(例如requests.get()或者requests.post())传递proxies参数就可以了,示例代码如下:

GET请求代码示例

    # 引入requests库
    import random
    import requests
    
    # 声明定义代理服务器列表
    proxy_list = [
        {"http": "58.21.202.124:8080"},
        {"http": "58.21.202.39:8080"},
        {"http": "39.107.232.194:8080"}
    ]
    # 随机选择一个代理
    proxy = random.choice(proxy_list)
    # 声明定义请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
    }
    # 请求地址
    url = 'http://www.baidu.com/s?ie=UTF-8&wd=ip'
    # 进行GET请求,打印响应结果
    try:
        req = requests.get(url=url, headers=headers, proxies=proxy)
        print(req.text)
    except requests.exceptions.ConnectionError as e:
        print(e)

POST请求代码示例

    # 引入requests库
    import random
    import requests
    
    # 声明定义代理服务器列表
    proxy_list = [
        {"http": "58.21.202.124:8080"},
        {"http": "58.21.202.39:8080"},
        {"http": "39.107.232.194:8080"}
    ]
    # 随机选择一个代理
    proxy = random.choice(proxy_list)
    # 声明定义请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
    }
    # 请求地址
    url = 'http://www.baidu.com/s?ie=UTF-8&wd=ip'
    # 进行POST请求,打印响应结果
    try:
        req = requests.post(url=url, headers=headers, proxies=proxy)
        print(req.text)
    except requests.exceptions.ConnectionError as e:
        print(e)

Cookies(Session)

如果在一个相应中包含了cookie,那么可以利用cookies属性拿到这个返返回的cookie值,例如:

    # 引入requests库
    import requests
    
    # GET访问
    # 向指定的url发送请求,并返回
    url = 'https://www.baidu.com/'
    # 发送get请求
    req = requests.get(url=url)
    # 响应内容
    print('Cookies信息:', req.cookies)
    print(req.cookies.get_dict())

requests.Session()

上面那个不是重点,重点的是requests.Session() ;之前使用urllib库的时候是可以使用opener发送多个请求,多个请求之间是可以共享cookie的。那么如果使用requests,也要达到共享cookie的目的,那么可以使用requests库给我们提供的session对象。注意,这里的session不是web开发中的那个session,这个地方只是一个会话的对象而已。还是以人人网登陆为例,使用requests来实现,示例代码如下:

    # 引入requests库
    import requests
    
    # 声明定义header
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
    }
    # 创建session对象
    session = requests.Session()
    # 人人网登陆地址
    post_uel = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019621044248'
    # 参数
    form_data = {
        'email': '188****7357',  # 这是手机号,我隐藏掉中间四位
        'icode': '',
        'origURL': 'http://www.renren.com/home',
        'domain': 'renren.com',
        'key_id': '1',
        'captcha_type': 'web_login',
        'password': '01cb55635986f56265d3b55aaddaa79337d094cb56d6cf7724343a93ad586fe7',
        'rkey': 'd5ff51375d8eb17a011cad5622d835fd',
        'f': 'http%3A%2F%2Fwww.renren.com%2F971686685%2Fprofile'
    }
    ret1 = session.post(url=post_uel, headers=headers, data=form_data)
    print('登陆结果:', ret1.json())
    print('*' * 50)
    
    # 人人网个人中心地址
    get_url = 'http://www.renren.com/971686685/profile'
    ret2 = session.get(url=get_url)
    print(ret2.content.decode())

处理不信任的SSL证书

对于那些已经被信任的SSL证书的网站,例如//www.baidu.com/,那么使用requests库直接就可以正常的返回响应。请求可以为HTTPS请求验证SSL证书,就像web浏览器一样,SSL验证默认是开启的,如果证书验证失败,请求会抛出SSLError遇到请求的SSL验证,可以直接跳过不验证,将verify=False设置一下即可示例代码:

    # 引入requests库
    import requests
    
    # 向指定的url发送请求,并返回
    url = 'https://www.12306.cn/'
    # 发送get请求
    req = requests.get(url=url, verify=False)
    
    print(req.content)

到此这篇关于Python之requests高级用法详解的文章就介绍到这了,更多相关requests高级用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文