cookie和session区别:
- 1.cookie数据存放在客户的浏览器上,session数据存放在服务器上
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
- 2.session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能
- 3.单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie
爬虫处理cookie和session
- 带上cookie、session的好处:能够请求到登录以后的页面;
- 带上cookie、session的弊端:一套cookie和session往往和一个用户对应,请求太快、请求次数太多,容易被服务器识别为爬虫;
- 注意事项:不需要cookie的时候尽量不要使用;但为了获取登录之后的页面,我们必须发送带有cookie的请求。
1.session
-
requests提供了一个叫做session类,来实现客户端和服务端的会话保持。
-
使用方法:
- 实例化session
- 先使用session发送请求,登录对应网站,把cookie保存在session中
- 再使用session请求登录之后才能访问的网站,session能够自动携带登录成功时保存在其中的cookie,进行请求。
-
动手尝试使用session来登录人人网:http://www.renren.com/PLogin.do
import requests session = requests.session() post_url = "http://www.renren.com/PLogin.do" post_data = {"email":"mr_mao_hacker@163.com","password":"alarmchime"} headers = { "User-Agent"="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" } # 使用session发送post请求,cookie保存在其中 session.post( post_url,data=post_data,headers=headers ) # 在使用session进行请求登录之后才能访问的地址 r = session.get( "http://www.renren.com/327550029/profile",headers=headers ) # 保存页面 with open("renren1.html","w",encoding="utf-8") as f: f.write(r.content.decode())
寻找登录的post地址:
- 在form表单中寻找action对应的url地址
- post数据是<input标签中name的值作为键key,真正的用户密码作为值values的字典。>post的url地址就是action对应的url地址
- 如果在form表单中没有发现post的url地址,就需要在network里进行抓包,寻找登录的url地址
- 勾选perserve log 按钮,防止页面跳转找不到登录时的url;
- 寻找post数据,确定参数:
- 参数不会变,直接用,比如密码不是动态加密的时候;比如 phonenumber的值;
- 参数会变
- 在当前的响应中;
- 通过JS生成 ↓↓↓↓↓↓↓
定位想要的js:
- 选择会触发js事件的按钮,点击event listener,找到js的位置;
- 通过chrome中的search all file来搜索url中关键字。
- 通过断点的方式来查看js的操作,通过python来进行同样的操作。
2.cookie
- 配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面。
- 用cookie请求的方法(和上面的例子效果是一样的,一般对cookie过期时间很长的网站使用):
import requests headers = { "User-Agent"="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36", "cookie": "uuid_tt_dd=10_37359065420-1574065916898-684366; dc_session_id=10_1574065916898.372791; __gads=ID=3f12c01ff37a7b96:T=1574300659:S=ALNI_MbDcZxBjyhd9lIwQE8ryujHfVdQBg" } r = requests.get( "http://www.renren.com/327550029/profile",headers=headers ) with open("renren2.html","w",encoding="utf-8") as f: f.write(r.content.decode())
3.拓展
- 字典推导式:
- 如何将cookie的字符串转化成字典?
- 例如:
{i:i+10 for i in range(10)}
# 结果为:
{0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19}
- 同理:
cookies = "uuid_tt_dd=10_37359065420-1574065916898-684366; dc_session_id=10_1574065916898.372791; __gads=ID=3f12c01ff37a7b96:T=1574300659:S=ALNI_MbDcZxBjyhd9lIwQE8ryujHfVdQBg"
cookies = {i.split("=")[0]:i.split("=")[1] for i in cookies.split(";") }
r = requests.get(
"http://www.renren.com/327550029/profile",
headers=headers,cookies=cookies
)
with open("renren3.html","w",encoding="utf-8") as f:
f.write(r.content.decode())
知识链接:for循环推导式(列表、字典、集合) >>>>
知识链接:Python str.split()方法_切片分割 >>>>
知识链接:特殊cookie转字典的方法 >>>>
总结:
获取登陆后的页面的三种方式:
- 1.实例化session,使用session发送post请求,在使用他获取登录后的页面;
- 2.headers中添加cookie键,值为cookie的字符串
- 3.在请求方法中增加cookies参数(和headers一样),接收字典形式的cookie。