这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」
详细代码ref:code
接上回,requests库的使用
requests实现 POST 上传
通过前面几篇文章我们知道了如何使用基本的requests库,今天来学习一下高级用法,比如文件上传
文件上传实现
看代码实现其实很简单:
import requests
files = {'file': open('facicon.ico',"rb")}
print(type(files))
r = requests.post("https://www.httpbin.org/post",files=files)
print(r.status_code)
print(r.text)
得到的响应:
不得不说 这快捷键太好用了 command+shift+Ctrl+4 区域截屏加粘贴 但是还是不如win的截图简单
记得以前在哪看到来着,说服务器就是一个"舔狗",只要咱们一发送消息那边必然有回应,哪怕自己服务器有问题,也给回应:500,那么刚刚那个例子,服务器给咱们的回应就是files form字段,我们可以注意到,form字段空的,这说明文件上传部分会单独用一个files字段来标识.
Cookie设置
前面学过urllib的Cookie设置,写法比较复杂,需要看的可以往上翻翻, requests库写法就简单许多了,获取和设置仅需一步:
import requests
r = requests.get("https://www.baidu.com")
print(r.cookies)
for key ,value in r.cookies.items():
print(key+'='+value)
这里我们仅仅需要注意这个Cookie的对象是RequestsCookieJar
我们可以把浏览器的Cookie设置进我们的请求参数中,举个例子
import requests
cookies = 'MONITOR_WEB_ID=ba32d600-bc3f-43a1-8c96-e73dc3539775; _ga=GA1.2.17465446.1637248034;' \
' n_mh=sMPKWn-OElkfB4SeEaM8oAsHV2sfBpz9PbCq9kvqmzc; passport_csrf_token_default=066a66590590649a8b7c7a2a7dd6cf49; ' \
'passport_csrf_token=066a66590590649a8b7c7a2a7dd6cf49; passport_auth_status=2d22ae05908e874e976e431736356fd3,; passport_auth_status_ss=2d22ae05908e874e976e431736356fd3,; ' \
'sid_guard=546107c8b00198ead87bc0072d728ddf|1642500267|5184000|Sat,+19-Mar-2022+10:04:27+GMT; uid_tt=12bdb1bda85dc142b9b26024df8924a7; uid_tt_ss=12bdb1bda85dc142b9b26024df8924a7;' \
' sid_tt=546107c8b00198ead87bc0072d728ddf; sessionid=546107c8b00198ead87bc0072d728ddf; sessionid_ss=546107c8b00198ead87bc0072d728ddf; ' \
'sid_ucp_v1=1.0.0-KDUxODM1MGUyODUyNDY1OTNiNjEzNmE3YTJjZTBkY2Y0N2QzYTA0OTEKFwjdx7CSjoyGBBCroZqPBhiwFDgCQPEHGgJsZiIgNTQ2MTA3YzhiMDAxOThlYWQ4N2JjMDA3MmQ3MjhkZGY;' \
' ssid_ucp_v1=1.0.0-KDUxODM1MGUyODUyNDY1OTNiNjEzNmE3YTJjZTBkY2Y0N2QzYTA0OTEKFwjdx7CSjoyGBBCroZqPBhiwFDgCQPEHGgJsZiIgNTQ2MTA3YzhiMDAxOThlYWQ4N2JjMDA3MmQ3MjhkZGY; ' \
'__tea_cookie_tokens_2608=%7B%22user_unique_id%22%3A%227031926738989844003%22%2C%22web_id%22%3A%227031926738989844003%22%2C%22timestamp%22%3A1642233807884%7D; _gid=GA1.2.383320801.1643031180;' \
' _tea_utm_cache_2608={"utm_source":"banner","utm_medium":"webbanner","utm_campaign":"gengwen202201_yq"}'
jar = requests.cookies.RequestsCookieJar()
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36",
}
for cookie in cookies.split(";"):
key,value = cookie.split("=",1)
# print(key+" "+value)
jar.set(key,value)
r = requests.get("https://juejin.cn",cookies=jar,headers=headers)
print(r.text)
稍微解释一下 split("=",1) //第一个参数,就是它是按照什么去分割的,第二个就是分割几次,这个方法默认是-1 就是里面第一个字符串就分,一直分
Session 维持
直接利用requests库中的get/POST的方法确实可以模拟网页请求,但是这两种请求相当于不同的session,或者可以理解为,用两个浏览器打开了不同页面,比如说我们现在有这个场景,我们想拿到登录后的个人信息,第一次先发送POST,第二次再发送get请求,是不能成功地,因为这是两个不相关的请求,我们有两个解决方案:
- Cookie 两次第二次请求使用第一次的Cookie,行是行,笨一点
- Session维持
代码只需要一行:
s = requests.Session()
这步一般用于模拟登录成功后的下一步.
SSL证书验证的问题
解决方案:
- 在请求中加上 verify =False
- 安装证书
超时设置
跟上面一样在请求中 timeout=1 // 这个代表了链接和读取的总时间是一秒,如果你想分别设置时间可以这样写timeout=(5,30)传一个元组进去
身份认证
auth认证
在urllib这个库里面我们学过了怎么样处理这个事情: refurllib处理登录验证
import requests
r = requests.get("https://ssr3.scrape.center/",auth=("admin","admin"))
print(r.status_code)
OAuth认证
import requests
from requests_oauthlib import OAuth1
url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
auth = OAuth1("YOUR_APP_KEY","YOUR_APP_SECRET","USER_OAUTH_TOCKEN","USER_OAUTH_TOKEN_SECRET")
requests.get(url,auth=auth)
代理设置
import requests
proxies = {
"http":"http://127.0.0.0:7890",
"https":"https://127.0.0.1:7890"
}
demo = requests.get("https://www.baidu.com",proxies=proxies)
print(demo.text)
需要找一个好用的代理去实验,我没找到,但是写法确实是这么写的 如果要是使用socket5 直接替换后面的HTTP就好了 好了,目前就到这里了,明天去学一下正则表达式