爬虫入门(关于cookie和session)

Cookie

当我们在淘宝上进行登录,购买东西的时候,用户登录的状态是必须要有的。工作当中是需要这个状态的,但是http协议是不负责维持这个状态的。所以,浏览器就想了个办法,搞了一个本地化存储,来保持这个状态。本地保存的这个东西,每次发送请求的时候,浏览器会自动携带该信息。这个本地化的存储,我们就叫它cookie。

Cookie的生成过程:

  1. cookie的生成不一定是单纯的在浏览器端...,一开始可能是从服务器创建好的一个随机字符串,该随机字符串和一堆用户信息,形成映射关系。{字符串:一大堆用户信息}。
  2. 服务器会把随机字符串返回给浏览器。通过响应头里面的set-cookie把该随机字符串返回给浏览器。
  3. 浏览器接收到set-cookie的响应头之后. 自动把该值, 保存在浏览器的cookie当中。
  4. 以后. 只要是发生在该网站的请求(参考标准是依赖于url的). 都会自动携带该随机字符串。
  5. 这样的话. 服务器端就能知道客户端的相关的信息了。

上述过程,叫做保持回话(Session)。所以,cookie可以保持住用户的状态。
cookie的本质就是在浏览器端,保存一个值,以后所有的请求都能携带着这个值。

Cookie如何来进行处理:

从生成逻辑:

  1. 服务器生成.
    特征(必须记住), 响应头里面通过set-cookie把值带过来.
    此时, 该值, 是由服务器生成的. 所以生成规则. 你是不知道的...
    此时, 不要妄想能本地生成该值...

  2. 浏览器生成.
    浏览器可以执行javascript脚本. 脚本是可以进行计算. 并处理cookie的.
    有可能该值, 是通过浏览器端的js代码执行. 计算而得...
    此时, 你是可以看到该值的生成过程的...后期逆向的时候. 很多都是这玩意..
    特征(必须记住), 你在响应头里. 找不到该值. 但是呢发请求又有这个值...

处理逻辑:

  1. 直接从浏览器把cookie复制出来.丢到请求头. 直接用即可..
    优点: 简单.粗暴
    问题: cookie的值是有时效性的. cookie值会过期, 需要重新复制一个..

  2. 可以使用resp.cookie, 把响应头中的cookie值拿出来. 传递给下一个请求
    resp = requests.get(url)
    resp2 = requests.get(url, cookie=resp.cookie) # 手工携带cookie

  3. 推荐. 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)
posted @ 2025-05-10 08:33  生而自由爱而无畏  阅读(16)  评论(0)    收藏  举报