zoukankan      html  css  js  c++  java
  • Requests请求方式:Get与Post

    为什么要学习requests,而不是urllib?

    1.requests的底层实现就是urllib。

    2.requests在python2和python3中通用,方法完全一样。

    3.requests简单易用。

    4.requests能够自动帮我们解压(gzip压缩等)网页内容。

    在写爬虫的过程中,一定要养成一个好习惯,学会模拟浏览器的User-Agent。

    如果不去模拟的话,以Python作为User-Agent去访问,会受到条件的限制。

    import requests

    #为什么请求访问要带上headers,目的是模拟欺骗浏览器,获取完整的内容
    headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6814.400 QQBrowser/10.3.3005.400"
    }
    response=requests.get("http://www.baidu.com",headers=headers)

    #status_code,获取响应码的值
    a=response.status_code
    #获取响应报头
    b=response.headers
    #显示出访问的url
    c=response.url
    #获取请求报头的User-Agent
    d=response.request.headers
    #显示百度源码内容,转换为unicode编码的形式显现
    e=response.content.decode()
    print(a)
    print(b)
    print(c)
    print(d)
    print(e)
    输出结果:
    a:

    200

    b:
    {'Bdpagetype': '1', 'Bdqid': '0xd1d3ed49000252f7', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+cd213ce012eb7ff371aed51597a8d28c', 'Date': 'Mon, 07 Jan 2019 13:17:46 GMT', 'Expires': 'Mon, 07 Jan 2019 13:17:17 GMT', 'Server': 'BWS/1.1', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com, BDSVRTM=0; path=/, BD_HOME=0; path=/, H_PS_PSSID=1425_21121_28206_28131_26350_28266_28140; path=/; domain=.baidu.com', 'Strict-Transport-Security': 'max-age=172800', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked'}

    c:
    https://www.baidu.com/

    d:
    {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6814.400 QQBrowser/10.3.3005.400', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'BAIDUID=5F37B2B9D539422C5A3B8738B2D77CAE:FG=1; BIDUPSID=5F37B2B9D539422C5A3B8738B2D77CAE; PSTM=1546867066; BD_LAST_QID=16822138656381887118'}

    e:
    (百度源码,省略)

    接下来就讲一下Get请求方式:

    从服务器获取数据,最常见的一种请求方式,Get方式用于在url地址中添加一些参数完成访问。

    公式:requests.get(url,headers=?,params=?,**kwargs),其中params是传递的参数,以字典的形式。

    import requests

    headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6814.400 QQBrowser/10.3.3005.400"
    }

    #请求参数是字典形式,搜索=wd
    p={"wd":"莫欺少年穷"}
    url="https://www.baidu.com/s?"
    a=requests.get(url,headers=headers,params=p)
    b=a.request.url
    print(b)
    # 输出结果:'https://www.baidu.com/s?wd=%E8%8E%AB%E6%AC%BA%E5%B0%91%E5%B9%B4%E7%A9%B7'
    #结果是url的显示形态,如果要翻译,去网上url编码翻译,等于号后面的内容等于莫欺少年穷

    url_1="https://www.baidu.com/s?wd={}".format("莫欺少年穷")
    c=requests.get(url_1,headers=headers)
    d=c.request.url
    print(d)
    # 输出结果是一样的,这是另外一种传递参数的方法。
    #format()的作用等同于字符串格式化
    #例子:莫欺{}少年穷.format(bbb) 输出结果:莫欺bbb少年穷
    输出结果:

    https://www.baidu.com/s?wd=%E8%8E%AB%E6%AC%BA%E5%B0%91%E5%B9%B4%E7%A9%B7
    https://www.baidu.com/s?wd=%E8%8E%AB%E6%AC%BA%E5%B0%91%E5%B9%B4%E7%A9%B7

    Post请求方式:

    向服务器传送数据,POST请求参数在请求体中,消息长度没有限制且以隐式的方式进行发送。

    在这儿,我们将百度翻译小案例来结合起来进行理解。

    公式:requests.post(url,data=?,headers=?,json=?,**kwargs),data是需要传递进去的参数,同样是以参数的形式传递。

    所以看到公式,我们寻找的目标自然是data参数了,get的请求方式是在url上显示,但post的请求方式却隐藏在请求中。

    我们在主体网页中,并没有发现有效的data字典参数,所以我们要往下寻找其他基础板块。

    我们找到了要找的一个目标,在v2transapi中发现了一个有效的DATA字典参数,这个时候我们需要检查参数的可用性,

    确保后续翻译功能的完美实现,为了验证唯一性,我将换一句话翻译:

    我们可以发现,sign发生了改变,并非唯一性参数,说明这个data字典参数并不适合。

    为了解决这个问题,我们将操作系统从windows电脑切换到ipone X手机,然后继续寻找data参数:

    我们惊喜地发现,这个时候data参数具备了唯一性,是在basetrans文件里寻找到的。

    所以我们就从这个iponeX操作系统中获取到需要的参数,完成翻译功能。

    于是有了url地址,data字典,以及必要的json转换(将json文本转换为Python文本),代码就生成了:

    import requests
    import json

    aa=input("请输入你要翻译的汉字:")
    url="https://fanyi.baidu.com/basetrans"
    headers={"User-Agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1"}
    post_data={
        "query":aa,
         "from":"zh",
         "to":"en"
    }
    response=requests.post(url,data=post_data,headers=headers)
    a=response.content.decode()  #将内容转换成unicode编码形式
    a=json.loads(a)                        #再把内容从json文本转换为python文本
    a=a['trans'][0]['dst']                   #对翻译结果进行一个数据提炼
    print(a)

    输出结果(加粗的部分为键入的内容):

    请输入你要翻译的汉字:大家吃晚饭了吗
    Have you had dinner yet?

     这样,我们就完成了对百度翻译的爬虫,并爬来翻译功能进行使用。

    建议大家多去看看相关的资料,彻底理解一下Get与Post的两种请求方式。

     

  • 相关阅读:
    NotFoundHttpException
    postMan
    Extjs win
    Extjs toolbar 如何添加竖杆分隔符
    Extjs iconCls 的用法
    b站Java基本语法4之进制转换
    b站Java基本语法4之基本数据类型的运算规则
    b站数据库课2之连接查询
    b站Java尚硅谷0
    b站数据库课1之分组函数分组查询
  • 原文地址:https://www.cnblogs.com/Masterpaopao/p/10235997.html
Copyright © 2011-2022 走看看