Loading

request模块

request模块

使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)

1 安装模块

pip install requests

它支持各种请求方式,常用的就是requests.get()和requests.post()

2 发送GET请求

发送get请求很简单,传入url即可完成。

import requests # 导入模块
# 使用get方法请求url,会得到一个response对象
response = requests.get('https://www.baidu.com/') 

2.1 请求地址携带参数

如果想要在请求地址中添加参数(问号后的参数),比如www.baidu.com/?key=val,可以使用params

payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://www.baidu.com/', params=payload)
# https://www.baidu.com/?key2=value2&key1=value1

也可以传递一个列表

payload = {'key1': 'value1', 'key2': ['value2', 'value3']}

response = requests.get('https://www.baidu.com/', params=payload)
print(response.url)
# https://www.baidu.com/?key1=value1&key2=value2&key2=value3

推荐使用上述方式,如果不想用params,可以直接把参数就写在url字符串里,但是如果是中文,可能会出现编码问题。

# 我们想访问的是:'https://www.baidu.com/?wd=你好'
# 可能会被转码成:'https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD'
# params帮我们转码,而如果不使用,也可以自己转码
res = urlencode({'wd':'你好'},encoding='utf-8')
print(res)
# 不推荐这种方法

2.2 请求头中携带参数

在请求头中也可以添加参数,比如添加headers、cookies等信息

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'
}
response = requests.get('https://www.baidu.com/',headers=headers)

2.3 携带cookies信息

其实在2.2中可以把cookies添加在headers里面(不推荐这种方式),第二种方式是使用cookies参数,本质上还是拼在headers中。

response = requests.get('https://www.baidu.com/',cookies={"k1":"v1","k2":"v2"})

3 发送POST请求

POST和GET请求基本完全一样,但是多出一个data参数用来存放请求体数据。

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("https://httpbin.org/post", data=payload)
# 当请求发出时,data将自动进行形式编码,默认的请求头:application/x-www-form-urlencoed
print(r.text)

data参数还可以为每个键具有多个值,当表单中有多个元素使用相同的键时,这一点特别有用:

payload_tuples = [('key1', 'value1'), ('key1', 'value2')]
r1 = requests.post('https://httpbin.org/post', data=payload_tuples)
payload_dict = {'key1': ['value1', 'value2']}
r2 = requests.post('https://httpbin.org/post', data=payload_dict)

对于这些form-data的数据可以直接传,但如果是其他格式的数据,比如json,需要自己转换

import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))

在2.4.2版本中,request模块添加了json参数,自动编码json格式的数据

url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, json=payload)
# 如果传文件则json参数会被忽略
# 使用json参数会将headers中的Content-Type更改为application/json。

使用session发送请求可以帮我们自动处理cookies

session=requests.session()
# 使用session来发请求
r=session.post('https://github.com/login',data={'some': 'data'})
# 假设post请求登录成功了,下次再使用get请求就不用自己处理cookies参数了,session对象会自动处理
r=session.get('https://github.com/login')

4 response响应对象

我们发送get和post之后,会返回一个response对象,我们可以从这个对象中得到我们需要的所有信息。

import requests
respone=requests.get('https://www.baidu.com/')
# respone属性
print(respone.text) # 转码后的响应文本
print(respone.content) # 二进制文本
print(respone.status_code) # 响应状态码(1xx,2xx...)
print(respone.headers) # 响应头
print(respone.cookies) # cookie对象
print(respone.cookies.get_dict()) # cookie转换为字典
print(respone.cookies.items()) # cookie字典的k和v
print(respone.url) # 请求时的url
print(respone.history) # 重定向之前的url地址列表
print(respone.encoding) # 响应的编码方式
response.iter_content() # 如果是大文件,视频之类的,可以for循环一点点取出来
# for line in response.iter_content():
# 	pass

# 关于response.encoding
# 1、encoding是从http中的header中的charset字段中提取的编码方式,若header中没有charset字段则默认为ISO-8859-1编码模式
# 2、apparent_encoding会从网页的内容中分析网页编码的方式,所以apparent_encoding比encoding更加准确。当网页出现乱码时可以把apparent_encoding的编码格式赋值给encoding
# 3、但是apparent_encoding分析编码是比较耗时的, 在爬取大量网页时, 如果事先确定知道网页的编码了, 可以自己手动设置`r.encoding="编码"`, 这样性能会提升
# 综上所述,如果response.text响应文本出现乱码问题:
response.encoding='gbk'  # 解决方式一:可以自己指定编码格式
response.encoding = response.apparent_encoding # 解决方式二、如果没找到编码格式,使用这种方式

5 SSL证书验证

https网站有的要SSL证书验证,如果没有则会报错。可以请求忽略对SSL证书的验证,返回200

requests.get('https://kennethreitz.org', verify=False)

但是会报警告,如果想去掉警告

import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
respone=requests.get('https://www.12306.cn',verify=False)
print(respone.status_code)

有些网站必须有证书才可以访问,那就只能带上

#很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书
#知乎/百度等都是可带可不带
#有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站
#cert参数指定一个本地证书作为客户端证书使用,是一个元组:(私钥和证书)的两个文件路径
import requests
respone=requests.get('https://www.12306.cn',
                     cert=('/path/server.crt',
                           '/path/key'))
print(respone.status_code)

6 使用代理

如果你需要使用代理,你可以在任何请求方法上使用代理参数。

# HTTP代理
import requests

proxies = {
  'http':'http://user:123@localhost:9743',
  'http': 'http://10.10.1.10:3128',
  'https': 'http://10.10.1.10:1080',
}

requests.get('http://example.org', proxies=proxies)

2.10.0版本后,支持SOCKS代理。这是一个可选特性,需要在使用之前安装额外的第三方库。

pip install requests[socks]

一旦你安装了这些依赖项,使用SOCKS代理就像使用HTTP代理一样简单

proxies = {
    'http': 'socks5://user:pass@host:port',
    'https': 'socks5://user:pass@host:port'
}

7 超时设置

#两种超时:float or tuple
#timeout=0.1 #代表接收数据的超时时间
#timeout=(0.1,0.2)#0.1代表链接超时  0.2代表接收数据的超时时间

import requests
respone=requests.get('https://www.baidu.com',
                     timeout=0.0001)

8 认证设置

# 许多需要身份验证的web服务接受HTTP基本身份验证。这是最简单的一种,但是通常网站都不会用默认的加密设置
requests.get('https://api.github.com/user', auth=('user', 'pass'))

一般的网站都不用默认的加密方式,都是自己写的认证方法

9 异常处理

# 异常处理
import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型

try:
    r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
    print('===:')
# except ConnectionError: #网络不通
#     print('-----')
# except Timeout:
#     print('aaaaa')

except RequestException:
    print('Error')

细分出的一些异常,但一般用不到,直接用Exception就可以。

10 文件上传

上传文件是post请求。

import requests
files={'file':open('a.jpg','rb')}
respone=requests.post('http://httpbin.org/post',files=files)
print(respone.status_code)
posted @ 2021-11-12 10:22  yyyz  阅读(168)  评论(0编辑  收藏  举报