python-爬虫-获取浏览器的cookies

1、封装浏览器对象

# -*- coding: utf-8 -*-
"""
封装类
将获取浏览器的对象封装成一个类
调用方法:
    1、import Get_Browser
    2、driver = Get_Browser.Get_Browsers().get_browser()
"""


from selenium import webdriver

class Get_Browsers:

    def __init__(self):
        pass

    def get_browser(self):
        self.options = webdriver.ChromeOptions()

        #打开开发者模式
        self.options.add_experimental_option('excludeSwitches', ['enable-automation'])

        #打开浏览器后不关闭
        self.options.add_experimental_option("detach", True)

        # 禁用Blink功能
        self.options.add_argument("--disable-blink-features=AutomationControlled")

        #创建浏览器对象
        self.driver = webdriver.Chrome(options=self.options)

        # 覆盖window.navigate.webdriver
        # 打开浏览器后在控制台输入:window.navigator.webdriver    看返回是否是undefined-说明浏览器没有识别是selenium打开的浏览器、如果是true说明是被反爬了
        self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
                        Object.defineProperty(navigator, 'webdriver', {
                            get: () => undefined
                        })
                """
        })


        return self.driver

2、登陆网页获取cookies

# -*- coding: utf-8 -*-
"""
1、首次登陆网页获取cookie
2、拿到cookie的name:value值并序列化对象 、保存在文件里
3、读取文件中的cookie(反序列化为python对象)、返回cookie
"""

import time, pickle, os
from Get_Browser import Get_Browsers

#获取登录网站的cookie
def get_cookie(index_url, login_url):
    """
    获取登录后的网页cookie
    :param index_url: 网页首页
    :param login_url: 网页登录界面
    :return: 返回 被序列化的 cookies
    """
    #打开登陆界面
    driver.get(login_url)

    while True:
        time.sleep(5)

        #这里看情况改(如果登录后的页面和首页不一致就不行了)
        while driver.current_url == index_url:

            #获取登陆后的cookie信息
            # #返回一个列表字典-每个个字典中含有一个 name:value 键值对 、这个就是cookie的 名称和值
            tbCookies = driver.get_cookies()
            driver.quit()
            #print(tbCookies)
            print('==' * 60)
            #遍历cookie
            cookies = {}
            for item in tbCookies:
                #取出每个字典中的name和value 的值
                cookies[item['name']] = item['value']

            #保存cookie
            output_path = open('taobaoCookies.pickle', 'wb')
            #将 Python 对象序列化保存到文件中
            #pickle.load(文件名) 反序列化、将文件内容反序列化为python对象
            pickle.dump(cookies, output_path)

            output_path.close()
            #print(cookies)
            return cookies


#读取获取的cookie信息-反序列化cookie为python对象
def read_cookies(filename, index_url, login_url):
    """
    读取被序列化的cookie文件转为python对象
    :param filename: 保存cookie文件名
    :param index_url: 网页首页
    :param login_url: 网页登录页
    :return:
    """
    if os.path.exists(filename):
        read_path = open(filename, 'rb')
        #pickle.load(read_path) 反序列化、将文件内容反序列化为 python对象
        tbCookies = pickle.load(read_path)
    else:
        tbCookies = get_cookie(index_url, login_url)

    return tbCookies


if __name__ == '__main__':
    # 实例化对象
    driver = Get_Browsers().get_browser()

    index_url = "https://www.taobao.com/"
    login_url = "https://login.taobao.com/member/login.jhtml"
    filename = "taobaoCookies.pickle"

    #首次手动登录获取cookie、这里可做判断、如果存在taobaoCookies.pickle 保存cookies的文件就跳过、不存在就调用类方法获取cookies
    #get_cookie(index_url, login_url)

    #使用这个cookie去请求网页即可
    #详情看:E:\learn\python\mode1\work脚本\使用脚本\爬虫\网页自动登录\login\淘宝登录.py 中的request_adress(index_url):函数
    cookies = read_cookies(filename, index_url, login_url)
    print(cookies)

 

posted @ 2024-06-12 17:26  little小新  阅读(75)  评论(0编辑  收藏  举报