Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
Requests 允许你发送纯天然,植物饲养的 HTTP/1.1 请求,无需手工劳动。你不需要手动为 URL 添加查询字串,也不需要对 POST 数据进行表单编码。Keep-alive 和 HTTP 连接池的功能是 100% 自动化的,一切动力都来自于根植在 Requests 内部的 urllib3。以上内容来自Requests官网文档
注:requests库发送请求以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求。
目录
一、安装Requests
pip install requests
二、六种请求方式(post和get最常见)
requests.get('you url') # GET请求
requests.post('you url') # POST请求
requests.put('you url') # PUT请求
requests.delete('you url') # DELETE请求
requests.head('you url') # HEAD请求
requests.options('you url') # OPTIONS请求
import requests
r = requests.get('https://www.baidu.com/') # 发起get请求
# r = requests.request(method='get',url='https://www.baidu.com/') # 另一种写法,和上边效果一样
# r = requests.post('you url',data={'key':'value'}) # 发起post请求(发送字典)
# r = requests.post('you url',data=json.dumps({'key':'value'})) # 发起post请求(发送json)
# r = requests,request(method='post',url='you url',data={'key':'value'}) # 另一种写法
# r = requests,request(method='post',url='you url',data=json.dumps({'key':'value'})) # 另一种写法
print(r) # 打印结果为状态码,<Response [200]>表示请求成功
三、Requests参数详情
1、添加headers(请求头)
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}
response = requests.get("http://www.baidu.com/", headers=headers)
print(response) # 返回结果为<Response [200]>说明请求成功
2、添加params(给url添加参数)
import requests
kw = {'wd':'python'}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}
response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)
print(response) # 返回结果为<Response [200]>说明请求成功
3、添加proxies(代理)
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}
# {'类型':'ip:端口'}
proxies = {
'http':'106.110.212.206:9999'
}
# 如果代理需要使用HTTP Basic Auth,可以使用下面这种格式:
#proxy = { "http": "mr_mao_hacker:[email protected]:9999" }
response = requests.get("http://www.baidu.com/", headers=headers, proxies = proxies)
print(response) # 返回结果为<Response [200]>说明请求成功
代理IP可以在免费的网站上获取:西刺代理,大家都懂,免费的质量上不是很乐观,测试还是没问题的,可以多试几个。
4、添加data(post请求)
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"
}
data = {
"key":"value"
}
response = requests.post("you url", data = data, headers = headers)
print(response)
5、添加auth(Web客户端验证)
import requests
auth = ('test', '123456')
response = requests.get('you url', auth=auth)
print(response) # 返回结果为<Response [200]>说明请求成功
6、设置超时时间
import requests
response = requests.get('url',timeout=10) #设置秒数超时,仅对于连接有效
7、添加verify(跳过证书验证)
例如这样的页面就可以使用verify
了
程序会报错:SSLError: (“bad handshake: Error([(‘SSL routines’, ‘ssl3_get_server_certificate’, ‘certificate verify failed’)],)”,)
import requests
response = requests.get("https://www.12306.cn/mormhweb/", verify = False)
print(response) # 返回结果为<Response [200]>说明请求成功
四、获取响应的内容
response.encoding # 获取当前的编码
response.encoding = 'utf-8' # 设置编码
response.text # 以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。
response.content # 以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。
response.headers # 以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
response.status_code # 响应状态码
response.raw # 返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read()
response.ok # 查看r.ok的布尔值便可以知道是否登陆成功
#*特殊方法*#
response.json() # Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
response.raise_for_status() # 失败请求(非200响应)抛出异常
response.cookies # 返回cookie
response.history # 返回重定向信息,当然可以在请求是加上allow_redirects = false 阻止重定向
import requests
response = requests.get('https://www.baidu.com/') # 发起get请求
print('当前的编码:',r.encoding)
response.encoding = 'utf-8' #设置编码
print('设置后的编码:',response.encoding)
print('以encoding解析返回内容:',response.text)
print('以字节形式(二进制)返回:',response.content)
print('响应头:',response.headers)
print('响应状态码:',response.status_code)
print('返回原始响应体:',response.raw)
print('是否登陆成功:',response.ok)
# print('以json形式返回:',response.json()) #确保返回的内容是json格式的,不然解析出错会抛异常
print('失败请求抛出异常:',response.raise_for_status())
print('结果为状态码',response)
print('cookie:',response.cookies)
print('重定向信息:',response.history)
# 运行结果
当前的编码: ISO-8859-1
设置后的编码: utf-8
以encoding解析返回内容: <!DOCTYPE html><!--STATUS OK--><html> <head>...太多了,略一部分
以字节形式(二进制)返回: b'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head>...太多了,略一部分
响应头: {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Thu, 09 Jan 2020 03:31:29 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:23:55 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
响应状态码: 200
返回原始响应体: <urllib3.response.HTTPResponse object at 0x000001A9337809B0>
是否登陆成功: True
失败请求抛出异常: None
结果为状态码 <Response [200]>
cookie: <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
重定向信息: []
五、定制cookie信息
import requests
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0'}
cookie = {'key':'value'}
response = requests.get('your url',headers=header,cookies=cookie)
六、操作Sission实现人人网登录
import requests
# 1. 创建session对象,可以保存Cookie值
ssion = requests.session()
# 2. 处理 headers
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"}
# 3. 需要登录的用户名和密码
data = {"email": "用户名", "password": "密码"}
# 4. 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
ssion.post("http://www.renren.com/PLogin.do", data=data)
# 5. ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
response = ssion.get("http://www.renren.com/410043129/profile")
# 6. 打印响应内容
print(response.text)
七、会话对象,能够跨请求保持某些参数
import requests
s = requests.Session()
s.auth = ('user','pwd')
s.headers = {'key':'value'}
r = s.get('you url1')
r1 = s.get('you url2')