requests模块处理cookie相关的请求

目标

  • 掌握requests处理cookie的三种方法
  • 掌握分析js的方法

1 requests处理cookie相关的请求

1.1 回顾cookie和session的区别
  • cookie数据存放在客户的浏览器上,session数据放在服务器上
  • coolie不是安全的,别人可以分析放在本地的cookie并进行cookie欺骗
  • session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能
  • 单个cookie保存的数据不超过4k,很多浏览器都限制一个站点最多保存20个cookie
1.2 爬虫中为什么要使用cookie
  • 带上cookie的好处

    • 能够访问登陆后的页面
    • 正常的浏览器在请求服务器的时候肯定会岱山cookie(第一次请求某个地址除外),所以对方服务器有可能会通过是否携带cookie来判断我们是不是一个爬虫,对应的能够起到一定的反爬效果。
  • 带上cookie的坏处

    • 一套cookie往往对应的是一个用户的信息,请求tai’pi频繁可能被对方识别为爬虫
    • 如何解决? 使用多个账号
1.3 requests处理cookie相关请求之session
  • requests 提供了一个叫session类(不是1.1的session),来实现客户端和服务端的 会话保持
    • 会话保持有两个内涵:
    • 保存cookie
    • 实现和服务器的长连接
  • 使用方法
    session = requests.session() 
    response = session.get(url, headers)
    

session实例在请求了一个网站后,对方服务器设置在本地的cookie会保存在session中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie

  • 案例 使用session处理cookie自动登录人人网
"""关于如何获取post接口  看1.6"""
import requests

# 1. 实例化session
session = requests.Session()

# 2.使用session发送post请求,对方服务器会把cookie设置再session中
post_url = "http://www.renren.com/PLogin.do"   # 如何获取这个post接口?
post_data = {"email": "[email protected]", "password": "qqq213"}
headers = {"user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"}

session.post(post_url, headers=headers)

# 3. 请求个人主页,会带上之前的cookie.能够请求成功
get_url = "http://www.renren.com/971326208/newsfeed/photo"
response = session.get(get_url, headers=headers)
with open("D:/renren", "w", encoding="utf-8") as f:
    f.write(response.content.decode())
1.4 requests处理cookie相关请求之cookie放在headers中

了解header中的cookie
requests模块处理cookie相关的请求_第1张图片

  • headers中的cookie:
    • 使用分号 ; 隔开
    • 分号两边类似 a=b 形式表示一条cookie
    • a=b中,a表示键(name), b表示值(value)
    • 在headers中仅仅使用了cookie的name和value

cookie的具体组成字段
在这里插入图片描述
由于headers中对cookie仅仅使用他的name和value,所以在代码中我们仅仅需要cookie的name和value即可。
在headers中使用cookie

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/75.0.3770.100 Safari/537.36"
    "Cookie": "anonymid=jxgs2jkwqwhdpd; depovince=GW; _r01_=1; JSESSIONID=abc9BfHBlqN0xd6TxMGUw; "
}
import requests

url = "http://www.renren.com/971326407/profile"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/75.0.3770.100 Safari/537.36",
    "Cookie": "anonymid=jxgs2jkwqwhdpd; depovince=GW; _r01_=1; JSESSIONID=abc9BfHBlqN0xd6TxMGUw; ick_login=7428d2f3-4542-416e-baa1-9a0d2c12c467; jebe_key=25d04d93-b460-45b8-bae7-3616ba782a25%7C5cf624e189b77eef33651639aa11d37f%7C1561773163331%7C1%7C1561773163304; ick=ad36215d-2a2b-446e-b026-b3180c909375; first_login_flag=1; ln_uact=15238932677; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; _de=2EACFB7F6394A56075DC3133F1B30D50; _ga=GA1.2.2097208372.1561796379; _gid=GA1.2.733062372.1561796379; _c1=-100; jebecookies=7bdf7317-2411-4cfd-9c59-664b468b774c|||||; p=f76202384e0620d84038d4a4a42b568c7; t=b3efb9f012e4454abb761c3ebe7d4e637; societyguester=b3efb9f012e4454abb761c3ebe7d4e637; id=971326407; xnsid=5d79874e; ver=7.0; loginfrom=null; wp_fold=0; jebe_key=25d04d93-b460-45b8-bae7-3616ba782a25%7Cbabedbac6b8f43cdadf04d05bc26e3cd%7C1561799861917%7C1%7C1561799861599"
}

response = requests.get(url, headers=headers)
ret = response.content.decode()
print(ret)
with open("D:/renren", "w", encoding="utf-8") as f:
    f.write(ret)

cookie有过期时间,所以直接复制浏览器的cookie意味着下次使用可能会失效,当然也有很多网站的cookie过期时间很长。

1.5 requests处理cookie相关的请求值使用cookies参数
  • cookies的形式:字典
cookies = {"cookie的name":"cookie的value"}
  • 使用方法
request.get(url.headers=headers, cookies=cookie_dict)
import requests
import re

url = "http://www.renren.com/971326407/profile"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/75.0.3770.100 Safari/537.36"}
Cookie = "anonymid=jxgs2jkwqwhdpd; depovince=GW; _r01_=1; JSESSIONID=abc9BfHBlqN0xd6TxMGUw; ick_login=7428d2f3-4542-416e-baa1-9a0d2c12c467; jebe_key=25d04d93-b460-45b8-bae7-3616ba782a25%7C5cf624e189b77eef33651639aa11d37f%7C1561773163331%7C1%7C1561773163304; ick=ad36215d-2a2b-446e-b026-b3180c909375; first_login_flag=1; ln_uact=15238932677; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; _de=2EACFB7F6394A56075DC3133F1B30D50; _ga=GA1.2.2097208372.1561796379; _gid=GA1.2.733062372.1561796379; _c1=-100; jebecookies=7bdf7317-2411-4cfd-9c59-664b468b774c|||||; p=f76202384e0620d84038d4a4a42b568c7; t=b3efb9f012e4454abb761c3ebe7d4e637; societyguester=b3efb9f012e4454abb761c3ebe7d4e637; id=971326407; xnsid=5d79874e; ver=7.0; loginfrom=null; wp_fold=0; jebe_key=25d04d93-b460-45b8-bae7-3616ba782a25%7Cbabedbac6b8f43cdadf04d05bc26e3cd%7C1561799861917%7C1%7C1561799861599"

cookie_dict = {re.split(r"=", i)[0]: re.split(r"=", i)[1] for i in re.split(r"; ", Cookie)}
print(cookie_dict)

response = requests.get(url, headers=headers, cookies=cookie_dict)
ret = response.content.decode()
with open("D:/renren.html", "w", encoding="utf-8") as f:
    f.write(ret)
1.6 寻找登录接口的方法
  • form表单对应的url地址

    • 用户名和密码在input标签中,name的值作为键,用户名和密码作为值的字典,这个字典为post_data
  • 通过抓包,定位url地址

    • from data
1.7 分析获取加密数据
  • 观察变化
  • 定位js
    • 通过event listener定位js的位置
    • 通过搜索url地址中的关键字,通过chrome的search all file来进行搜索
  • 进行分析
    • 通过添加断点的方式分析js
  • 执行js
    • 完全的使用python模拟js的执行过程

你可能感兴趣的:(爬虫)