上节讲了如何提取优惠券信息,需要获取 淘宝联盟
登录后得 Cookie
,从而可以进一步获取到商品得优惠券信息。但是每次手动登录很麻烦有没有,为了能偷懒,我们当然要把这个给解决掉撒。
怎么解决呢,当然是自动登录了。如何自动登录呢,我们这里就要用到 chromedriver
了,相信做过 web 自动化测试得人看到这个就知道是什么东东啦。没错,这个就是 web 自动测试得神器了,它可以按我们编写得流程去操作浏览器。这样我们就可以用 chromedriver
来写个程序来实现自动登录,并获取到登录后得 Cookie
了。
- 首先我们打开淘宝联盟的登录页面 http://pub.alimama.com/ 。
- 然后按
F12
打开浏览器的调试工具,了解登录页面账号
、密码
框的节点信息,方便我们的chromedriver
更方便的获取到账号、密码的输入框。
- 我们已经找到了对应的节点了,那么代码该怎么写呢。
首先我们需要初始化一个 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])
-
账号
、密码信息
填写完毕后,当然是点击登录啦。
点击登录,直接使用 submit()
就可以模拟表单提交操作啦,就是这么简单。
device.find_element_by_id('J_SubmitStatic').submit()
- 登录完毕后,自然就是获取我们所需要的
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 配置及使用