博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Requests请求方式:Get与Post
阅读量:4448 次
发布时间:2019-06-07

本文共 4093 字,大约阅读时间需要 13 分钟。

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

 

转载于:https://www.cnblogs.com/Masterpaopao/p/10235997.html

你可能感兴趣的文章
B1232 [Usaco2008Nov]安慰奶牛cheer 最小生成树
查看>>
使用 git push 出现error setting certificate verify locations问题记录
查看>>
真没想到VB也可以这样用之指针技术 --不详,向作者致敬  ,转
查看>>
2、在1.VMware虚拟机上安装ubantu系统
查看>>
vue
查看>>
用 eric6 与 PyQt5 实现python的极速GUI编程(系列01)--Hello world!
查看>>
java--线程的睡眠sleep()
查看>>
Python3.x:定时获取页面数据存入数据库
查看>>
洛谷 P1290 欧几里德的游戏 题解
查看>>
python 归纳 (十三)_队列Queue在多线程中使用
查看>>
idea管理tomcat
查看>>
System.Activator类
查看>>
ssis包
查看>>
Python的静态方法和类成员方法 分类: python基础学习 ...
查看>>
黑马程序员_java基础笔记(01)...java的环境搭建
查看>>
oracle创建表空间并对用户赋权
查看>>
seajs-require使用示例
查看>>
MediaElement视频控制:播放、暂停、停止、后退、快进、跳转、音量
查看>>
linux中vi编辑器的练习
查看>>
零基础学Java——Java概述
查看>>