淘宝爬虫 之 登陆验证(二)

淘宝作为一大电商网站,反爬措施还是相当的完善的,在我的文章中 淘宝爬虫 之 登陆验证(一)是以cookie验证的,这次用selenium模拟登陆,用过selenium登陆淘宝的应该知道登陆页面对selenium的检测是很严格的,只要一打开就会被检测到,网上也有说用其他登陆方式登陆的(支付宝登陆),我试过,可行,不过今天说的是正常的账号密码登陆。

from selenium import webdriver

from selenium.webdriver import ActionChains

import time

#打开一个浏览器对象

driver = webdriver.Chrome()

#打开淘宝登陆页面

driver.get('https://login.taobao.com/member/login.jhtml')

#模拟点击到账号密码登陆

driver.find_element_by_id("J_Quick2Static").click()

#输入账号密码

driver.find_element_by_id("TPL_username_1").send_keys("账号")

password = driver.find_element_by_id("TPL_password_1").send_keys("密码")

time.sleep(1)

#模拟滑块滑动

slider = driver.find_element_by_xpath("//*[@id='nc_1_n1z']")

# 平行移动鼠标

action = ActionChains(driver)

action.drag_and_drop_by_offset(slider,500,0).perform()

#模拟点击登陆

driver.find_element_by_id("J_SubmitStatic").click()

运行这段代码会出现一个滑块,无论怎么滑,手动滑都会被检测到,因为当你用selenium打开的时候就会被淘宝后端验证出来是个机器人,那么如何解决呢?当然是找到淘宝是怎么验证的了,经过在网上查找各种资料(技术大牛还是很多的),在开发者模式下输入window.navigator.webdriver会发现selenium打开的浏览器和正常的浏览器打开的有所不同。

淘宝爬虫 之 登陆验证(二)_第1张图片
1-1

1-1就是selenium打开的浏览器,为true,但是正常浏览器打开的并不是true,淘宝应该就是通过这个方法检测selenium的。

淘宝爬虫 之 登陆验证(二)_第2张图片
1-2

正常浏览器打开的是undefined或者false,那么如何修改呢?

下面我说的是一个抓包工具 fiddler,用它将登陆页面的js替换掉,换成我们修改过的js文件,将window.navigator.webdriver的值改变,就可以绕过淘宝检测了。

首先找到淘宝登陆页面的js

淘宝爬虫 之 登陆验证(二)_第3张图片
1-3

将里面的js代码保存起来,在我们保存起来的js代码中加入我们自己的代码。

Object.defineProperties(navigator,{

    webdriver:{

        get:() =>false

    }

})


淘宝爬虫 之 登陆验证(二)_第4张图片
1-4

然后就是替换了,打开我们的fiddler,先运行一下我们刚才无法登陆的代码,在fiddler中找到登陆页面的js,将这个js代码拖动到右边,3的位置就是我们自己js的路径

淘宝爬虫 之 登陆验证(二)_第5张图片
1-5

替换好js文件之后就可以运行了,就会发现登陆的滑块检测已经不会出现了,,因为滑块不会出现了,所以代码需要改变一下,

from seleniumimport webdriver

import time

#打开一个浏览器对象

driver = webdriver.Chrome()

#打开淘宝登陆页面

driver.get('https://login.taobao.com/member/login.jhtml')

#模拟点击到账号密码登陆

driver.find_element_by_id("J_Quick2Static").click()

#输入账号密码

driver.find_element_by_id("TPL_username_1").send_keys("账号")

password = driver.find_element_by_id("TPL_password_1").send_keys("密码")

time.sleep(1)

#模拟点击登陆

driver.find_element_by_id("J_SubmitStatic").click()

可以登陆成功了,再看一次window.navigator.webdriver,发现它已经变成了false了

淘宝爬虫 之 登陆验证(二)_第6张图片
1-6

带上selenium自动登陆页面的cookie就可以爬取数据了

获取cookies后要转换到相应的字典格式,才能正常访问,

需要cookies中的name和value属性再组成一个cooies字典,然后requests.get带上cookies就可以正常请求页面了


纯代码解决模式,建议多种方法一起用

参考一:https://www.cnblogs.com/cloudbird/p/10524611.html

设置开发者模式

options = webdriver.ChromeOptions()

# 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium

options.add_experimental_option('excludeSwitches', ['enable-automation'])

driver = webdriver.Chrome(options=options)

如果不行了,想办法改一下chromedriver源代码

参考二:https://www.jianshu.com/p/368be2cc6ca1

最后浏览器仍然存在问题的话

driver.execute_script('Object.defineProperties(navigator,{webdriver:{get:()=>false}})')

修改浏览器的webdriver

你可能感兴趣的:(淘宝爬虫 之 登陆验证(二))