1. 请求方式
# 介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)
# 注意:requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求
1. r = requests.request(method, url, **kwargs) # 构造一个请求
# ethod(6个) head/get/post/put/patch/delete
2. requests.head(url, **kwargs)
3. requests.get(url, params=None, **kwargs)
# params # 字典或者字节序列
4. requests.post(url, data=None , json=None, **kwargs)
# data # 字典字节序列或者文件,Rquest的内容
# json # json格式的数据,Request的内容
5. requests.put(url, data=None, **kwargs) #data # 字典字节序列或者文件,Rquest的内容
6. requests.patch(url, data=None, **kwargs) #data # 字典字节序列或者文件,Rquest的内容
7. requests.delete(url, *kwargs)
8. requests.options(url)
# Preflighted Requests是CORS中一种透明服务器验证机制。
# 预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的。
# 跨域资源共享(CORS) 是一种机制
1.1 参数
"""
1. params # 字典或者字节序列
2. data # 字典字节序列或者文件,Rquest的内容
3. json # json格式的数据,Request的内容
4. headers # 字典,HTTP定制头
5. cookies # 字典或者cookiejar,Request中的cookie
6. auth # 元组,支持HTTP认证功能
7. files # 字典类型,传输文件
#fs = {"files":open("文件名","rb")}
#r = requests.request("POST", url, files=fs)
8. timeout # 设置超时时间,单位为秒
9. proxies #字典类型,设定代理服务器
#pxs = {"http":"ip地址1","https":"ip地址2"}
10. allow_redirect重定向开关
11. stream立即下载开关
12. verify认证ssl证书开关 # 访问危险网站
13. cert本地ssl证书路径
"""
1.2 参数示例
import requests
# 文件上传
files = {'file': open('favicon.ico', 'rb')}
response = requests.post("http://httpbin.org/post", files=files)
print(response.text)
import requests
# 会话保持
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
response = s.get('http://httpbin.org/cookies')
print(response.text)
import requests
from requests.packages import urllib3 # 忽略警告
urllib3.disable_warnings()
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)
response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key')) # 证书
print(response.status_code)
import requests
# 代理设置
proxies = {
"http": "http://127.0.0.1:9743",
"https": "https://127.0.0.1:9743",
}
response = requests.get("https://www.taobao.com", proxies=proxies)
print(response.status_code)
# =======================
import requests
# 私密代理
# 如果代理需要使用HTTP Basic Auth,可以使用下面这种格式:
proxy = { "http": "mr_mao_hacker:sffqry9r@61.158.163.130:16816" }
response = requests.get("http://www.baidu.com", proxies = proxy)
print (response.text)
import requests
from requests.exceptions import ReadTimeout
# 超时设置
try:
response = requests.get("http://httpbin.org/get", timeout = 0.5)
print(response.status_code)
except ReadTimeout:
print('Timeout')
import requests
from requests.auth import HTTPBasicAuth
# 认证设置
r = requests.get('http://120.27.34.24:9001', auth=HTTPBasicAuth('user', '123'))
print(r.status_code)
#=============
import requests
r = requests.get('http://120.27.34.24:9001', auth=('user', '123'))
print(r.status_code)
import requests
from requests.exceptions import ReadTimeout, ConnectionError, RequestException
# 异常处理
try:
response = requests.get("http://httpbin.org/get", timeout = 0.5)
print(response.status_code)
except ReadTimeout:
print('Timeout')
except ConnectionError:
print('Connection error')
except RequestException:
print('Error')
2. get请求
import requests
"""
GET请求
HTTP默认的请求方法就是GET
* 没有请求体
* 数据必须在1K之内!
* GET请求数据会暴露在浏览器的地址栏中
GET请求常用的操作:
1. 在浏览器的地址栏中直接给出URL,那么就一定是GET请求
2. 点击页面上的超链接也一定是GET请求
3. 提交表单时,表单默认使用GET请求,但可以设置为POST
"""
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload) # params可变个数的
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"}
# 西瓜视频下载
url = "http://v6-default.ixigua.com/65bee02999486d44e8f1be9c9babb660/5e1f482b/video/tos/cn/tos-cn-ve-4/bc2afd90dfec4b91aa75512c79f90107/?a=1217&br=1452&bt=726&cr=0&cs=0&dr=0&ds=2&er=&l=202001160010000100140470160A7FCB5C&lr=&qs=0&rc=ajx2czRmanF2cjMzZTczM0ApOGhpZ2dlZmUzNzszOjc2M2dgZ29rbGtiZGJfLS0wLS9zcy42NF5fNTMwNV8wXzA2YjM6Yw%3D%3D"
r = requests.get(url=url, headers=headers, stream=True) # steam
with open("一个人挺好-李知恩(合成).mp4", "wb") as video:
for chunk in r.iter_content(chunk_size=1024 * 1024):
if chunk:
video.write(chunk)
3. post请求
"""
POST请求
(1). 数据不会出现在地址栏中
(2). 数据的大小没有上限
(3). 有请求体
(4). 请求体中如果存在中文,会使用URL编码!
注意:
1、对于登录来说,应该输错用户名或密码然后分析抓包流程,用脑子想一想,输对了浏览器就跳转了,还分析个毛线,累死你也找不到包
2、要做登录的时候一定记得要把cookie先清除
3、requests.session():中间的cookie都不用自己分析了,有用的没用的都给放进来了
4、response.cookies.get_dict()
"""
4. response属性
import requests
import json
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"}
url = "http://www.baidu.com"
response = requests.get(url=url, headers=headers)
print(response) # <Response [200]>
ret = response.request # <PreparedRequest [GET]>
print(ret)
ret = response.headers # network中Response Headers部分
print(ret)
ret = response.url
print(ret)
ret = response.status_code
print(ret)
ret = response.text # 返回是str类型的数据
print(ret)
# Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 response.text 之时,Requests 会使用其推测的文本编码。
# 你可以找出 Requests 使用了什么编码,并且能够使用 response.encoding 属性来改变它
ret = response.content # 返回是bytes类型的数据
print(ret)
ret = response.cookies # # <RequestsCookieJar[<Cookie H_PS_PSSID=1420_21094_30495_22157 for .baidu.com/>, <Cookie delPer=0 for .baidu.com/>, <Cookie BDSVRTM=0 for www.baidu.com/>, <Cookie BD_HOME=0 for www.baidu.com/>]>
ret2 = response.cookies.get_dict()
ret3 = requests.utils.dict_from_cookiejar(response.cookies) # cookie字典
print(ret)
print(ret2) # {'H_PS_PSSID': '1440_21110_30491_26350_30502', 'delPer': '0', 'BDSVRTM': '0', 'BD_HOME': '0'}
print(ret3) # {'H_PS_PSSID': '1440_21110_30491_26350_30502', 'delPer': '0', 'BDSVRTM': '0', 'BD_HOME': '0'}
res1 = json.loads(response.text) # 太麻烦
print(res1) # {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0'}, 'origin': '111.121.69.119, 111.121.69.119', 'url': 'https://httpbin.org/get'}
res2 = response.json() # 直接获取json数据
print(res2) # {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0'}, 'origin': '111.121.69.119, 111.121.69.119', 'url': 'https://httpbin.org/get'}
print(res1 == res2) # True
ret = response.encoding # 从http中猜测编码 # 还可以通过这个属性设置正确的编码
print(ret) # ISO-8859-1
ret = response.apparent_encoding # 从内容中分析出编码,这个更加准确
print(ret) # utf-8
ret = response.elapsed # 流逝了多少时间
print(ret)
ret = response.history # [<Response [302]>]
print(ret)
# 默认情况下,除了request.head(), Requests 会自动处理所有重定向。可以使用响应对象的 history 方法来追踪重定向。
# Response.history 是一个 Response 对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最老到最近的请求进行排序。
# 重定向:浏览器发送请求,服务器返回重定向的状态码和location,没有响应体。浏览器会自动再发送给location的url一次请求,才能得到响应体。
# Request URL: https://static.zhihu.com/heifetz/main.app.585bb6255dc0a63109f3.js
# Referer: https://www.zhihu.com/signin?next=%2F # 从哪个网页过来的(去请求js)
# Location:https://www.zhihu.com/signin?next=%2F # 重定向到这个url
5. 处理url
5.1 url拼接
from urllib import parse
domain = ""
url_list = []
for url_details in url_list:
url = parse.urljoin(domain, url_details.xpath())
5.2 url编码
import requests
requests.utils.unquote("xxxxxx") # unquote解码
requests.utils.quote("中国") # quote编码
5.3 url编码2
from urllib import parse
#import urllib # urllib是包(包下有多个模块,import 包名可以导入包中所有模块(和这个一样from urllib import *))
dic = {"kw":"Python语言"}
str = "https://www.baidu.com/s?wd=Python语言"
s = parse.urlencode(dic, encoding="utf8")
url = "https://www.baidu.com/s?{}".format(s)
print(url) # https://www.baidu.com/s?kw=Python%E8%AF%AD%E8%A8%80