python-爬虫-解决反爬机制-登录淘宝

#-*- coding: utf-8 -*-
"""
1、先手动登录获取cookie
2、获取cookie保存在taobaoCookies.pickle 文件中
3、使用cookie去请求网页

"""
import os
import pickle
import time

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

brower = webdriver.Chrome()
wait = WebDriverWait(brower, 10)

#获取driver打开浏览器的对象
def get_browser():
    options = webdriver.ChromeOptions()
    #打开开发者模式
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    #打开浏览器后不关闭
    options.add_experimental_option("detach", True)
    #禁用Blink功能
    options.add_argument("--disable-blink-features=AutomationControlled")
    driver = webdriver.Chrome(options=options)
    #覆盖window.navigate.webdriver
    #打开浏览器后在控制台输入:window.navigator.webdriver    看返回是否是undefined-说明浏览器没有识别是selenium打开的浏览器、如果是true说明是被反爬了
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": """
                Object.defineProperty(navigator, 'webdriver', {
                    get: () => undefined
                })
        """
    })
    return driver

#获取cookie
def get_cookie(index_url, login_url):
    driver = get_browser()
    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信息
def read_cookies(index_url, login_url):
    if os.path.exists('taobaoCookies.pickle'):
        read_path = open('taobaoCookies.pickle', 'rb')
        #pickle.load(read_path) 反序列化、将文件内容反序列化为 python对象
        tbCookies = pickle.load(read_path)
    else:
        tbCookies = get_cookie(index_url, login_url)

    return tbCookies

#使用cookie去访问网页
def request_adress(index_url):
    tbCookies = read_cookies(index_url, login_url)
    driver = get_browser()
    driver.get(index_url)

    #向当前浏览器会话中添加一个cookie
    for cookie in tbCookies:
        driver.add_cookie({
            "domain": ".taobao.com",            #这是cookie的域名、域名前有一个 . 表示对所有的子域名都有效
            "name": cookie,                     #cookie名称
            "value": tbCookies[cookie],         #cookie的值
            "path": '/',                        #这是cookie的路径。'/'表示该cookie对于域名的所有路径都是有效的
            "expires": None                     #这是cookie的过期时间。None表示该cookie没有过期时间,即它是一个会话cookie,当浏览器会话结束时它会被删除
        })

    #再次请求网页-带cookie请求
    driver.get(index_url)

    print("登录后在这里针对淘宝做一些操作了。。。。。。。。。。。。")


if __name__ == '__main__':

    index_url = "https://www.taobao.com/"   #淘宝首页
    login_url = "https://login.taobao.com/member/login.jhtml"   #淘宝登录界面

    #第一次登录要打开此函数用来获取cookie
    #get_cookie(index_url, login_url)
    #time.sleep(2)

    #当获取cookie后打开这个函数去访问网页就不需要再登陆了
    request_adress(index_url)

 

posted @ 2024-06-12 16:58  little小新  阅读(193)  评论(0编辑  收藏  举报