自动化|selenium+python||通过cookies登录CSDN失败原因总结

之前用cookies登录FANS网站美美成功,但是这次登录csdn发现总是失败,总结一下原因。发现网上搜的原因都比较简单,最后还是不断自查,打印,发现问题根源,挺值得记录的。所以记录下。比较全。可以耐心看看。

一开始在网上查到的代码框架:

python 复制代码
                cookie_dict = {
                    'domain': domain,  # 必须有,不然就是假登录
                    'name': cookie.get('name'),
                    'value': cookie.get('value')
                }

初步原因自查:

1.Cookies 是否过期

最简单的自查方法,重新登录获取cookies,然后再用最新的cookies

要严格验证的话:直接看cookies.pkl看cookies的过期时间

2.域名是否完全匹配(***)

浏览器当前的域名必须与 Cookie 所属的域名完全匹配:比如,你是在 www.csdn.net 保存的 Cookie,却在 passport.csdn.net 或刚打开的空页面添加,就会失败。这个可以F12看,然后打印cookies查看一下就行。

这个点很关键,其实很大部分原因都是因为域名未完全匹配。有可能部分值匹配了,但部分不匹配。

首先自查:

保存cookies是否是在www.csdn.net但添加时停留在passport.csdn.net,就会失效

python 复制代码
            cookies = pickle.load(open("cookies.pkl", "rb"))  # 载入cookie
            for cookie in cookies:
                if 'expiry' in cookie:
                    # selenium需要的是整数类型的expiry
                    cookie['expiry'] = int(cookie['expiry'])
                try:
                    driver.add_cookie(cookie)
                except Exception as e:
                    print(f"添加cookie:{cookie.get('name')}失败:{e}")
                print('cookie_name:'+cookie.get('name'))
                print('cookie_value:'+cookie.get('value'))
                print('cookie_domain:'+cookie.get('domain'))
3.关键的cookies值是否携带

关键:userName userInfo session

自查方法:和上面一样打印出来看就行啦

4.页面加载与跳转的时机

这个是deepseek搜的,所以在refresh之前加了time.sleep()

5.隐藏自动化特征

CSDN 这类大型网站有能力检测到浏览器正受 Selenium 自动化控制,并可能因此拒绝建立有效的登录会话

上代码:

python 复制代码
chrome_options = Options()
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_experimental_option('useAutomationExtension', False)
6.自查csdn的cookies

F12-Application-cookies自己看就行

最后发现原因:

原因一:domain去了登录页

csdn的登录体系比较复杂,访问主站www.csdn.net时,如果检测到未登录,可能会立即自动跳转去登录中心passport.csdn.net。如果是跳转之后才添加cookies,实际上是添加到登录页domain里了,所以导致domain不正确,还是没登录!

这里要确保一开始get(url)去的页面和抓的cookies去的页面是同一个域名哦!

建议就是直接url = 'https://www.csdn.net/',然后通过点击登录(而不是去搜索文章,触发登录)来登录获取cookies

原因二:domain取值写的不对,把domain写死了,而不是把正确值直接赋值。

cookies里面不同属性是不同域名的,底层框架用cookies登录的代码里,只是把cookies的domain都塞了固定值(.csdn.net),而不是灵活地把正确值(不同domain)存下来。

一开始在网上抓代码的时候,用了最简单笼统的方法获取domain:(domain本人写死了......)

python 复制代码
                # cookie_dict = {
                #     'domain': domain,  # 必须有,不然就是假登录
                #     'name': cookie.get('name'),
                #     'value': cookie.get('value')
                # }

后来打印domain的时候,发现用cookies登录后,F12看,cookies少了很多关键值,于是......开始看不同关键值的domain,发现,最关键的cookie值的domain没有塞正确。

于是改良后:

python 复制代码
        try:
            cookies = pickle.load(open("cookies.pkl", "rb"))  # 载入cookie
            for cookie in cookies:
                if 'expiry' in cookie:
                    # selenium需要的是整数类型的expiry
                    cookie['expiry'] = int(cookie['expiry'])
                # cookie_dict = {
                #     'domain': domain,  # 必须有,不然就是假登录
                #     'name': cookie.get('name'),
                #     'value': cookie.get('value')
                # }
                try:
                    driver.add_cookie(cookie)
                except Exception as e:
                    print(f"添加cookie:{cookie.get('name')}失败:{e}")
                print('cookie_name:'+cookie.get('name'))
                print('cookie_value:'+cookie.get('value'))
                print('cookie_domain:'+cookie.get('domain'))

