selenium

  • 概述
  • 思路分析
  • 1. 登录淘宝网
  • 2. 输入用户名和密码
  • 3. 访问购物车
  • 4. 提交订单并确认支付
  • 完整代码


概述

每当双十一等购物节到来的时候,我们经常需要熬夜到凌晨来对心仪的商品进行抢购。那么,有没有一种可以避免我们熬夜却可以清空购物车的方法呢?今天我就给大家提供一种思路,即使用python+selenium爬虫技术实现淘宝购物车的清空。

思路分析

1. 登录淘宝网

登录淘宝网的网址为https://login.taobao.com/,因此我们首先应该使用selenuim模块对此网址进行访问,这里以chrome浏览器为例。为了防止被淘宝网检测出,我们需要进行相关设置来规避检测。

from selenium import webdriver
from selenium.webdriver import ChromeOptions  # 实现规避检测

options = ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
bro = webdriver.Chrome('./chromedriver.exe', options=options)
bro.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
            Object.defineProperty(navigator, 'webdriver', {
              get: () => undefined
            })
          """
        })
bro.get('https://login.taobao.com')
2. 输入用户名和密码

在登陆之前,我们需要获取登录的用户名和登录密码。然后通过通过浏览器“检查”的方式,定位到输入用户名和密码的文本框,以及登录的按钮。

# 需要登录,输入用户名和密码
input_button = self.bro.find_element_by_name('fm-login-id')
input_button.send_keys(self.account)
passwd_button = self.bro.find_element_by_name('fm-login-password')
passwd_button.send_keys(self.password)
login_button = self.bro.find_element_by_css_selector('.fm-button')
login_button.click()
3. 访问购物车

在登陆以后,我们的目的是清空购物车,因此我们需要访问购物车。默认我们清空购物车,所以购物车里面多余的商品请先暂时清理掉。如果购物车是空的,则无法清空,因此需要设置异常处理机制。

bro.get('https://cart.taobao.com/cart.htm?t=1624499530235')
    try:
        choose_all = self.bro.find_element_by_css_selector('.select-all')
        choose_all.click()
    except:
        print("购物车是空的,请添加商品到购物车后重试!")
        bro.quit()
4. 提交订单并确认支付

进入提交环节,我们首先点击提价订单按钮,接着确认支付,输入支付密码,最后再次提交即可。最后使用的电脑是常用机器,否则可能会出现多余的安全验证环节。

# 提交订单
submit_btn = self.bro.find_element_by_id('J_Go')
submit_btn.click()

# 确认支付
go_btn = self.bro.find_element_by_css_selector('.go-btn')
go_btn.click()

# 输入支付密码
input_passwd_btn = bro.find_element_by_css_selector('.sixDigitPassword')
        input_passwd_btn.send_keys(self.payment_password)
confirm_btn = self.bro.find_element_by_css_selector('.ui-button')
confirm_btn.click()
bro.quit()

完整代码

from selenium import webdriver
from time import sleep
from selenium.webdriver import ChromeOptions  # 实现规避检测
import datetime as dt


class ShopTaobao(object):
    def __init__(self, account, password, payment_password):
        # 实现selenium规避被检测的风险
        options = ChromeOptions()
        options.add_experimental_option('excludeSwitches', ['enable-automation'])
        self.bro = webdriver.Chrome('./chromedriver.exe', options=options)

        self.bro.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
            Object.defineProperty(navigator, 'webdriver', {
              get: () => undefined
            })
          """
        })

        self.account = account
        self.password = password
        self.payment_password = payment_password
        self.bro.maximize_window()

    def login(self):
        self.bro.get('https://login.taobao.com')
        # 需要登录,输入用户名和密码
        input_button = self.bro.find_element_by_name('fm-login-id')
        input_button.send_keys(self.account)
        passwd_button = self.bro.find_element_by_name('fm-login-password')
        passwd_button.send_keys(self.password)
        login_button = self.bro.find_element_by_css_selector('.fm-button')
        login_button.click()
        sleep(1)

        # 进入购物车,全选所有的商品
        self.bro.get('https://cart.taobao.com/)
        try:
            choose_all = self.bro.find_element_by_css_selector('.select-all')
            choose_all.click()
            sleep(2)
        except:
            print("购物车是空的,请添加商品到购物车后重试!")
            self.bro.quit()

    def submit(self):
        # 提交订单
        submit_btn = self.bro.find_element_by_id('J_Go')
        submit_btn.click()
        sleep(3)

        # 确认支付
        go_btn = self.bro.find_element_by_css_selector('.go-btn')
        go_btn.click()
        sleep(3)

        # 输入支付密码
        input_passwd_btn = self.bro.find_element_by_css_selector('.sixDigitPassword')
        input_passwd_btn.send_keys(self.payment_password)
        confirm_btn = self.bro.find_element_by_css_selector('.ui-button')
        confirm_btn.click()
        sleep(10)
        self.bro.quit()

if __name__ == '__main__':
    # 设置执行时间
    target_time = '2021-11-10 23:59:59'

    while True:
        if dt.datetime.now().strftime('%Y-%m-%d %H:%M:%S') == target_time:
            try:
                shop = ShopTaobao('淘宝账户', '淘宝账户密码', '支付宝支付密码')
                # 登录淘宝
                shop.login()
                # 提交订单
                shop.submit()
            finally:
                print("提交订单完毕,请检查您的购物车是否已被清空!")
                break