淘宝作为一大电商网站,反爬措施还是相当的完善的,在我的文章中 淘宝爬虫 之 登陆验证(一)是以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就是selenium打开的浏览器,为true,但是正常浏览器打开的并不是true,淘宝应该就是通过这个方法检测selenium的。
正常浏览器打开的是undefined或者false,那么如何修改呢?
下面我说的是一个抓包工具 fiddler,用它将登陆页面的js替换掉,换成我们修改过的js文件,将window.navigator.webdriver的值改变,就可以绕过淘宝检测了。
首先找到淘宝登陆页面的js
将里面的js代码保存起来,在我们保存起来的js代码中加入我们自己的代码。
Object.defineProperties(navigator,{
webdriver:{
get:() =>false
}
})
然后就是替换了,打开我们的fiddler,先运行一下我们刚才无法登陆的代码,在fiddler中找到登陆页面的js,将这个js代码拖动到右边,3的位置就是我们自己js的路径
替换好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了
带上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