关键点:在循环里添加cookie,无需给domain做特殊处理。

上代码:(这里只上最关键的代码,底层框架自己写哦~)

保存cookies:

python 复制代码
    def get_cookies(self, driver):
        '''登录成功后获取cookies'''
        print(driver.get_cookies())
        pickle.dump(driver.get_cookies(), open("cookies.pkl", "wb"))
        print('-----------------------获取cookies成功-----------------')

获取cookies登录:

python 复制代码
    def add_cookies(self, driver, domain):
        try:
            cookies = pickle.load(open("cookies.pkl", "rb"))  # 载入cookie
            for cookie in cookies:
                if 'expiry' in cookie:
                    # selenium需要的是整数类型的expiry
                    cookie['expiry'] = int(cookie['expiry'])
                # cookie_dict = {
                #     'domain': domain,  # 必须有,不然就是假登录
                #     'name': cookie.get('name'),
                #     'value': cookie.get('value')
                # }
                try:
                    driver.add_cookie(cookie)
                except Exception as e:
                    print(f"添加cookie:{cookie.get('name')}失败:{e}")
                print('cookie_name:'+cookie.get('name'))
                print('cookie_value:'+cookie.get('value'))
                print('cookie_domain:'+cookie.get('domain'))
            # driver.add_cookie(cookie_dict)
        except Exception as e:
            print(e)
        return driver

登录:

python 复制代码
def prestep(is_chrome_keep_opening=False):
    # global driver
    is_cookies = True
    dop = Driver_op()
    url = 'https://www.csdn.net/'
    is_chrome_keep_opening = True  # 是否关闭浏览器
    service = Service(r'D:\1pyu\pythonProject\automatic_project_csdn\resource\chromedriver.exe')

    if is_chrome_keep_opening:
        option = webdriver.ChromeOptions()
        option.add_experimental_option("detach", True)
        option.add_argument('--ignore-certificate-errors')  # 忽略连接警告信息
        option.add_argument("lang=zh_CN.UTF-8")
        option.add_argument('--disable-blink-features=AutomationControlled')
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        option.add_experimental_option('useAutomationExtension', False)
        driver = webdriver.Chrome(options=option, service=service)  # 初始化chrome驱动
    else:
        driver = webdriver.Chrome()  # 初始化chrome驱动

    driver.maximize_window()  # 最大化窗口
    driver.get(url)  # 先访问
    if is_cookies:
        time.sleep(3)
        driver = dop.add_cookies(driver, domain='.csdn.net')
        driver.get(url)  # 进入
        print('利用cookies登录成功')
        driver.refresh()
        print(driver.get_cookies())
    print('当前浏览器:' + driver.current_url)
    # global oper
    oper=Operation(driver=driver)
    return oper, driver, is_cookies
相关推荐
tang777892 小时前
爬虫代理报错速查:407/408/409/410/503 从报错到根治(实测可用)
爬虫·爬虫代理·动态代理ip·代理ip·503·407·爬虫报错
微硬创新3 小时前
耐达讯自动化16路0-20mA转PROFINET协议转换模块技术说明
人工智能·网络协议·自动化·信息与通信
小柒儿3364 小时前
从单Agent到多智能体系统:多智能体协作重塑自动化边界
运维·自动化
未来之窗软件服务6 小时前
商家自动化任务下一代架构混沌无界思维-东方仙盟
架构·自动化·仙盟创梦ide·东方仙盟·自动化任务
QYR-分析6 小时前
注塑机机械手自动化装备行业发展研判:存量升级催生增量红利,2032 年市场规模逼近 9 亿美元
运维·自动化
自动化测试行业观察7 小时前
从“自动化”到“智能化”:TestMan AI测试平台引领软件测试范式转移
运维·自动化测试·人工智能·测试工具·自动化·app测试·移动应用测试
RPA机器人就用八爪鱼9 小时前
八爪鱼RPA客服质检自动化:会话记录采集与关键词分析方案
运维·自动化·rpa
小白学大数据9 小时前
Python 爬虫实战:抓取汽车之家二手车成交价格与里程数据
开发语言·爬虫·python·汽车
hoaxxcj10 小时前
多智能体把云可靠性工程自动化:NeurIPS 2025 的 STRATUS 比 SOTA 强 1.5 倍,还顺手定了条“安全规范“
运维·安全·自动化·大模型·ai论文·前沿解读
听你说3211 小时前
鹏辉LIC+EDLC高功率电容解决方案,为工业自动化、智能IoT、UPS备电等高负载设备而生
人工智能·物联网·自动化·创业创新