因为工作需要,需要抓取淘宝上一些商品详情信息,而商品详情信息必须要在登陆以后才能进行访问,所以想要抓取商品信息,模拟登陆是第一个必须要解决的问题。

淘宝的模拟登陆说难也不难,说不难,也蛮多坑的。今天就在这把我破解淘宝登陆的整个完整过程,细细给你说来。(PS:看完后,觉得有帮助,麻烦点个在看呗!)

一、思路:

获取你在网上已经找了很多资料,用fiddler工具或者mitmproxy代理设置response,然后修改js,目的是为了掩盖自己是selenium驱动的真相,也就是想修改window.navigator.webdriver的属性。这种方法听起来很美丽,但是实践起来还是不太理想。今天我们用到的技术栈是selenium+chromedriver,后面的修改都是针对这两个来的。

二、关键点:

不浪费大家时间,直接上重点。要想破解淘宝的登录,必须要解决两个问题:

  1. 修改webdriver的特有标识。

  2. 修改window.navigator.webdriver值为false

三、隐藏chromedriver身份:

1. 修改webdriver特有标识

根据stackoverflow论坛解决方案(见:https://stackoverflow.com/questions/33225947/can-a-website-detect-when-you-are-using-selenium-with-chromedriver),chromedriver.exe文件中,有一个特有的属性key用来标记自己身份的,这个key有一定的规则,一般是$cdc_开头,后面的字符串会不同,比如我的是这样的:
chromedriver.exe

我们要做的,就是将这一串字符串进行修改,怎么修改呢?前面的$cdc_不变,后面的随便修改成任意的字符,但是一定要注意的是:

字符的数量必须和原来的保持一致!!!

字符的数量必须和原来的保持一致!!!

字符的数量必须和原来的保持一致!!!

有小伙伴会有疑问哈,一个exe二进制文件怎么修改呢?可以用EditPlus或者vim,打开文件后,可以搜索$cdc就可以找到了,除了key的值修改,其他任何地方都不要进行任何修改,否则一定会出现问题。另外说一句,为了保险起见,最好先把之前的chromedriver.exe文件做个备份,即使新修改的文件有问题,也能及时的恢复。

在修改完后,双击这个文件,如果能打开一个终端,并且不会自己关闭,说明是修改成功,否则就是修改失败!

2. 修改window.navigator.webdriver属性值:

这个只能在爬虫代码中修改了,在selenium请求完页面后,然后立马执行一段js代码,将这个属性值设置为false。代码如下:

# 打开淘宝登录页面driver.get("https://login.taobao.com/member/login.jhtml?spm=a21bo.2017.754894437.1.5af911d9q07jcU&f=top&redirectURL=https%3A%2F%2Fwww.taobao.com%2F")# 定义js代码script = "Object.defineProperty(navigator,'webdriver',{get: ()=> false,});"# 执行js代码driver.execute_script(script)

四、突破滑块验证码:

这两个步骤都修改完后,基本上淘宝服务器就识别不出是selenium在驱动Chrome了,这时候就可以进行登录了。但是登录过程中,有可能会出现滑块验证码:

滑块验证码

这时候还需要进行滑块验证码的破解,其实淘宝的滑块验证码破解非常简单,他都不需要你模拟人的速度去滑,直接让代码从左边拉动到右边就可以。这里我们用selenium的ActionChains行为链来实现。代码如下:

try:    # 找到滑块
    slider = driver.find_element_by_xpath("//span[contains(@class, 'btn_slide')]")    # 判断滑块是否可见
    if slider.is_displayed():        # 点击并且不松开鼠标
        ActionChains(driver).click_and_hold(on_element=slider).perform()        # 往右边移动258个位置
        ActionChains(driver).move_by_offset(xoffset=258, yoffset=0).perform()        # 松开鼠标
        ActionChains(driver).pause(0.5).release().perform()except:    pass

至此,淘宝的模拟登陆,就已经做完了。在本帖子下随便回复,即可领取完整代码: