zoukankan      html  css  js  c++  java
  • 爬虫之Reuqests模块使用

    一、GET请求

    '''
    GET请求:
          没有请求体
          数据不能超过1k
          请求的数据会暴露在浏览器的地址栏中
    '''

    1、基本的get请求:

    import requests
    # 1、基本请求
    res=requests.get('http://127.0.0.1:8000/index')
    print(res.text)

    2、带参数的GET请求:

    (1) params

    # 请求地址中携带数据(两种方式)
    # 第一种,用urlencode进行编码
    from urllib.parse import urlencode,unquote  #urlencode是进行url编码,unquote是解码
    res=requests.get('https://www.baidu.com/s?wd=斗罗大陆')
    print(res.url)
    # 第二种: 用params(推荐用这种,因为它会自动对请求参数进行url编码
    res=requests.get('https://www.baidu.com/s',params={'wd':'斗罗大陆'})
    print(res.url)

    (2)headers

    '''
    header请求头中,通常放有Host,Referer,User-Agent,Cookie等
    Host:主机
    Referer:主要用来解决防盗链问题(一些网站会根据这个参数来判断请求源是不是来自自身网站)
    User_Agent: 浏览器标识,主要用来解决检测是否是浏览器发起的问题
    Cookie:用来存放用户记录,比如账号登陆后产生cookie,这样浏览器其他页面就可以根据cookie来判断该用户是否登陆了。request模块有单独的参数来处理该字段。
    '''
    header = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
        'referer':'https://www.baidu.com'
    }
    res=requests.get('https://www.baidu.com/s',headers=header)

    (3) cookies

    # 请求代cookie的两种方式
    # 1、放在headers中
    header = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
        'cookie':'cookie值'
    }
    res=requests.get('https://www.baidu.com/s',headers=header)
    # 2、用request模块中的cookies参数
    # cookies可以是一个字典或者cookiesjar对象
    from http.cookiejar import CookieJar
    # 创建一个cookie对象
    cookiejar = CookieJar()
    res=requests.get('https://www.baidu.com/s',cookies={'key':'value'})
    res=requests.get('https://www.baidu.com/s',cookies=cookiejar)

    二、POST请求

    '''
    POST请求:
          数据不会出现在地址栏中
          数据大小没有限制
          有请求体
          请求体如果有中文或者特殊符号,要使用url编码
    
    '''
    #自动携带cookie
    session=requests.session()
    res =session.post('https://kao.acmcoder.com/enterprise/loginc',data={'phone': '13927037099','pwd': '12345678'},headers=headers)
    #这时,再请求该网站的其他页面,不需要带cookies
    res1=session.get('https://kao.acmcoder.com/index')
    # 发送post请求,携带数据(urlencoded和json)
    # res=requests.post('http://127.0.0.1:8000/index/',data={'name':'hello'})
    # print(res.text)
    
    # res=requests.post('http://127.0.0.1:8000/index/',json={'age':1,},)
    # print(res.text)

    注意:post请求 默认请求头是:application/x-www-form-urlencoed,如果请求头设置成application/json,则可以用json传值给后台,不能用data传值(因为data是urlencode)

    三、Response响应

    1、response响应对象属性

    res=requests.get('https://www.baidu.com/')
    res.text    #响应的文本
    res.content #响应体的二进制数据,一般是用来获取响应对象中的文件、图片,视频二进制数据
    res.status_code #响应状态码
    res.headers  #响应头
    res.cookies  # 获取cookie
    res.cookies.get_dict()  #将cookie转成字店
    res.cookies.items()   #将cookie数据转化成key,value形式
    res.url  #获取请求的url
    res.history  #放重定向之前的地址
    res.encoding  #响应的编码方式
    res.iter_content()  # 获取图片,视频,大文件数据,循环取出
    for line in res.iter_content():
        f.write(line)
    '''
    注意:如果遇到打印出来出现乱码,可以用一下两个方法解决:
    方法1:
    res.encoding='gb2312'
    方法2:
    res.encoding=res.apparent_encoding
    '''

    json数据解析

    import json
    res.json()
    #等价于
    json.loads(res.text)

    四、requests的高级用法

    1、证书验证问题

    # SLL证书的验证问题
    # 方法1:verify设置为false,忽略对SLL证书的验证
    respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,但是会有警告
    #方法2:
    from requests.packages import urllib3
    urllib3.disable_warnings() #关闭警告
    respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,也没有警告
    # 方法3:添加证书
    respone=requests.get('https://www.12306.cn',
                         cert=('/path/server.crt',
                               '/path/key'))

    2、设置代理

    response=requests.get('http://127.0.0.1:8000/index',proxies={'http':'代理ip:port','https':})
    '''
     高匿和透明代理::高匿代理,后端无论如何拿不到你的ip,透明代理,后端能够拿到你的ip
     还可以用代理池,每次请求都随机从代理池中取一个
     后端拿到透明代理的ip方法,  后端取参数:X-Forwarded-For
    '''

    3、超时设置:

    timeout=0.1  #代表接收数据超时时间 ,float类型超时
    timeout=(0.1,0.2) # 第一个参数0.1代表连接超时,第二个参数代表数据接收超时,tuple类型超时
    res=requests.get('http://www.baidu.com',timeout=timeout)

    4、上传文件

    res=requests.post('http:127.0.0.1:8000/index',files={'myfile':open('xx.jpg','rb')})

    5、其他设置

    #  认证设置(你见不到了)
    import requests
    r=requests.get('xxx',auth=('user','password'))
    print(r.status_code)
    
    
    # 异常处理
    import requests
    from requests.exceptions import * #可以查看requests.exceptions获取异常类型
    
    try:
         r=requests.get('http://www.baidu.com',timeout=0.00001)
    except ReadTimeout:
         print('===:')
    except Exception as e:
         print(e)
  • 相关阅读:
    CentOS8下安装mysql8
    Git使用
    《操作系统导论》读书笔记
    《Linux命令行大全》读书笔记
    Centos8 开机后显示 Activate the web console with: systemctl enable --now cockpit.socke
    numpy学习笔记
    CentOS8使用阿里源
    Python 面向对象
    matplotlib解决不显示中文问题
    MySQL基础第三课
  • 原文地址:https://www.cnblogs.com/nq31/p/14146712.html
Copyright © 2011-2022 走看看