SunCOOL
Requests是一个针对python的http库(可以理解为一个浏览器)该库无需安装,安装Python的时候已经自带。****利用它,一行代码就可以发送请求。
01发送请求
在网络请求中,GET,POST请求是浏览器与服务器交流的两种主要方式,你看到的每一一网页的背后是一系列由浏览器向服务器发送的GET/POST请求。
使用 Requests 发送网络请求非常简单。
一开始要导入 Requests 模块:
import requests
然后,尝试获取某个网页。本例子中,我们来获取 百度的主页:
r = requests.get('https://www.baidu.com/')
有请求必定有回复,现在我们有一个名为 r
的 Response
对象。我们可以从这个对象中获取所有我们想要的信息。我们已经向百度的服务器发送了一个GET请求怎么样?是不是很简单!
POST请求和GET请求一样简单但是,会比GET请求多一个步骤。顾名思义,POST即为发送,那么我们需要来定义发送的内容。这个内容的格式是一个字典。如在所示,字典的格式是用{}来包裹你需要向服务器来发送的参数,比如下面这个字典,里面有两个键值,每个键值都是一对。键就是下面的'key1'、'key2',值则是‘value1’,‘value2’。有了这个字典,那么我们就可进行POST请求了。ps:没有字典可以发送POST请求吗?可以,但是这样做没有意义。
data1 = {'key1':'value1','key2':'value2',}
r = requests.post('https://www.baidu.com/',data = data1)
另外,在HTTP定义的请求中还有其他 HTTP 请求类型:PUT,DELETE,HEAD 以及 OPTIONS .这些请求我们一般不会应用于爬虫。当然,或许在日后的某次编码中,你会用到他们,请自行学习。
02向GET请求中传递参数
我们刚才讲到,在发送POST请求时需要我们来定义一个字典,不然我们的POST请求是无意义的。那么GET请求可以向服务器发送特定的参数吗?
首先我们来看一张图片
批注 2019-08-15 210534.png这是使用百度搜索引擎来搜索关键词“百度”时返回的网页,我们可以看到在黄线标注的URL是很长的一串。?后面跟的是一串key=value格式的多干个键值对。所以GET请求也是可以向服务器来发送特定的参数的。
方法如下
data2 = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("https://www.baidu.com/",params=data2)
我们来使用r.url 来看一下我们带参数的GET请求
print(r.url)
#输出https://www.baidu.com/? key2=value2&key1=value1
我们的字典data2被添加到了URL中,这就是GET请求与POST请求的不同之处,POST请求所需要带的参数是不会被传入url中的,而GET请求则会。
03请求之后的响应
在我们向服务器发送请求后,服务器会根据你向服务器发送的内容来进行返回内容。刚才我们使用百度来搜索“百度”,在点击搜索后,服务器为我们返回了我们查找的内容,这就是一个响应。
import requests
r = requests.get('https://www.baidu.com/') #使用 .text方法我们可以来查看服务器返回的内容
print(r.text)
你将看到这样的内容
批注 2019-08-15 213109.png上面密密麻麻的地方就是我们在向http://www.baidu.com发送请求,服务器返回给我们的内容。
大多数时候,Requests会为我们来根据返回的数据的编码格式来进行自动解码,但是有些时候可能解码的结果会是显示一堆乱码,就像下图那样
批注 2019-08-15 214215.png那么我就需要来为我们的程序指定编码格式。
常见的编码格式有以下几种:
utf-8
GBK
gb2312
通过下面的方法来进行指定编码
r.encoding = 'utf-8'
这样我们就可以来访问经过正确解码的内容
04Requests访问图片
我们在浏览器中看到的不只是文本,还有音频视频图片,这些格式也是可以进行访问的,只是这些格式是以二进制的形式来进行传输的,所以我们是不能使用文字编码来进行解码的,我们平常看到的mp4、jpg,mp3后缀名的文件,这些其实是一种编码格式,也就是说后缀名为MP4那么这是一个视频文件,打开时会使用MP4的解码器来进行解码,其实文件内部还是使用二进制的数据来进行存储。你可以按照下图简单的理解。(具体过程往大佬指点)
批注 2019-08-15 220831.png编码器和解码器在python中我们无需担心,我要做的就是来获取一张图片的二进制数据,然后存储成我们想要的格式就行了。上文中使用了 .text来获取文本,获取二进制数据的方法则为 .content
r=requests.get('[](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1565888449736&di=fee8f4746a4cca39385184b61b4a106f&imgtype=0&src=http%3A%2F%2Fimg2.ph.126.net%2FJ3JHQOYyAV2xBU84epsR9w%3D%3D%2F4905545894214113834.jpg'))[https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1565888508096&di=39a4cb3e4e21e91a5a68f52432974669&imgtype=0&src=http%3A%2F%2Fimg2.ph.126.net%2FJ3JHQOYyAV2xBU84epsR9w%3D%3D%2F4905545894214113834.jpg](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1565888508096&di=39a4cb3e4e21e91a5a68f52432974669&imgtype=0&src=http%3A%2F%2Fimg2.ph.126.net%2FJ3JHQOYyAV2xBU84epsR9w%3D%3D%2F4905545894214113834.jpg)')
r1 = r.content
这个时候r1为二进制数据,我们下面把二进制数据进行存储
with open('1.jpg','wb') as f:
f.write(r1)
通过上面的方法,我们可以把我们获取的二进制数据,变成我们电脑是的一张文件名是1.jpg的图片。这里用到了python的open()函数,请自行学习。
05装成一个浏览器
我们是使用python来进行的请求数据,对方服务器会发现我们的请求来自于一个不是浏览器的程序,很可能就不会给我们返回内容,那么怎么对对方服务器进行欺骗?
首先,服务器是来根据我们请求的Headers中的User-Agent来进行判断我们是不是浏览器的。我们只要更改Headers中这一项的值,就可以达到欺骗浏览器的目的。
url='https://www.baidu.com'
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}
r = requests.get(url, headers=headers)
这样服务器会认为我们的请求来自于一个浏览器
user-agent
的值我们可以从哪些地方获得?
你可以打开自己的浏览器,访问任意一个网页,按F12,点击Network,你可以发现里面的值。
网友评论