前言
我最近在鼓捣Selenium
,恰好有个朋友需要对淘宝进行一些自动化操作,于是就打算给他做个小工具,作为第一次接触Selenium
的练手。起初以为是一会儿的功夫,但由于之前没有研究过爬虫方面的东西,被淘宝的反爬虫机制搞得头疼,经过搜索才得知,原来Selenium
已经被各大网站列入“黑名单”了,所以淘宝也不例外,在登录方面加了一些验证机制。网上的各类方法我也试过不少,均是效果不佳,最后想了几个围魏救赵的法子,凑合应对了。
主要问题
淘宝在检测到Selenium
的时候,会触发验证机制,大致如下:
- 登录页面的默认显示会在
密码登录
和扫码登录
之间变换,具体变换条件没了解。 - 登录的时候会出现
滑块验证
。
罗列方案
以下方案测试时间为2019年5月31日
方案 | 尝试结果 | 是否支持headless | 备注 |
---|---|---|---|
手动滑动滑块 | 无效 | 否 | 滑动后提示出错 |
自动滑动滑块,即代码实现 | 无效 | 否 | 滑动后提示出错 |
使用Pyppeteer | 有效 | 否 | 登录正常,滑块验证成功,但速度慢,不能用headless 模式,不爽 |
修改Chromedriver.exe | 无效 | 未知 | 毫无作用 |
添加options.add_experimental_option('excludeSwitches', ['enable-automation']) ,即开发者模式 | 无效 | 否 | 毫无作用,还多一个恼人的提示 |
手动修改webdriver 返回值 | 无效 | 否 | 毫无作用 |
替换js 来修改webdriver 返回值 | 未尝试 | 未知 | 太麻烦 |
利用Cookie 免登陆 | 无效 | 是 | 直接利用浏览器获取的或者代码返回的Cookie 会在刷新后失效,需要进一步解析再构建淘宝Cookie ,但这不在研究范围内 |
使用mitmproxy | 未尝试 | 未知 | 太麻烦 |
改为淘宝H5移动端页面 | 无效 | 未知 | 不知道是不是代码问题,对于H5移动端页面,Selenium 的操作都失效了 |
直接手动扫码登录 | 有效 | 否 | 能正常登录,但不能用headless 模式,不爽 |
最后解决
最后我想了几个法子,既能使用headless
模式,又不需要花太多功夫。
- 利用
Selenium
的截图函数,在headless
模式下将淘宝登录二维码截图保存,再手动扫截图。 - 利用
https://qrlogin.taobao.com/qrcodelogin/generateQRCode4Login.do
这个接口直接获取淘宝二维码,再手动扫码。 - 利用淘宝登录页面下的
支付宝登录
进行绑定登录,通过其网页源码获取barcode
值(一个地址),利用代码将这个地址重新生成二维码,再手动扫码。
截图示例代码:
options = webdriver.ChromeOptions()
options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=options)
browser.implicitly_wait(8)
browser.get('https://login.taobao.com/member/login.jhtml')
browser.save_screenshot('.\\QRCode.png')
time.sleep(1)
os.startfile('.\\QRCode.png')