前言
cookie是存储在浏览器中的一组键值对,用来保存当前用户身份 存在时效性的,会过期,过期的时间一般都是服务端指定
关于cookie,4399网站案例
伪装(请求头)中有一个cookie 它是存储在客户端(浏览器)中的一组键值对 能够用于保存一些状态 wz = { 'cookie':'qq_domain_video_guid_verify=6728766746937e5e; pgv_pvid=7998506096; tvfe_boss_uuid=08e5207308da8771; RK=DV0RrriIG5;' } 浏览器访问群组页面:要求:必须要先登录 爬虫获取群组数据: 1- 找数据所在的url https://my.4399.com/forums/index-getMtags?type=game&page=1 2- 请求成功之后,得到的反馈信息是要先登录(明明浏览器已经登录了,为什么还要登录,因为浏览器和代码没有关系) 3- 如何解决登录问题: 1- 带上登录之后的cookie:当你登录完成之后,会保存一些用户信息在里面,cookie中保存的内容不会永久有效,时间期限(服务端决定) 优点:简单直接,缺点:会过期 2- 模拟登录(浏览器登录之后可以拿到数据,爬虫也可以进行登录,登录成功也可以看到数据)
一、第一种方式
带上登录之后的cookie
cookie中保存的内容不会永久有效,时间期限(服务端决定) 优点:简单直接,缺点:会过期
url = 'https://my.4399.com/forums/index-getMtags?type=game&page=1'
headers = {
'cookie':'UM_distinctid=18f5d84be7ab12-0d4fcf3a09be2e-26001d51-1fa400-18f5d84be7bf28; _4399tongji_vid=171526094309656; _4399stats_vid=17152609431943750; _gprp_c=""; smidV2=202405111957567078c442e11c09b2676e719231c52c1f00ffe8aacc95bce90; home4399=yes; Puser=3073859018; Pnick=%E4%B8%AD%E9%87%8E%E5%B7%A7%E5%AE%89%E6%9B%BC%E5%A6%AE; Qnick=; Sauth=4078826105%7C3073859018%7C1724907026%7C1725771373%7Cad31369854452fbfe2af%7C%E4%B8%AD%E9%87%8E%E5%B7%A7%E5%AE%89%E6%9B%BC%E5%A6%AE%7C%E4%B8%AD%E9%87%8E%E5%B7%A7%E5%AE%89%E6%9B%BC%E5%A6%AE%7C47e7e4cfced0bcb5a19d88b03d094613; Hm_lvt_334aca66d28b3b338a76075366b2b9e8=1724391240,1724906618,1724932650; ptusertype=my.4399_login; zone_guide_date=1724947200; zone_guide_time=2; _4399tongji_st=1724933289; USESSIONID=e61b6eb4-3e07-48dd-b354-c9fe6ef545d2; Hm_lvt_5c9e5e1fa99c3821422bf61e662d4ea5=1724906645,1724932678,1724933289; HMACCOUNT=13108745FF137EDD; Hm_lvt_e5a07b5994f78634294b9c347a5be7d2=1724906645,1724932678,1724933289; phlogact=l1493; Uauth=4399|1|2024829|my.|1724933589815|d59a0688a9891db73745cf920f83aa63; Pauth=4078826105|3073859018|t3ce7n2813b76b1e854c4b9428c211e1|1724933589|10002|690950f30d878aa6ed7e245af0c9fb18|2; ck_accname=3073859018; Xauth=6b199edef659802ab9fac4d9eea16604; Hm_lpvt_e5a07b5994f78634294b9c347a5be7d2=1724933589; Hm_lpvt_5c9e5e1fa99c3821422bf61e662d4ea5=1724933589; Pmtime=85fe178bc1e94ed171d3%7C1724933590; ol=1'
}
import requests
res = requests.get(url,headers=headers)
res.encoding = 'utf-8'
print(res.text)
二、第二种方式
模拟登录(浏览器登录之后可以拿到数据,爬虫也可以进行登录,登录成功也可以看到数据)
代码如下(示例):
'''
1- 登录url
https://ptlogin.4399.com/ptlogin/login.do?v=1
好处:不会因为cookie过期(获取群组数据之前都登录了一次)导致代码运行失败
'''
import requests
# 登录url
login_url = 'https://ptlogin.4399.com/ptlogin/login.do?v=1'
# 携带参数
data = {
'loginFrom':'uframe',
'postLoginHandler':'refreshParent',
'layoutSelfAdapting':'true',
'externalLogin':'qq',
'displayMode':'undefined',
'layout':'vertical',
'bizId':'1199006632',
'appId':'my',
'gameId':'',
'css':'//s1.img4399.com/base/css/ptlogin.css?2508cfc',
'redirectUrl':'',
'sessionId':'',
'mainDivId':'popup_login_div',
'includeFcmInfo':'false',
'level':'60',
'regLevel':'4',
'userNameLabel':'4399用户名',
'userNameTip':'请输入4399用户名',
'welcomeTip':'欢迎回到4399',
'sec':'1',
#加密的密码 1111 --加密-》生成一段看不懂的字符串
# 这个网站可以直接传入原密码,但是大部分网站的登录都是需要传入加密的密码才可以
}
login_res = requests.post(login_url,data=data)
# 获取登录之后的cookie信息
co = login_res.cookies # 服务端返回的
# print(res.text) 通过响应内容暂时无法判断是否登录成功
# 继续访问一个需要登录之后才可以访问的页面 (群组)
# 请求群组url
url = 'https://my.4399.com/forums/index-getMtags?type=game&page=1'
# 携带登录成功之后的cookie
res = requests.get(url,cookies=co)
res.encoding = 'utf-8'
print(res.text)
三、第三种方式
使用session对象:自动管理cookie
从requests中创建session对象发起请求
代码如下(示例):
import requests
# 登录url
login_url = 'https://ptlogin.4399.com/ptlogin/login.do?v=1'
# 携带参数
data = {
'loginFrom':'uframe',
'postLoginHandler':'refreshParent',
'layoutSelfAdapting':'true',
'externalLogin':'qq',
'displayMode':'undefined',
'layout':'vertical',
'bizId':'1199006632',
'appId':'my',
'gameId':'',
'css':'//s1.img4399.com/base/css/ptlogin.css?2508cfc',
'redirectUrl':'',
'sessionId':'',
'mainDivId':'popup_login_div',
'includeFcmInfo':'false',
'level':'60',
'regLevel':'4',
'userNameLabel':'4399用户名',
'userNameTip':'请输入4399用户名',
'welcomeTip':'欢迎回到4399',
'sec':'1',
#加密的密码 1111 --加密-》生成一段看不懂的字符串
# 这个网站可以直接传入原密码,但是大部分网站的登录都是需要传入加密的密码才可以
}
# 得到session对象
session = requests.Session()
login_res = session.post(login_url,data=data) # 请求成功之后,就会自动的将cookie保存到session对象中
url = 'https://my.4399.com/forums/index-getMtags?type=game&page=1'
# 携带登录成功之后的cookie
res = session.get(url)
res.encoding = 'utf-8'
print(res.text)
总结
使用: 请求某个数据,cookie是必须要加的伪装 直接cookie放到请求头 先requests请求登录/主页 获取响应的cookie requests请求目标url 传入cookie 先session请求登录/主页 再session请求目标url