学习记录-Python爬虫 requests库的使用3 文件上传,Cookie设置

564 阅读4分钟

这是我参与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)

得到的响应:

image.png

不得不说 这快捷键太好用了 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)

image.png 这里我们仅仅需要注意这个Cookie的对象是RequestsCookieJar

我们可以把浏览器的Cookie设置进我们的请求参数中,举个例子

image.png

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就好了 好了,目前就到这里了,明天去学一下正则表达式