zoukankan      html  css  js  c++  java
  • requests库使用

    一、requests简介

    1.requests概念

    Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。

    requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。

    2.为什么使用requests

    与urllib的区别,urllib的缺点

    • 手动处理url编码

    • 手动处理post请求参数

    • 处理cookie和代理操作繁琐

    requests模块有点:

    • 自动处理url编码

    • 自动处理post请求参数

    • 简化cookie和代理操作

    3.requests安装

    pip install requests

    requests最简单实例:

    import requests
    r = requests.get("http://www.baidu.com")
    r.status_code
    r.encoding = 'utf-8'
    r.text

    使用基本流程:

    • 指定url

    • 基于requests模块发起请求

    • 获取响应对象中的数据值

    • 持久化存储

    二、requests的方法

    User-Agent

    请求载体身份标识的伪装:

    • User-Agent:请求载体身份标识,通过浏览器发起的请求,请求载体为浏览器,则该请求的User-Agent为浏览器的身份标识,使用爬虫程序发起的请求,则该请求的载体为爬虫程序,则该请求的User-Agent为爬虫程序的身份标识。可以通过判断该值来获知该请求的载体究竟是基于哪款浏览器还是基于爬虫程序。

    • 反爬机制:某些门户网站会对访问该网站的请求中的User-Agent进行捕获和判断,如果该请求的UA为爬虫程序,则拒绝向该请求提供数据。

    • 反反爬策略:将爬虫程序的UA伪装成某一款浏览器的身份标识。

    1.requests库的7个方法

    Requests库的7个主要方法:

    • requests.request():构造一个请求,支撑一下各方法的基础方法
    • requests.get():获取HTML网页的主要方法,对应于HTTP的GET
    • requests.head():获取HTML网页头信息的方法,对应HTTP的HEAD
    • requests.post():向HTML网页提交POST请求的方法,对应于HTTP的POST
    • requests.put():向HTML网页提交PUT请求的方法,对应于HTTP的PUT
    • requests.patch():向HTML网页提交局部修改请求,对应于HTTP的PATCH
    • requests.delete():向HTML网页提交删除请求,对应于HTTP的DELETE

    Requests的主要方法

    1.requests.request(method, url, **kwargs)

    • method:请求方式,对应get/put.post等7种
    • url:拟获取页面的url链接
    • **kwargs:控制访问的参数,共13个
    r = requests.request('GET', url, **kwargs)
    r = requests.request('HEAD', url, **kwargs)
    r = requests.request('POST', url, **kwargs)
    r = requests.request('PUT', url, **kwargs)
    r = requests.request('PATCH', url, **kwargs)
    r = requests.request('delete', url, **kwargs)
    r = requests.request('OPPTIONS', url, **kwargs)

    **kwargs:控制访问的参数,均为可选项

    • params:字典或字节序列,作为参数增加到url中
    eg:
    kv = {'key1':'value1', 'key2':value2'}
    r = requests.request('get', 'http://python123.io/ws', params=kv)
    print(r.rul)
    => http://python123.io/ws?key1=value1&key2=value2
    • data:字典、字节序列或文件对象,作为Request的内容
    eg:
    kv = {'key1':'value1', 'key2':value2'}
    r = requests.request('POST', 'http://python123.io/ws', data=kv)
    body = '主题内容'
    r = requests.request('POST', 'http://python123.io/ws', data=body)
    • json:JSON格式的数据,作为Request的内容
    eg:
    kv = {'key1:value1'}
    r = requests.request('post', 'http://python123.io/ws', json=kv)
    • headers:字典,HTTP定制头
    hd = {'user-agent': 'Chrome/10'}
    r = requests.request('POST', 'http://python123.io/ws', headers=hd)
    • cookies:字典或CookieJar,Request中的cookie
    • auth:元组,支持HTTP认证功能
    • files:字典类型,传输文件
    fs = {"file':open('data.xls', 'rb')}
    r = requests.request('POST', 'http://python123.io/ws', files=fs)
    timeout:设定超时时间,秒为单位
    r = requests.request('GET', 'http://www.baidu.com', timeout=10)
    • proxies:字典类型,设定访问代理服务器,可以增加登录认证
    pxs = {'http': 'http://user:pass@10.10.10.1:1234'
    'https': 'https://10.10.10.1:4321'}
    r = requests.request('GET', 'http://www.baidu.com', proxies=pxs)
    • allow_redirects:True/False,默认为True,重定向开关
    • stream:True/False,默认为True,获取内容立即下载开关
    • verify:True/False,默认为True,认证SSL证书开关
    • cert:本地SSL证书路径

    2.requests.get(url, params=None, **kwargs)

    • url:拟获取页面的url链接
    • params:url中的额外参数,字典或字节流格式,可选
    • **kwargs:12个控制访问的参数

    3.requests.head(url, **kwargs)

    • url:拟获取页面的url链接
    • **kwargs:13个控制访问的参数

    4.requests.post(url, dats=None, json=None, **kwargs)

    • url:拟更新页面的url链接
    • data:字典、字节序列或文件,Request的内容
    • json:JSON格式的数据,Request的内容
    • **kwargs:11个控制访问的参数

    5.requests.put(url, data=None, **kwargs)

    • url:拟更新页面的url链接
    • data:字典、字节序列或文件,Request的内容
    • **kwargs:12个控制访问的参数

    6.requests.patch(url, data=None, **kwargs)

    • url:拟更新页面的url链接
    • data:字典、字节序列或文件,Request的内容
    • **kwargs:12个控制访问的参数

    7.requests.delete(url, **kwargs)

    • url:拟删除页面的url
    • **kwargs:13个控制访问的参数

    2.requests基于get请求

    r = requests.get(url)

    • 构造一个向服务器请求资源的Requests对象
    • 返回一个包含服务器资源的Response对象

    r = requests.get(url, params=None, **kwargs)

    • url:拟获取网页的url链接
    • params:url中的额外参数,字典或字节流合适,可选
    • **kwargs:12各控制访问的参数

    1.简单的get请求

    import requests
    response=requests.get('http:/www.baidu.com/')
    print(response.text)

    2.带参数的GET请求-->headers

    通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常见的有用的请求头如下:

    • Host

    • Referer:大型网站通常都会根据该参数判断请求的来源

    • User-Agent:客户端

    • Cookie:Cookie信息虽然包含在请求头里,但requests模块有单独的参数来处理他,headers={}内就不要放它了

    url = "https://www.sogou.com/web"# 设定动态的请求参数
    wd = input("enter a key word:")
    params = {
        "query":wd
    }
    # UA伪装
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
    }
    ​
    # 参数2:params是一个字典,用来处理动态请求参数
    response = requests.get(url=url,params=params,headers=headers)
    # 修改原始的编码格式
    response.encoding = "utf-8"
    page_text = response.text
    fileName = wd + ".html"
    with open(fileName,"w",encoding="utf-8") as fp:
        fp.write(page_text)
    print(fileName,"下载成功!")

    3.带参数的GET请求-->params

    1.自己拼接GET参数

    # 在请求头内将自己伪装成浏览器,否则百度不会正常返回页面内容
    import requests
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',
    }
        
    response=requests.get('https://www.baidu.com/s?wd=python&pn=1',headers=headers)
    print(response.text)
    ​
    # 如果查询关键词是中文或者有其他特殊符号,则不得不进行url编码
    from urllib.parse import urlencode
    wb = "熊大"
    encode_res = urlencode({"k":wb},encoding="utf-8")
    print(encode_res)  #k=haiyan%E6%B5%B7%E7%87%95
    ​
    keywords = encode_res.split("=")[1]  #haiyan%E6%B5%B7%E7%87%95
    url = "https://www.baidu.com/s?wd=%s&pn=1"%(keywords)
    ​
    # url = "https://www.baidu.com/s?"+encode_res
    print(url)
    # 然后拼接成url
    response = requests.get(
        url,
        headers =headers
    )

    2.url中传递params参数

    url = "https://www.sogou.com/web"# 设定动态的请求参数
    wd = input("enter a key word:")
    params = {
        "query":wd
    }
    # UA伪装
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
    }
    ​
    # 参数2:params是一个字典,用来处理动态请求参数
    response = requests.get(url=url,params=params,headers=headers)
    # 修改原始的编码格式
    response.encoding = "utf-8"
    page_text = response.text
    fileName = wd + ".html"# 保存到本地文件
    with open(fileName,"w",encoding="utf-8") as fp:
        fp.write(page_text)
    print(fileName,"下载成功!")

    4.带参数的GET请求-->cookies

    登录github,然后从浏览器中获取cookies,以后就可以直接拿着cookie登录了,无需输入用户名密码。

    # 用户名:egonlin 邮箱378533872@qq.com 密码lhf@123
    import requests
    ​
    Cookies={
    'user_session':'wGMHFJKgDcmRIVvcA14_Wrt_3xaUyJNsBnPbYzEL6L0bHcfc',
    }
    ​
    response=requests.get('https://github.com/settings/emails',
                 cookies=Cookies) #github对请求头没有什么限制,我们无需定制user-agent,对于其他网站可能还需要定制
    print('378533872@qq.com' in response.text)  # True

    3.requests基于post请求

    与get请求的区别:

    get请求:

    • 没有请求体

    • 数据必须在1K之内!

    • GET请求数据会暴露在浏览器的地址栏中

    post请求:

    • 数据不会出现在地址栏中

    • 数据的大小没有上限

    • 有请求体

    • 请求体中如果存在中文,会使用URL编码!

    1.简单的post请求

    import requests
    response=requests.get('http:/www.baidu.com/')
    print(response.text)

    2.带参数的post请求-->data

    post请求的数据在form-data中,可以获取请求中的form-data数据,根据我们的需求改动数据,发起请求。

    url = "https://movie.douban.com/j/chart/top_list"
    num = 200for i in range(0,num,20):
        start = i
        data = {
            "type": "24",
            "interval_id": "100:90",
            "action": "",
            "start": i,
            "limit": "20"
        }
    ​
        response = requests.post(url=url,data=data,headers=headers)
        for movie in response.json():
            print(movie["rank"],movie["title"],movie["score"])

    4.post请求模拟登陆

    post请求登录:

    1. 对于登录来说,应该输错用户名或密码然后分析抓包流程,用脑子想一想,输对了浏览器就跳转了,还分析个毛线,累死你也找不到包

    2. 要做登录的时候一定记得要把cookie先清除;

    3. requests.session():中间的cookie都不用自己分析了,有用的没用的都给放进来了、

    4. response.cookie.get_dict() #获取cookie

    自动登录github代码

    1.目标站点分析

    commit:Sign in

    utf8:✓

    authenticity_token:lbI8IJCwGslZS8qJPnof5e7ZkCoSoMn6jmDTsL1r/m06NLyIbw7vCrpwrFAPzHMep3Tmf/TSJVoXWrvDZaVwxQ==

    login:egonlin

    password:123

    2.流程分析:

    ps:如果密码时密文形式,则可以先输错账号,输对密码,然后到浏览器中拿到加密后的密码,github的密码是明文

    import requests
    import re
    ​
    #第一次请求
    r1=requests.get('https://github.com/login')
    r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被授权)
    authenticity_token=re.findall(r'name="authenticity_token".*?value="(.*?)"',r1.text)[0] #从页面中拿到CSRF TOKEN
    #第二次请求:带着初始cookie和TOKEN发送POST请求给登录页面,带上账号密码
    data={
        'commit':'Sign in',
        'utf8':'',
        'authenticity_token':authenticity_token,
        'login':'317828332@qq.com',
        'password':'alex3714'
    }
    r2=requests.post('https://github.com/session',
                 data=data,
                 cookies=r1_cookie
                 )
    ​
    ​
    login_cookie=r2.cookies.get_dict()
    ​
    ​
    #第三次请求:以后的登录,拿着login_cookie就可以,比如访问一些个人配置
    r3=requests.get('https://github.com/settings/emails',cookies=login_cookie)
    ​
    print('317828332@qq.com' in r3.text) #True

    三、响应对象Response

    1.response对象的属性

    import requests
    respone=requests.get('http://www.jianshu.com')

    response属性:

    • text:字符串的文本内容

    • content:二进制byte格式的内容

    • status_code:响应的状态码

    • cookies:请求的cookie数据

    • encoding:响应体的编码格式

    • cookies.get_dict():请求cookies的字典

    • url:请求的的url

    • json():请求数据为json时,返回json字典

  • 相关阅读:
    Spring Cloud微服务实战 打造企业级优惠券系统 7-2 优惠券模块实体类相关列值枚举定义
    Spring Cloud微服务实战 打造企业级优惠券系统 7-1 创建优惠券模块微服务
    阿里云 oss (一) 工具上传图片
    Gateway 过滤器,过滤器统一异常处理
    GatewayFilterFactory 不生
    docker 安装 redis
    json 时区问题
    小程序checkbox
    小程序拍照功能
    Learning sensorimotor control with neuromorphic sensors: Toward hyperdimensional active perception
  • 原文地址:https://www.cnblogs.com/ryxiong-blog/p/11285908.html
Copyright © 2011-2022 走看看