Python 淘宝联盟自动登录

上节讲了如何提取优惠券信息,需要获取 淘宝联盟 登录后得 Cookie ,从而可以进一步获取到商品得优惠券信息。但是每次手动登录很麻烦有没有,为了能偷懒,我们当然要把这个给解决掉撒。

怎么解决呢,当然是自动登录了。如何自动登录呢,我们这里就要用到 chromedriver 了,相信做过 web 自动化测试得人看到这个就知道是什么东东啦。没错,这个就是 web 自动测试得神器了,它可以按我们编写得流程去操作浏览器。这样我们就可以用 chromedriver 来写个程序来实现自动登录,并获取到登录后得 Cookie 了。

  1. 首先我们打开淘宝联盟的登录页面 http://pub.alimama.com/ 。

  1. 然后按 F12 打开浏览器的调试工具,了解登录页面 账号密码 框的节点信息,方便我们的 chromedriver 更方便的获取到账号、密码的输入框。

  1. 我们已经找到了对应的节点了,那么代码该怎么写呢。

首先我们需要初始化一个 webdriver 对象。

# 初始化一个 webdriver 对象
browser = webdriver.Chrome('./chromedriver.exe')
browser.maximize_window()
browser.get(login_url)

然后利用 webdriver 获取到对应的 账号密码节点,并模拟输入我们的账号信息。

# 输入账号密码
print u'输入账号密码'
static_button = device.find_element_by_id('J_Quick2Static')
static_button.click()
time.sleep(random.uniform(0.5, 2))
_input_simulation(device.find_element_by_id('TPL_username_1'), '17xxxxxxxxxx')
time.sleep(random.uniform(0.5, 2))
# browser.find_element_by_id('TPL_password_1').send_keys('abcdefgh')
_input_simulation(device.find_element_by_id('TPL_password_1'), 'yh86047659')

模拟输入登录信息。原本我们可以直接使用 send_keys 方法将我们的信息一次性输入到输入框,但是这样容易被检测未恶意登录。所以我们这里模拟人输入会有间断停顿的方式来输入信息。

# 模拟输入
def _input_simulation(e, text):
    for i in range(len(text)):
        sleep_time = random.randint(8, 30)
        time.sleep(sleep_time / 10)
        e.send_keys(text[i])
  1. 账号密码信息 填写完毕后,当然是点击登录啦。

点击登录,直接使用 submit() 就可以模拟表单提交操作啦,就是这么简单。

device.find_element_by_id('J_SubmitStatic').submit()
  1. 登录完毕后,自然就是获取我们所需要的 Cookie 啦。直接使用 get_cookies() 方法就可以拿到我们所需要的 Cookie 了。
cookies = {item["name"]: item["value"] for item in browser.get_cookies()}

这样我们就实现了自动登录 淘宝联盟 并获取登录后的 Cookie 了。


补充:
虽然我们已经尽量避免了被识别为恶意性攻击登录,但还是不免出现。这个时候就会淘宝联盟就会弹出验证框。

检测是否有滑动验证框,检测是否有滑动验证,我们只需要判断页面的滑动部分的 html 节点是否存在,就可以判断是否有验证存在了。节点存在则验证存在,节点不存在,则验证不存在。

# 判断是否有滑动验证
def _has_move(device):
    yanzhen = device.find_element_by_id('nocaptcha')
    style = yanzhen.get_attribute('style')
    if style == 'display: block;':
        return True
    return False

模拟滑动验证框,模拟滑动,我们可以使用 ActionChains.move_by_offset 来实现 按压拖动 滑动模块。

# 模拟滑动
def _move_simulation(device, e):
    try:
        action = ActionChains(device)
        action.click_and_hold(e).perform()
        # action.reset_actions()
        offset = 21
        for i in range(210 / offset):
            ActionChains(device).move_by_offset(xoffset=offset, yoffset=0).perform()
            time.sleep((offset - i) / 50)
        action.release().perform()
        action.reset_actions()
    except Exception as e:
        if DEBUG: print e

源码

  • Github:https://github.com/iQuick/TB-Crawler

其它

  • chromedriver 各版本对应下载地址
  • chromedriver 配置及使用

你可能感兴趣的:(优惠券,Python)