cookie与session用法

概要

  • cookie与session

  • 代码模拟用户登录

  • json格式数据

  • ip代理池

  • cookie代理池

 


详情

  • cookie与session

    早期的网站并不需要保存用户的状态,所有人都能访问相同的数据。然而随着网站越来越复杂,用户的信息就需要被保存。而HTTP协议是无状态的

# cookie和seesion的出现能够解决HTTP协议的无状态特性
定义:
    (1)cookie:保存在客户端的键值对数据
    原理:用户首次登录网站成功,浏览器会保存使用的用户名和密码等数据,之后再次访问的请求携带用户名和密码     
    (2)session:保存在服务端的用户相关数据
    原理:用户首次登录网站成功,服务端会返回给客户端一个或多个随机字符串,客户端保存该字符串,之后再次访问的请求只需携带该随机字符串即可
"""session基于cookie使用"""

# cookie实践
在浏览器->检查->network中可以看到,请求体的关键字是Form Data
eg: 网址:http://www.aa7a.cn/user.php  # 校验用户名和密码的接口
    请求体格式:
        username: xxxxxx
        password: xxxxxx
        captcha: jv3d
        remember: 1
        ref: http://www.aa7a.cn/user.php?act=logout
        act: act_login
"""研究爬虫的流程!!!"""
1.找到登录时提交数据的目标url地址
2.了解登录post请求携带的请求体数据格式
3.模拟发送post请求

 


  •  代码模拟用户登录

弄明白向服务端发送的请求,就为实现利用代码模拟用户登录提供了可能。

import requests
testUrl = 'http://www.aa7a.cn/user.php'
# 登录时发送的post请求的请求体
postR = {
    "username": "423168031@qq.com",
    "password": "123123",
    "captcha": "z2ft",
    "remember": 1,
    "ref": "http://www.aa7a.cn/?act=logout",
    "act": "act_login"
}
# 发送post请求,data参数是请求体数据
res = requests.post(testUrl, data=postR)
#获取登录成功后浏览器收到的cookie数据
print(res.cookies.get_dict())
"""用户名和密码均正确"""
# 返回的cookie数据
cookieDict = {
     'ECS[password]': '4297f44b13955235245b2497399d7a93',
     'ECS[user_id]': '67327',
     'ECS[username]': '423168031%40qq.com',
     'ECS[visit_times]': '1',
     'ECS_ID': 'e5cf79f8784ecd0bcfce57d6944719249757e7da'
}
# 使用上述正确的cookie登录网站
resG = requests.get(testUrl,cookies=cookieDict)
​
if "423168031@qq.com" in resG.text:
    print('登陆成功')
else:
    print('cookie有问题')


  • json格式数据

response.content一下子获取较大数据过于消耗内存
解决方案:设置stream参数
# 比如读取一个200G的视频
response=requests.get(url,stream=True)
with open('b.mp4','wb') as f:
    for line in response.iter_content():  # 逐行读取内容
        f.write(line)
        
# 网络上包括爬虫相关,很多数据交互均采用json格式
json特点:数据由双引号标识
json()方法:将json格式数据反序列化转换成Python中对应的其他数据类型
eg:    
res = requests.get(url)
res.json()

  • ip代理池

有些网站会使用对客户端ip地址进行校验的防爬措施
eg:
    1min之内同一个ip地址的访问次数不能超过30次,否则禁止该ip访问
解决方案:
    使用IP代理池(由另外的ip地址代替该ip发送请求)
格式: # 每个ip均限制特定的端口
    proxies={
    'http':'114.99.223.131:8888',
    'http':'119.7.145.201:8080',
    'http':'175.155.142.28:8080'   
    }
    response=requests.get(url,proxies=proxies)

 


  • cookie代理池

有些网站会使用对客户端cookie数据(即登录的账户)进行校验的防爬措施
eg:
    1min之内同一个cookie的登录次数不能超过30次,否则禁止该cookie访问
格式:
    resposne=requests.get(url,cookies={})
# 备用的cookie需要自行模拟
posted @ 2021-09-16 15:24  Leguan001  阅读(98)  评论(0)    收藏  举报