python爬虫之获取谷歌浏览器所有cookie

前言:爬虫大家肯定都不陌生了,但是有的网站就设计了爬虫反爬虫的措施,下面就介绍一下爬虫的思路

先来彻底了解一下cookie(笔记哈)

cookie介绍:

cookie是保存在客户机中以键值对形式存储的少量信息的文本文件(重点),是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。

定义于 RFC2109 和 2965 中的都已废弃,最新取代的规范是 RFC6265

cookie的工作流程:

cookie 其实是存储在浏览器中的纯文本,这个文件路径也很好找,下面会详细的说明。(不要着急)

当网页要发http请求时,浏览器会先检查是否有相应的cookie,有则自动添加在request header中的cookie字段中。这些是浏览器自动帮我们做的,每次都会被浏览器自动放在http请求中。

但在 localStorage 出现之前,cookie被滥用当做了存储工具。什么数据都放在cookie中,即使这些数据只在页面中使用而不需要随请求传送到服务端。当然cookie标准还是做了一些限制的:每个域名下的cookie 的大小最大为4KB,每个域名下的cookie数量最多为20个(但很多浏览器厂商在具体实现时支持大于20个)。

cookie的分类:

cookie分为会话cookie和持久cookie,会话cookie是指在不设定它的生命周期expires时的状态,浏览器的开启到关闭就是一次会话,当关闭浏览器时,会话cookie就会跟随浏览器而销毁。当关闭一个页面时,不影响会话cookie的销毁。会话cookie就像我们没有办理积分卡时,单一的买卖过程,离开之后,信息则销毁。

持久cookie则是设定了它的生命周期expires,此时,cookie像商品一样,有个保质期,关闭浏览器之后,它不会销毁,直到设定的过期时间。对于持久cookie,可以在同一个浏览器中传递数据,比如,你在打开一个淘宝页面登陆后,你在点开一个商品页面,依然是登录状态,即便你关闭了浏览器,再次开启浏览器,依然会是登录状态。这就是因为cookie自动将数据传送到服务器端,在反馈回来的结果。持久cookie就像是我们办理了一张积分卡,即便离开,信息一直保留,直到时间到期,信息销毁。

cookie的位置

步入正题了哈

Chrome的Cookie存放位置:C:\Users\xxx\AppData\Local\Google\Chrome\User Data\Default

进入这个文件夹可以发现一个cookie文件
在这里插入图片描述
查阅资料说是一个sqlite数据库文件,我们通过谷歌浏览器访问的网站所产生的sookie都存在这个文本文件里,打开后就是这个样子
在这里插入图片描述
乱码一大片,不过仔细观察还能发现点东西的

是不是似曾相识的感觉,以百度页面为例
在这里插入图片描述
这点东西就是我们后面需要用的

爬取cookie

在我第一次接触爬虫的时候,是用的java爬取的数据,大概意思也就是模拟浏览器的操作去获取页面,再通过页面解析数据,这样的方法很简单,但是存在一个问题,就是页面的数据有时候异常的不准确(我也不知道是不是我的问题)

后来我就接触了python,因为爬虫学的好监狱进的早

python代码,需要者自取

import csv
import sqlite3
import urllib3
import os
import json
import sys
import base64
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def dpapi_decrypt(encrypted):
    import ctypes
    import ctypes.wintypes
    class DATA_BLOB(ctypes.Structure):
        _fields_ = [('cbData', ctypes.wintypes.DWORD),
                    ('pbData', ctypes.POINTER(ctypes.c_char))]
    p = ctypes.create_string_buffer(encrypted, len(encrypted))
    blobin = DATA_BLOB(ctypes.sizeof(p), p)
    blobout = DATA_BLOB()
    retval = ctypes.windll.crypt32.CryptUnprotectData(
        ctypes.byref(blobin), None, None, None, None, 0, ctypes.byref(blobout))
    if not retval:
        raise ctypes.WinError()
    result = ctypes.string_at(blobout.pbData, blobout.cbData)
    ctypes.windll.kernel32.LocalFree(blobout.pbData)
    return result
def aes_decrypt(encrypted_txt):
    with open(os.path.join(os.environ['LOCALAPPDATA'],
                           r"Google\Chrome\User Data\Local State"), encoding='utf-8', mode="r") as f:
        jsn = json.loads(str(f.readline()))
    encoded_key = jsn["os_crypt"]["encrypted_key"]
    encrypted_key = base64.b64decode(encoded_key.encode())
    encrypted_key = encrypted_key[5:]
    key = dpapi_decrypt(encrypted_key)
    nonce = encrypted_txt[3:15]
    cipher = Cipher(algorithms.AES(key), None, backend=default_backend())
    cipher.mode = modes.GCM(nonce)
    decryptor = cipher.decryptor()
    return decryptor.update(encrypted_txt[15:])
