Python spider入门_3 Requests 库

0 引言

Requests 库相当简单,你很快就能学完!

参考网站:Python requests 模块 | 菜鸟教程 (runoob.com)

使用 Requests 库前你要先导入 requests 模块:

import requests

导入后就可以发送 HTTP 请求,使用 requests 提供的方法可以向指定 URL 发送 HTTP 请求,例如:

1
2
3
4
5
6
7
8
# 导入 requests 包
import requests

# 发送请求
x = requests.get('https://www.runoob.com/')

# 返回网页内容
print(x.text)

1 响应信息

每次调用 requests 请求后,会返回一个 response 对象,该对象包含具体的响应信息,如状态码,响应头,响应内容等:

1
2
3
print(response.status_code)  # 获取响应状态码
print(response.headers) # 获取响应头
print(response.content) # 获取响应内容

更多响应信息如下:

属性或方法 说明
apparent_encoding 编码方式
close() 关闭于服务器的连接
content 返回响应的内容,以字节为单位
cookies 返回一个 CookieJar 对象,包含了从服务器发回的 cookie
elapsed 返回一个 timedelta 对象,包含了从发送请求到响应到达之间经过的时间量,可以用于测试响应速度。比如 r.elapsed.microseconds 表示响应到达需要多少微秒。
encoding 解码 r.text 的编码方式
headers 返回响应头,字典格式
history 返回包含请求历史的响应对象列表(url)
is_permanent_redirect 如果响应是永久重定向的 url,则返回 True,否则返回 False
is_redirect 如果响应被重定向,则返回 True,否则返回 False
iter_content() 迭代响应
iter_lines() 迭代响应的行
json() 返回结果的 JSON 对象(结果需要以 JSON 格式编写的,否则会引发错误)
links 返回响应的解析头链接
next 返回重定向链中下一个请求的 PreparedRequest 对象
ok 检查 “status_code” 的值,如果小于 400,则返回 True,如果不小于 400,则返回 False
raise_for_status() 如果发生错误,方法返回一个 HTTPError 对象
reason 响应状态的描述,比如 “Not Found” 或 “OK”
request 返回请求此响应的请求对象
status_code 返回 http 的状态码,比如 404 和 200(200 是 OK,404 是 Not Found)
text 返回响应的内容,unicode 类型数据
url 返回响应的 URL

一个具体的例子:

1
2
3
4
5
6
7
8
9
10
import requests

# 发送请求
x = requests.get('https://www.runoob.com/try/ajax/json_demo.json')

print(x.url) # 获取响应的url
print(x.status_code) # 获取响应状态码
print(x.reason) # 获取响应头
print(x.ok) # 获取响应内容
print(x.apparent_encoding) # 返回编码
1
2
3
4
5
https://www.runoob.com/try/ajax/json_demo.json
200
OK
True
utf-8

请求 json 数据文件,返回 json 内容:

1
2
3
4
5
6
7
8
# 导入 requests 包
import requests

# 发送请求
x = requests.get('https://www.runoob.com/try/ajax/json_demo.json')

print(x.json)
print(x.json())
1
2
<bound method Response.json of <Response [200]>>
{'name': '网站', 'num': 3, 'sites': [{'name': 'Google', 'info': ['Android', 'Google 搜索', 'Google 翻译']}, {'name': 'Runoob', 'info': ['菜鸟教程', '菜鸟工具', '菜鸟微信']}, {'name': 'Taobao', 'info': ['淘宝', '网购']}]}

2 requests 方法

requests 方法如下表:

方法 描述
delete(url, args) 发送 DELETE 请求到指定 url
get(url, params, args) 发送 GET 请求到指定 url
head(url, args) 发送 HEAD 请求到指定 url
patch(url, data, args) 发送 PATCH 请求到指定 url
post(url, data, json, args) 发送 POST 请求到指定 url
put(url, data, json, args) 发送 PUT 请求到指定 url
request(method, url, args) 向指定的 url 发送指定的请求方法

例子:

1
2
3
4
5
6
7
# 导入 requests 包
import requests

# 发送请求
x = requests.request('get','https://www.runoob.com/try/ajax/json_demo.json')

print(x.status_code)
1
200

设置请求头的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 导入 requests 包
import requests

kw = {'s': 'python 教程'}

# 设置请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/54.0.2840.99 Safari/537.36"
}

# params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
response = requests.get("https://www.runoob.com/", params=kw, headers=headers)

# 查看响应状态码
print(response.status_code)

# 查看响应头部字符编码
print(response.encoding)

# 查看完整url地址
print(response.url)

# 查看响应内容,response.text 返回的是Unicode格式的数据
# print(response.text) # 太长了,自己动手试试吧
1
2
3
200
UTF-8
https://www.runoob.com/?s=python+%E6%95%99%E7%A8%8B

3 附加请求参数

发送请求我们可以在请求中附加额外的参数,例如请求头,查询参数,请求体等

例如:

1
2
3
4
headers = {'User-Agent': 'Mozilla/5.0'}  # 设置请求头
params = {'key1': 'value1', 'key2': 'value2'} # 设置查询参数
data = {'username': 'example', 'password': '123456'} # 设置请求体
response = requests.post('https://www.runoob.com', headers=headers, params=params, data=data)

上述代码发送一个 POST 请求,并附加了请求头、查询参数和请求体

除了基本的 GET 和 POST 请求外,requests 还支持其他 HTTP 方法,如 PUT、DELETE、HEAD、OPTIONS 等