Requests库简介

Requests 唯一的一个非转基因的 Python HTTP 库, 人类可以安全享用.Requests 允许你发送纯天然,植物饲养的 HTTP/1.1 请求, 无需手工劳动. 你不需要手动为 URL 添加查询字串, 也不需要对 POST 数据进行表单编码. Keep-alive 和 HTTP 连接池的功能是 100% 自动化的, 一切动力都来自于根植在 Requests 内部的 urllib3.

Requests库的安装

安装Requests库的最快也是最简单的方法是在shell上使用以下命令:
pip install requests
一般使用时直接import即可
import requests

Request库的get()方法

requests.get(url, **kwargs) 源代码

  • url : 拟获取界面的url链接.
  • **kwargs : 可选参数.
  • 返回 response类

例如:

1
2
>>> import requests
>>> r = requests.get('https://zzz5.xyz')

其中返回的Response对象的属性如下:

属性 描述
r.status_code HTTP请求的返回状态, 200表示连接成功, 404表示连接失败
r.text HTTP响应内容的字符串形式, 即, url对应的页面内容
r.encoding 从HTTP header中猜测的响应内容编码方式
r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
r.content HTTP响应内容的二进制形式
r.raise_for_status 如果状态不是200, 引发HTTPError异常

一般流程如下:

01

Requests库的异常处理

异常 描述
requests.ConnectionError 网络连接错误异常, 如DNS查询失败, 拒绝连接等
requests.HTTPError HTTP错误异常
requests.URLRequired URL缺失异常
requests.TooManyRedirects 超过最大重定向次数, 产生重定向异常
requests.ConnectTimeout 连接远程服务器超时异常
requests.Timeout 请求URL超时, 产生超时异常

Requests库方法

方法 说明
requests.request() 构造一个请求,支撑以下各方法的基础方法
requests.get() 获取HTML网页的主要方法,对应HTTP协议的GET
requests.head() 获取HTML网页头信息的方法,对应HTTP协议的HEAD
requests.post() 向HTML网页提交POST请求的方法,对应HTTP协议的POST
requests.put() 向HTML网页提交PUT请求的方法,对应HTTP协议的PUT
requests.patch() 向HTML网页提交局部修改,对应HTTP协议的PATCH
requests.delete() 向HTML网页提交删除请求的方法,对应HTTP协议的DELETE

HTTP请求方法:
根据HTTP标准,HTTP请求可以使用多种请求方法。

方法 说明
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的响应报告, 即获取该资源的头部信息
POST 请求向URL位置的资源后附加新的的数据
PUT 请求向URL位置储存一个资源, 覆盖原URL位置的资源
PATCH 请求局部更新URL位置的资源, 即改变该处资源的部分内容
DELETE 请求删除URL位置的资源, 即改变该处资源的部分内容
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS 允许客户端查看服务器的性能
TRACE 回显服务器收到的请求, 主要用于测试或诊断

图灵智能聊天机器人api为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
import json

data = {"reqType": 0,
"perception": {
"inputText":
{"text": "你好啊"}
},
"userInfo": {
"apiKey": "b3b72c45c1a342dc9e920e285edfd648",
"userId": "zzZ5"
}
}
json = json.dumps(data)
print("发送请求 : ", json, '\n')
r = requests.post("http://openapi.tuling123.com/openapi/api/v2", data=json)
print("接收数据 : ", r.json(), '\n')

输出结果:

1
2
3
发送请求 : {"reqType": 0, "perception": {"inputText": {"text": "\u4f60\u597d\u554a"}}, "userInfo": {"apiKey": "b3b72c45c1a342dc9e920e285edfd648", "userId": "zzZ5"}}

接收数据 : {"emotion":{"robotEmotion":{"a":0,"d":0,"emotionId":0,"p":0},"userEmotion":{"a":0,"d":0,"emotionId":10300,"p":0}},"intent":{"actionName":"","code":10004,"intentName":""},"results":[{"groupType":1,"resultType":"text","values":{"text":"你好呀,见到你很开心呀。"}}]}

再以获取b站用户信息为例:

