爬虫基础(4)发送请求之requests库的使用

一. 什么是Requests库

Requests 库是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库。它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求。

可以说Requests最大的特性就是其风格的简单直接优雅。无论是请求方法,还是响应结果的处理,还有cookies,url参数,post提交数据,都体现出了这种风格。

Requests目前基本完全满足web请求的所有需求,以下是Requests的特性:

  • Keep-Alive & 连接池
  • 国际化域名和 URL
  • 带持久 Cookie 的会话
  • 浏览器式的 SSL 认证
  • 自动内容解码
  • 基本/摘要式的身份认证
  • 优雅的 key/value Cookie
  • 自动解压
  • Unicode 响应体
  • HTTP(S) 代理支持
  • 文件分块上传
  • 流下载
  • 连接超时
  • 分块请求
  • 支持 .netrc

Request库的官方文档:https://requests.readthedocs.io/zh_CN/latest/

二. 安装Requests库

requests 库能通过 pip 来安装:

$ python -m pip install requests
或者
$pip install requests

你也可以在github上下载最新的源码,解压之后进入目录进行安装:

$git clone git:https://github.com/psf/requests.git

$python setup.py install

三. Requests库的基本应用

(一)发送请求

1. 实例引入

urllib 库中的 urlopen() 方法实际上是以GET方式请求网页,而 requests 中相应的方法就是 get()方法。下面通过实例来看一下:

import requests

response = requests.get('http://www.baidu.com/')
print(type(response))
print(type(response.text))
print(type(response.cookies))

# 运行结果:
<class 'requests.models.Response'>
<class 'str'>
<class 'requests.cookies.RequestsCookieJar'>

这里我们调用 get() 方法实现与 urlopen() 相同的操作,得到一个 response 对象,然后分别输出 Response 的类型、响应体的类型以及Cookies的类型。

通过运行结果可以发现,它的返回类型是 requests.models.Response ,响应体的类型是字符串 str,Cookies 的类型是 RequestsCookieJar

当然,除了get()方法,还有post()、put()、delete()等请求方法:

r = requests.post('http://httpbin.org/post’) 
r = requests.put(’http://httpbin.org/put’) 
r = requests.delete('http://httpbin.org/delete') 
r = requests.head (’http://httpbin.org/get’) 
r = requests.options(’http://httpbin.org/get')
2. GET请求

HTT 中最常见的请求之一就是 GET 请求,下面我们详细了解一下利用 requests 构建 GET 请求的方法。

在构建GET请求之前,我们要了解get()方法的调用格式:

requests.get(url, params=None, **kwargs):

该方法有三个参数:

  • url:必选参数,该参数指定了发送请求的目标URL
  • params:可选参数,它是发送请求时传递给Request对象的参数,其数据类型可以是字典、列表、元组或者字节型数据
  • **kwargs:可选参数
(1)最基本的GET请求

首先,构建一个最简单的 GET 请求,请求的链接为 /httpbin.org/ ,该 网会判断如果客户端发起的是 GET 请求的话,它返回相应的请求信息:

import requests
 
response = requests.get('http://httpbin.org/get')
print(response.text)

# 运行结果:
{
   
  "args": {
   }, 
  "headers": {
   
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.24.0", 
    "X-Amzn-Trace-Id": "Root=1-5f60973e-1787830a4f06ee8a3dec1d86"
  }, 
  "origin": "221.207.18.109", 
  "url": "http://httpbin.org/get"
}

可以发现,我们成功发起了 GET 请求,返回结果中包含请求头、URL 和 IP 等信息。

(2)带参数的GET请求

对于 GET 请求,如果要附加额外的信息,一般怎样添加呢?比如现在想添加两个参数,其中 name=germey,age=22:

import requests

data = {
   
    'name':'germey',
    'age':22
}
response = requests.get("http://httpbin.org/get", params=data)
print(response.text)

# 运行结果:
{
   
  "args": {
   
    "age": "22", 
    "name": "germey"
  }, 
  "headers": {
   
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.24.0", 
    "X-Amzn-Trace-Id": "Root=1-5f6098ac-247285d09016a318f68ecbb0"
  }, 
  "origin": "221.207.18.109", 
  "url": "http://httpbin.org/get?name=germey&age=22"
}

通过运行结果可以判断,请求的链接自动被构造成了:http://httpbin.org/get?name=germey&age=22。当然,我们也可以直接将参数放到请求URL中发送请求:

response = requests.get("http://httpbin.org/get?name=germey&age=22")
(3)解析JSON

响应体的类型实际上是 str 类型,但是它很特殊,是 JSON 格式的数据。所以,如果想直接解析返回结果,得到一个字典格式的话,可以直接调用 json() 方法,示例如下:

import requests
import json
 
response = requests.get("http://httpbin.org/get")
print(type(response.text))
print(response.json())
print(type(response.json()))

# 运行结果:
<class 'str'>
{
   'args': {
   }, 'headers': {
   'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.24.0', 'X-Amzn-Trace-Id': 'Root=1-5f609a2f-86ba9d38d21e0034d01fcebc'}, 'origin': '221.207.18.109', 'url': 'http://httpbin.org/get'}
<class 'dict'>

可以发现,调用 json() 方法,就可以将返回结果是 JSON 格式的字符串转化为字典。或者是用json.loads()也可以将 JSON 格式的返回结果转换为字典格式:

import requests
import json
 
response = requests.get("http://httpbin.org/get")
res_dict = json.loads(response.text)
print(type(res_dict))
print(res_dict)

# 运行结果:
<class 'dict'>
{
   'args': {
   }, 'headers': {
   'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.24.0', 'X-Amzn-Trace-Id': 'Root=1-5f609cce-0bcd2d0ee79f7a4f3b9f4a9c'}, 'origin': '221.207.18.109', 'url': 'http://httpbin.org/get'}
(4)抓取二进制数据

如果想抓取图片、音频、 视频等文件,应该怎么办呢?图片、音频、视频这些文件本质上都是由二进制码组成的,由于有特定的保存格式和对应的解析方式, 我们才可以看到这些形形色色的多媒体。所以,想要抓取它们,就要拿到它们的二进制码。下面以 GitHub 站点图标为例来看一下:

import requests
 
response = requests.get("https://github.com/favicon.ico")
print(type(response.text), type(response.content))
print(response.text)
print(response.content)

# 运行结果:
<class 'str'> <class 'bytes'>
# response.text的运行内容略
b'\x00\x00\x01\x00\x02\x00\x10\x10\x00\x00\x01\x00......''

从运行结果我们可以发现,text的内容在打印时发生了乱码,而content的内容以二进制码打印显示。

然后,我们将刚刚爬取的图片保存到本地:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值