爬虫之session和cookie处理(内附.content用法、for循环推导式、split()方法、特殊cookie转字典)

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()) 
    

    知识链接: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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值