爬虫入门(关于cookie和session)
Cookie
当我们在淘宝上进行登录,购买东西的时候,用户登录的状态是必须要有的。工作当中是需要这个状态的,但是http协议是不负责维持这个状态的。所以,浏览器就想了个办法,搞了一个本地化存储,来保持这个状态。本地保存的这个东西,每次发送请求的时候,浏览器会自动携带该信息。这个本地化的存储,我们就叫它cookie。
Cookie的生成过程:
- cookie的生成不一定是单纯的在浏览器端...,一开始可能是从服务器创建好的一个随机字符串,该随机字符串和一堆用户信息,形成映射关系。{字符串:一大堆用户信息}。
- 服务器会把随机字符串返回给浏览器。通过响应头里面的
set-cookie
把该随机字符串返回给浏览器。 - 浏览器接收到set-cookie的响应头之后. 自动把该值, 保存在浏览器的cookie当中。
- 以后. 只要是发生在该网站的请求(参考标准是依赖于url的). 都会自动携带该随机字符串。
- 这样的话. 服务器端就能知道客户端的相关的信息了。
上述过程,叫做保持回话(Session)
。所以,cookie可以保持住用户的状态。
cookie的本质就是在浏览器端,保存一个值,以后所有的请求都能携带着这个值。
Cookie如何来进行处理:
从生成逻辑:
-
服务器生成.
特征(必须记住), 响应头里面通过set-cookie把值带过来.
此时, 该值, 是由服务器生成的. 所以生成规则. 你是不知道的...
此时, 不要妄想能本地生成该值... -
浏览器生成.
浏览器可以执行javascript脚本. 脚本是可以进行计算. 并处理cookie的.
有可能该值, 是通过浏览器端的js代码执行. 计算而得...
此时, 你是可以看到该值的生成过程的...后期逆向的时候. 很多都是这玩意..
特征(必须记住), 你在响应头里. 找不到该值. 但是呢发请求又有这个值...
处理逻辑:
-
直接从浏览器把cookie复制出来.丢到请求头. 直接用即可..
优点: 简单.粗暴
问题: cookie的值是有时效性的. cookie值会过期, 需要重新复制一个.. -
可以使用resp.cookie, 把响应头中的cookie值拿出来. 传递给下一个请求
resp = requests.get(url)
resp2 = requests.get(url, cookie=resp.cookie) # 手工携带cookie -
推荐. python中的requests模块提供了一个叫session的玩意...
session可以保持住客户端和服务器之间的状态(cookie), 可以自动的维护响应头
带回来的cookie值. 不用你去管. 自动去维护...
弊端, 最大的弊端就是: 不能维护js生成的cookie,
js生成的cookie需要你手工去维护. 你需要用js生成cookie值, 丢到session就可以了
并不是, 非得每次请求都手工传递....
举一个例子:
# 方式1
import requests
# 不走登陆流程 ----->
url = "http://www.woaidu.cc/bookcase.php"
headers = {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"accept-encoding": "gzip, deflate",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
"cache-control": "no-cache",
"connection": "keep-alive",
# 最简单最粗暴的办法,直接怼上cookie
# "cookie": "Hm_lvt_155d53bb19b3d8127ebcd71ae20d55b1=1722247183,1722254251; HMACCOUNT=B037C041EB8899DB; username=User; t=727269744666a79e940a50d; Hm_lpvt_155d53bb19b3d8127ebcd71ae20d55b1=1722261209",
"dnt": "1",
"host": "www.woaidu.cc",
"pragma": "no-cache",
"referer": "http://www.woaidu.cc/book/1255314/",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
}
resp = requests.get(url, headers=headers)
print(resp.text)
# 方式2
import requests
import base64
import json
import ddddocr # 需要安装...pip install ddddocr
# 走登陆流程, 此时, 你要盯着的是cookie的生成过程...
# 通过观察, 发现, 加载验证码的时候. 服务器携带了cookie回来.
# 而这个值. 是后面验证登陆的时候. 必须的一个值.
session = requests.session()
session.headers = {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"accept-encoding": "gzip, deflate",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
"cache-control": "no-cache",
"connection": "keep-alive",
"dnt": "1",
"host": "www.woaidu.cc",
"pragma": "no-cache",
"referer": "http://www.woaidu.cc/book/1255314/",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36"
}
code_url = "http://www.woaidu.cc/code.php?0.0910519102254359"
resp = session.get(code_url)
# print(session.cookies) # 验证cookie中是否有c
# 识别图片.
with open("tu.jpg", mode="wb") as f:
f.write(resp.content)
# 识别图片:
# 1. 免费
# ddddocr, 这个库是一个个人开发的库..对py版本有一定要求....
# 官方文档
# https://github.com/sml2h3/ddddocr
ddd = ddddocr.DdddOcr(show_ad=False) # 去掉广告
# 读取图片
f = open("tu.jpg", mode="rb")
# 识别图片
rt = ddd.classification(f.read())
f.close()
# 2. 付费
# 支持的更多. 图鉴, 超级鹰....
# 图鉴:
# http://www.ttshitu.com/docs/python.html#pageTitle
# 超级鹰:
# https://www.chaojiying.com/
# 组织登录信息. 发登录请求
login_data = {
"LoginForm[username]": "q6035945",
"LoginForm[password]": "6035945",
"LoginForm[captcha]": rt,
"action": "login",
"submit": "登 录"
}
# 去登陆
login_url = "http://www.woaidu.cc/login.php"
login_resp = session.post(login_url, data=login_data, allow_redirects=False)
# 浏览器, 看到302会自动跳转....跳转到Location对应的地址
# session默认是按照浏览器的逻辑走的. 它看到302也会自动发起新的请求, 重新发到Location
# 我们目前看到的样子. 实际上里面是两个请求
# session人性化的一点...这是好事儿...
# print(login_resp.text) # 看到它进入首页了. ????? 302, Location 没有看到.
print(login_resp.headers)
print(login_resp.status_code)
# 登陆成功后. 会有cookie的增加
# print(session.cookies)
# # 有了cookie. 登陆信息后. 可以访问书架上的内容了
# jia_url = "http://www.woaidu.cc/bookcase.php"
#
# resp = session.get(jia_url)
# print(resp.text)
本文来自博客园,作者:生而自由爱而无畏,转载请注明原文链接:https://www.cnblogs.com/zczhaod/p/18869263