request

发布时间 2023-03-22 21:11:19作者: minormi

requests库

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

安装Requests库

命令行安装:pip install requests

导入模块:import requests

简单使用

>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code#200代表请求成功
200
>>> r.headers['content-type']
'application/json; charset=utf8'#编码为ISO-8859-1不支持编译中文,需要设置 r = encoding="utf-8"
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}

各种请求方式

import requests
requests.post('http://httpbin.org/post')
requests.put('http://httpbin.org/put')
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')

GET: 请求指定的页面信息,并返回实体主体。

url="https://www.bilibili.com/"
rs=requests.get(url)#get方法下载
print(rs.status_code,rs.encoding)

传递url参数

为url的查询字符串(query string)传递某种数据,手工构建 URL,那么数据会以键/值对的形式置于 URL 中,跟在一个问号的后面。https://space.bilibili.com/1437582453https://space.bilibili.com/1437582453?spm_id_from=333.337.0.0

import requests
url="https://space.bilibili.com/1437582453"
payload={"spm_id_from":"333.337.0.0"}
rs=requests.get(url)
print(rs.url)
rs=requests.get(url,payload)
print(rs.url)

注意字典里值为 None 的键都不会被添加到 URL 的查询字符串里。

你还可以将一个列表作为值传入:'key2': ['value2', 'value3']一对多

Json响应内容

>>> import requests
>>> r = requests.get('https://api.github.com/events')
>>> r.json()
[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...

HEAD: 只请求页面的首部。

获取HTML网页投信息的方法,对应HTTP的HEAD

POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。

如果你想为请求添加 HTTP 头部,只要简单地传递一个 dictheaders 参数就可以了

(字典结构)

>>> url = 'https://api.github.com/some/endpoint'
>>> headers = {'user-agent': 'my-app/0.0.1'}
>>> r = requests.get(url, headers=headers)

想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:

>>> payload = {'key1': 'value1', 'key2': 'value2'}

>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print(r.text)
{
  ...
  "form": {
    "key2": "value2",
    "key1": "value1"
  },
  ...
}

PUT: 从客户端向服务器传送的数据取代指定的文档的内容。

DELETE: 请求服务器删除指定的页面。

get 和 post比较常见 GET请求将提交的数据放置在HTTP请求协议头中;POST提交的数据则放在实体数据中

爬取网页的通用框架

import requests
def getHTMLText(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "产生异常"

if __name__ == "__main__":
    url = "http://www.baidu.com"
    print(getHTMLText(url))

raise_for_status()方法
理解Response类非常重要,Response这样的一个对象返回了所有的网页内容,那么它也提供了一个方法,叫raise_for_status(),这个方法是专门与异常打交道的方法,该方法有这样一个有趣的功能,它能够判断返回的Response类型状态是不是200。如果是200,他将表示返回的内容是正确的,如果不是200,他就会产生一个HttpError的异常。