WebDriver被识别反爬虫解决办法
我们将爬虫的爬取过程分为网络请求,文本获取和数据提取3个部分。信息校验型反爬虫主要出现在网络请求阶段,这个阶段的反爬虫理念以预防为主要目的,尽可能拒绝爬虫程序的请求。动态渲染和文本混淆则出现在文本获取及数据提取阶段,这个阶段的反爬虫理念以保护数据为主要目的,尽可能避免爬虫获取到重要数据。
特征识别反爬虫是指通过客户端的特征、属性或用户行为特点来区分正常用户和爬虫程序的手段。
WebDriver识别
爬虫程序可以借助渲染工具从动态网页中获取数据,“借助”其实是通过对应的浏览器驱动(及Webdriver)向浏览器发出指令的行为。也就是说,开发者可以根据客户端是否包含浏览器驱动这一特征来区分正常用户和爬虫程序。
WebDriver识别原理
网页只要设置了检查webdriver的Javascript方法,就很容易发现爬虫。使用的方法就是Navigator对象的webdriver属性,用这个属性来判断客户端是否通过WebDriver驱动浏览器。如果监测到客户端的webdriver属性存在,则无法继续操作获取数据。selenium,Puppeteer都存在WebDriver属性。
window.navigator.webdriver
undefined
监测结果有3种,分别是true、false和undefind。当我们使用渲染工具有webdriver属性时,navigation.webdriver的返回值时true。反之则会返回false或者undefind。
WebDriver识别的绕过方法
了解了WebDriver识别的原理和返回值后,我们就能相处应对的办法。既然web Driver的识别依赖navigation.webdriver的返回值,那么我们在触发Javascript办法前将navigation.webdriver的返回值改为false或者undefind,问题就解决了。
script = 'Object.defineProperty(navigator,"webdriver",{get:() => false,});'
使用示例
from selenium.webdriver import Chrome
import time
brower = Chrome(executable_path=r'D:\python\chromedriver_win32\chromedriver.exe')
url = 'http://www.porters.vip/features/webdriver.html'
brower.get(url)
script = 'Object.defineProperty(navigator,"webdriver",{get:() => false,});'
#运行Javascript
brower.execute_script(script)
#定位按钮并点击
brower.find_element_by_css_selector('.btn.btn-primary.btn-lg').click()
#定位到文章内容元素
elements = brower.find_element_by_css_selector('#content')
time.sleep(1)
print(elements.text)
brower.close()
值得一提的是,淘宝的登录滑块验证页面也是用到了这个方法,使用selenium套件操作滑块后会出现“哎呀,出错了,点击刷新再来一次”这样的提示。
注意
这种修改该属性值的办法只在当前页面有效,当浏览器打开新标签或新窗口时需要重新执行改变navigator.webdriver值的JavaScript代码。