1、什么是Requests?
Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库。
它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。
一句话---Python实现的简单易用的HTTP库。
1.1基本用法
安装Requests
pip3 install requests
#各种请求方式:常用的就是requests.get()和requests.post() >>> import requests >>> r = requests.get('https://api.github.com/events') >>> r = requests.post('http://httpbin.org/post', data = {'key':'value'}) >>> r = requests.put('http://httpbin.org/put', data = {'key':'value'}) >>> r = requests.delete('http://httpbin.org/delete') >>> r = requests.head('http://httpbin.org/get') >>> r = requests.options('http://httpbin.org/get')
1.3 GET 请求
首先,构建一个最简单的GET请求,请求的链接为http://httpbin.org/get,该网站会判断如果客户端发起的是GET 请求的话,他返回相应的请求信息:
import requests r = requests.get('http://httpbin.org/get') print(r.text)
可以发现,我们成功发起了GET请求,返回结果中包含请求头,URL,IP等信息。
那么,对于GET 请求,如果要附加额外的信息,一般怎么添加呢?比如现在想添加两个参数,其中name是germery,age是22.哟构造这个请求链接,是不是可以直接写成:
r = requests.get('http://httpbin.org/get?name=germery&age=22')
这样也可以,但是一般情况下,这种信息数据会用字典来存储。那么怎么构造这个链接呢?---->利用params这个参数就好了,示例如下:
import requests data = { 'name':'germary', 'age':22 } r = requests.get('http://httpbin.org/get',params=data) print(r.text)
通过运行结果可以判断,请求的链接自动被构成了:http://httpbin.org/get?name=germery&age=22。
另外,网页的返回类型实际上是str类型,但是他很特殊,是JSON格式的。所以,如果想直接解析返回结果,得到一个字典格式的话,可以直接调用json()方法,示例如下:
import requests r = requests.get('http://httpbin.org/get') print(type(r.text)) print(r.json()) print(type(r.json()))
可以发现,调用json()方法,就可以将返回结果是JSON格式的字符串转化为字典。
但需要注意的是,如果返回的结果不是JSON 格式,便会出现解析错误,抛出json.decoder.JSONDecoderError异常。
抓取网页
上面的请求链接返回的是JSON形式的字符串,那么如果请求普通的网页,则肯定能获得相应的内容了。下面以‘’知乎‘’----->‘’发现‘’页面为例来看一下:
import requests import re headers = { 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/72.0.3626.121 Safari/537.36' } r = requests.get('https://www.zhihu.com/explore',headers=headers) pattern = re.compile('explore-feed.*?question_link.*?>(.*?)</a>',re.S) titles = re.findall(pattern,r.text) print(titles)
这里我们加入headers信息,其中包含了User-Agent字段信息,也就是浏览器标识信息。如果不加这个,知乎会禁止抓取。
接下来我们用到了最基础的正则表达式来匹配出所有的问题内容。关于正则表达式的内容我会单独写篇博客,这里作为实例来配合讲解。
运行结果如下:
['\n如何进行完备而高效的法律检索?\n', '\n怎样用C语言画出一个佛祖?\n', '\n捡到狗是什么体验?\n', '\n为什么男生追到一半就不追了?\n', '\n野比大雄为什么被称为野比海皇,具体有哪些事迹?\n', '\n人的努力可以有多可怕?\n', '\n你遇到过最有教养的人是什么样的?\n', '\n欧美有没有中国当代作家的书卖的很好,任何行业的都行?\n', '\n德云社的哪个演员最会说话/双商高?\n', '\n为什么路飞的船停在码头敌人都不会破坏船呢?\n']
我们发现,这里成功的提取出了所有的问题内容。
抓取二进制数据
在上面的例子中,我们抓取的是知乎的一个页面,实际上他返回的是一个HTML文档。如果想要抓取图片、音频、视频、等文件,应该怎么办呢?
图片、音频、视频这些文件本质上都是有二进制码组成的,由于有特定的保存格式和对应的解析方式,我们才可以看到这些形形色色的多媒体。所以,想要抓取他们,就要拿到他们的二进制码。
下面以GitHub的站点图标为例来看一下:
import requests response = requests.get('https://github.com/favicon.ico') print(response.text) print(response.content)
这里抓取的内容是站点图标,也就是浏览器在每一个标签上的小图标,如下图所示
这里打印了Response对象的两个属性,一个是text,一个是content。
运行结果如下图所示,其中前两行是response.text的结果,最后一行是response.content的结果。
可以注意到的,前者出现了乱码,后者结果前带了一个b,这代表是bytes类型的数据。由于图片是二进制数据,所以前者在打印是转化为str类型,也就是图片直接转化为字符串,这理所当然会出现乱码。
接着,我们将刚才的提取到的图片保存下来:
import requests response = requests.get('https://github.com/favicon.ico') with open('favicon.ico','wb')as f: f.write(response.content)
这里用了open()方法,他的第一个参数是文件名称,第二个参数以二进制写的形式打开,可以向文件里写入二进制数据。
运行结束之后,可以发现在文件夹中出现了名为favicon.ico的图标,如图:
同样的,音频和视频文件也可以用这种方式获取。
添加headers
与urllib.request一样,我们也可以通过headers参数来传递头信息。
比如,在上面‘’知乎‘’的例子中,如果不传递headers,就不能正常请求:
但是如果加上headers并加上User-Agent信息,那就没问题了:
当然,我们可以在headers这个参数中任意添加其他的字段信息。