1
2
3
4
>>>import requests
>>>r = requests.get('https://api.bilibili.com/x/web-interface/card?mid=11657777')
>>>print(r.json())
{'code': 0, 'message': '0', 'ttl': 1, 'data': {'card': {'mid': '11657777', 'name': 'zzZ再睡五分钟', 'approve': False, 'sex': '保密', 'rank': '10000', 'face': 'http://i0.hdslb.com/bfs/face/af6a3ee49f1bf050f73e96b1e8af2bf0199b8f22.jpg', 'DisplayRank': '0', 'regtime': 0, 'spacesta': 0, 'birthday': '', 'place': '', 'description': '', 'article': 0, 'attentions': [], 'fans': 85, 'friend': 212, 'attention': 212, 'sign': '个人网站: www.zzZ5.xyz 考研考研考研!!!!!', 'level_info': {'current_level': 5, 'current_min': 0, 'current_exp': 0, 'next_exp': 0}, 'pendant': {'pid': 0, 'name': '', 'image': '', 'expire': 0}, 'nameplate': {'nid': 61, 'name': '饭圈楷模', 'image': 'http://i2.hdslb.com/bfs/face/5a90f715451325c642a6ac39e01195cb6d075734.png', 'image_small': 'http://i0.hdslb.com/bfs/face/5bfc1b4fb3f4b411495dddb0b2127ad80f6fbcac.png', 'level': '普通勋章', 'condition': '当前持有粉丝勋章最高等级>=10级'}, 'Official': {'role': 0, 'title': '', 'desc': ''}, 'official_verify': {'type': -1, 'desc': ''}, 'vip': {'vipType': 2, 'dueRemark': '', 'accessStatus': 0, 'vipStatus': 1, 'vipStatusWarn': '', 'theme_type': 0}}, 'following': False, 'archive_count': 1, 'article_count': 0, 'follower': 85}}

Requests库主要方法解析

requests.request(method, url, **kwargs) 源代码

  • method : 请求方式, 对应’GET’/‘HEAD’/‘POST’/‘PUT’/‘PATCH’/‘delete’/‘OPTIONS’ 7种方式.
  • url : 拟获取界面的url链接.
  • **kwargs : 可选参数.

其中**kwargs :

  • params : 字典或字节序列, 作为参数增加到url中.
    如 :
1
2
3
4
>>> par = {'highlight': 'Request'}
>>> r = requests.request('GET', 'https://2.python-requests.org//zh_CN/latest/index.html', params=par)
>>> print(r.url)
https://2.python-requests.org//zh_CN/latest/index.html?highlight=Request
  • data : 字典, 字节序列或文件对象, 作为Request的内容.
  • json : JSON格式的数据, 作为Request的内容.
  • headers : 字典, HTTP定制头.
  • cookies : 字典或CookiesJar, Request中的cookie.
  • auth : 元组, 支持HTTP认证功能.
  • files : 字典类型, 传输文件.
  • timeout : 设定超时时间, 秒为单位.
  • proxie : 字典类型, 设定访问代理服务器, 可以增加登录认证.
  • allow_redirects : True/False, 默认为True, 重新定向开关.
  • stream : True/False, 默认为True, 获取内容立即下载开关.
  • verify : True/False, 默认为True, 认证SSL证书开关.
  • cert : 本地SSL证书路径.

例如: 百度/必应搜索关键词提交
百度搜索: https://www.baidu.com/s?wd=keyword
必应搜索: https://cn.bing.com/search?q=keyword

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> import requests
>>> par_baidu = {'wd': 'requests'}
>>> par_bing = {'q': 'requests'}
>>> url_baidu = 'https://www.baidu.com/s'
>>> url_bing = 'https://cn.bing.com/search'
>>> r = requests.request('GET', url_baidu, params=par_baidu)
>>> r.status_code
200
>>> r.request.url
'https://www.baidu.com/s?wd=requests'
>>> r = requests.request('GET', url_bing, params=par_bing)
>>> r.status_code
200
>>> r.request.url
'https://cn.bing.com/search?q=requests'

robots.txt文件

robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件, 它通常告诉网络搜索引擎的爬虫, 此网站中的哪些内容是不应被搜索引擎的爬虫获取的, 哪些是可以被爬虫获取的. 因为一些系统中的URL是大小写敏感的, 所以robots.txt的文件名应统一为小写. robots.txt应放置于网站的根目录下.
robots.txt协议并不是一个规范, 而只是约定俗成的, 所以并不能保证网站的隐私. 注意robots.txt是用字符串比较来确定是否获取URL,所以目录末尾有与没有斜杠”/“表示的是不同的URL. robots.txt允许使用类似”Disallow: *.gif”这样的通配符.

允许所有的爬虫:

1
2
User-agent: *
Disallow:

另一写法:

1
2
User-agent: *
Allow:/

仅允许特定的爬虫:(name_spider用真实名字代替):

1
2
User-agent: name_spider
Allow:

拦截所有的爬虫:

1
2
User-agent: *
Disallow: /

禁止所有爬虫访问特定目录:

1
2
3
4
5
User-agent: *
Disallow: /cgi-bin/
Disallow: /images/
Disallow: /tmp/
Disallow: /private/

仅禁止坏爬虫访问特定目录(BadBot用真实的名字代替):

1
2
User-agent: BadBot
Disallow: /private/

禁止所有爬虫访问特定文件类型:

1
2
3
4
5
User-agent: *
Disallow: /*.php$
Disallow: /*.js$
Disallow: /*.inc$
Disallow: /*.css$