def chrome_decrypt(encrypted_txt):
    if sys.platform == 'win32':
        try:
            if encrypted_txt[:4] == b'x01x00x00x00':
                decrypted_txt = dpapi_decrypt(encrypted_txt)
                return decrypted_txt.decode()
            elif encrypted_txt[:3] == b'v10':
                decrypted_txt = aes_decrypt(encrypted_txt)
                return decrypted_txt[:-16].decode()
        except WindowsError:
            return None
    else:
        raise WindowsError
def get_cookies_from_chrome(domain):
    sql = f'SELECT name, encrypted_value as value FROM cookies where host_key like "%{domain}%"'
    filename = os.path.join(
        os.environ['USERPROFILE'], r'AppData\Local\Google\Chrome\User Data\default\Cookies')
    con = sqlite3.connect(filename)
    con.row_factory = sqlite3.Row
    cur = con.cursor()
    cur.execute(sql)
    cookie = ''
    for row in cur:
        if row['value'] is not None:
            name = row['name']
            value = chrome_decrypt(row['value'])
            if value is not None:
                cookie += name + '=' + value + ';'
    return cookie
if __name__ == '__main__':
    domain = 'XXXX'   # 目标网站域名
    cookie = get_cookies_from_chrome(domain)
    print(cookie)

上面就是获取浏览器cookie的代码(防止利用cookie恶意获取数据导致ip被封,所以用的时候慎重啊)

//爬取  域名为  www.baidu.com
COOKIE_SESSION=165343_0_2_2_0_1_1_0_2_1_1_0_0_0_0_0_0_0_1634191707%7C2%230_0_1634191707%7C1;BD_CK_SAM=1;H_PS_645EC=5a9bnPpiFce%2FLUIneAaf4N2S8mBDccB8L8FVQWDT4G%2FvjC2RXTts8T2ry2c;BD_HOME=1;BD_UPN=12314753;

实例图片
这个是爬取出来的结果,差异性可以对照一下,具体使用的时候需要自己解析一下

目前对于高版本谷歌浏览器已经无法获取cookie,可前往查看 terminal data插件

谢谢捧场(= ̄ω ̄=)喵了个咪
在这里插入图片描述

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
这个获取谷歌cookies的源码目前只能获取谷歌8.0以下的版本,源码是别人分享出来的但是由于谷歌自动更新的机制,我刚开始使用的时候,也是一度差点怀疑人生,只能用几个小时,就自己自动升级版本了,然后就去研究8.0以上版本的解密方式,但由于不会java代码,目前还在研究中,这是8.0以上版本的java解密方式:https://github.com/mlkui/chrome-cookie-password-decryption 简单说明一下8.0以上版本的加密方式: 8.0以上版本用的是[color=var(--color-text-primary)  !important]Aes256Gcm加密,解密的key在\Google\Chrome\User Data\Local State这个文件里面, key也是经过winapi里面的DPAPI加密的,需要解密kay之后,才能拿到aes密钥,目前我还在研究怎么解开,希望有解开的大神分享一下,如果我解开了也会分享 这次分享主要是针对那些和我一样没能力的小白 先下载8.0以下版本的谷歌浏览器下载地址:https://www.chromedownloads.net/chrome64win/  目前我用的是6.9 我也是随便找了一个 安装完后,阻断谷歌浏览器更新(这一步非常重要,如果没阻断就会自动更新,重启了谷歌浏览器后,用这个源码就取不到cookies了) 阻断方式我也是百d到的 第一步:右键我的电脑>管理>任务计划程序>任务计划程序库   找到 GoogleUpdate 的两个项目,然后右键禁用,然后在 右键>属性>触发器  将所有触发器的任务删除,两个都操作一遍 第二步:找到文件夹Update位置在:AppData\Local\Google里面 第三步:将Update这个目录给删了,然后在创建一个空的Update 第三步:右键Update>属性>安全>编辑 吧上面的所有组和用户名的SYSTEM权限,全部点拒绝,就是设置所有用户组都不能访问读取和执行这个文件夹 第四步:打开任务管理器>启动 找到GoogleUpdateCore 右键禁用 (我的是win10系统) 然后在重启一下电脑就行了

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GG_com

1分也是爱!!!!!!!!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值