Requests请求方式:Get与Post

允我心安 提交于 2020-04-03 04:15:09

为什么要学习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的两种请求方式。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!