背景介绍:

一般情况下,访问网站都会消耗服务器的资源。而机器人可以做到比人更快的访问速度,更持续的访问时间,这对网站资源占用消耗是远远超过人的,而当服务器资源被大量占用的时候, 就不能为人提供正常的网络服务。而且机器人一般是直接获取需要的数据,不加载不必要的的信息,速度大大超过人的浏览速度。例如很多网站都有图片,甚至广告,加载都需要时间。一个视频网站,好几年了几万条的数据,半个小时采集完成。这种高频率的访问,服务器就得满负荷工作,带宽也会被占据,最后别人要访问就会受限制。基于这样的一个背景下,很多网站会对一些自动化的工具去访问网页作出一些检测,并限制别人通过脚本的方式去进行访问。

比如,通过selenium去操作淘宝首页,去登录。再不做任何处理的情况下,你会发现,每次输入完账号密码之后,都会弹出一个要输入验证的框:

不同的网站,需要验证的信息可能不一样,有的可能是需要输入验证码,或者进行什么人机验证之类的,你可能会想,那就滑动一下进行验证就好了,事实上,这种被识别为自动化的脚本进行访问的,验证之后也出报错或者出现其他未知的异常:

网站是如何检测出来是机器人在操作的呢?

selenium在运行的时候会暴露出一些预定义的Javascript变量(特征字符串),例如"window.navigator.webdriver",在非selenium环境下其值为undefined,而在selenium环境下,其值为true(如下图所示为selenium驱动下Chrome控制台打印出的值)。

除此之外,还有一些其它的标志性字符串(不同的浏览器可能会有所不同),常见的特征串如下所示:

webdriver __driver_evaluate __webdriver_evaluate
__fxdriver_unwrapped __fxdriver_evaluate __selenium_evaluate
_Selenium_IDE_Recorder __selenium_unwrapped __driver_unwrapped
calledSelenium _WEBDRIVER_ELEM_CACHE __webdriver_unwrapped
_selenium driver-evaluate webdriver-evaluate
ChromeDriverw selenium-evaluate webdriverCommand
__webdriverFunc __webdriver_script_fn __$webdriverAsyncExecutor 
__lastWatirAlert __lastWatirConfirm __lastWatirPrompt
$chrome_asyncScriptInfo $cdc_asdjflasutopfhvcZLmcfl_  

了解了这个特点之后,就可以在浏览器客户端JS中通过检测这些特征串来判断当前是否使用了selenium,并将检测结果附加到后续请求之中,这样服务端就能识别并拦截后续的请求。

如何绕过网站的这个验证呢?

在微信群看到有人在问怎么绕过这个验证,然后往上查了一下资料,大部分给的方案是:

在启动浏览器的时候加上一些配置,比如:

option = webdriver.ChromeOptions()option.add_experimental_option("excludeSwitches", ['enable-automation'])driver = webdriver.Chrome(chrome_options=option)

试过了,发现不行,还有的说让手动把webdriver的属性设置为undefined:

​​​​​​​

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {   "source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""",})

发现这样设置之后,也并不能解决登陆淘宝网站的问题(或许不同网站的校验规则不一样,有的只是做了简单校验,淘宝的校验复杂点吧)。

最终,在网上查到了另一种方式,使用python的mitmproxy库进行操作。

顾名思义,mitmproxy 就是用于 MITM 的 proxy,MITM 即中间人攻击(Man-in-the-middle attack)。用于中间人攻击的代理首先会向正常的代理一样转发请求,保障服务端与客户端的通信,其次,会适时的查、记录其截获的数据,或篡改数据,引发服务端或客户端特定的行为。

使用 pip install mitmproxy

新建一个py文件,命名随意,这里命名为modify_response.py​​​​​​​

# coding: utf-8
# modify_response.pyfrom mitmproxy import ctxdef response(flow):"""修改响应数据"""if '/js/yoda.' in flow.request.url:# 屏蔽selenium检测for webdriver_key in ['webdriver', '__driver_evaluate', '__webdriver_evaluate', '__selenium_evaluate','__fxdriver_evaluate', '__driver_unwrapped', '__webdriver_unwrapped','__selenium_unwrapped', '__fxdriver_unwrapped', '_Selenium_IDE_Recorder', '_selenium','calledSelenium', '_WEBDRIVER_ELEM_CACHE', 'ChromeDriverw', 'driver-evaluate','webdriver-evaluate', 'selenium-evaluate', 'webdriverCommand','webdriver-evaluate-response', '__webdriverFunc', '__webdriver_script_fn','__$webdriverAsyncExecutor', '__lastWatirAlert', '__lastWatirConfirm','__lastWatirPrompt', '$chrome_asyncScriptInfo', '$cdc_asdjflasutopfhvcZLmcfl_']:ctx.log.info('Remove "{}" from {}.'.format(webdriver_key, flow.request.url))flow.response.text = flow.response.text.replace('"{}"'.format(webdriver_key), '"NO-SUCH-ATTR"')print(webdriver_key)flow.response.text = flow.response.text.replace('t.webdriver', 'false')flow.response.text = flow.response.text.replace('ChromeDriver', '')

然后运行脚本:

mitmdump.exe -p 端口号  -s modify_response.py

然后再执行selenium的脚本即可实现正常的通过selenium进行登录淘宝网站,之前设置的ChromeOptions也要加上。具体代码如下:​​​​​​​

from selenium import webdriver
from time import sleepoption = webdriver.ChromeOptions()
option.add_experimental_option("excludeSwitches", ['enable-automation'])driver = webdriver.Chrome(chrome_options=option)
driver.maximize_window()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})""",
})
driver.get('https://www.taobao.com/')
driver.find_element_by_link_text('亲,请登录').click()
sleep(2)
driver.find_element_by_xpath('//input[@name="fm-login-id"]').send_keys('淘宝用户名')
sleep(2)
driver.find_element_by_xpath('//input[@name="fm-login-password"] ').send_keys('对应的密码')
sleep(2)
driver.find_element_by_xpath('//div[@class="fm-btn"]').click()
sleep(10)
#driver.quit()

效果演示(会运行2次脚本,第一次运行脚本时没有启动mitmproxy代理,无法正常登录,启动代理后,可以正常登录):

未启动代理的效果:

启动代理后的效果:

总结

1、百度到的方法解决不了我们遇到的问题的时候,如何去解决?百度到的结果有时候只能为我们提供一个思路,尽量多看发帖时间在最近的,有的只是拿着以前别人写的东西copy一下,没有自己去实战过 ,并不一定能帮你解决问题,但是思路也许是对的

2、业务这边文章中的操作可以解决登录淘宝的问题,但或许不能解决所有的场景,需要针对不同的网站做些适当的调整,至于mitmproxy到底是什么,具体用法怎么用,为什么这么用 ,这里就不仔细介绍。

3、我觉得IT行业是一个更新换代非常快的行业,不管从事哪个岗位,培养一定的自学能力和解决问题的能力很重要,前辈们虽为我们总结和积累了很多经验,可以让我们少走一些弯路,但能够掌握解决问题的思路和方法更重要。

以淘宝为例教你如何突破网站对selenium的屏蔽相关推荐

  1. 淘宝为例进行软件质量属性分析

    以淘宝为例进行软件质量属性分析 1.可用性分析: 所关注的方面包括系统故障发生的频率.出现故障时会发生什么情况.允许系统有多长是将非正常运行.什么时候可以安全地出现故障.如何防止故障的发生以及发生故障 ...

  2. 淘宝商城,亚洲最大网上购物网站

    淘宝商城,亚洲最大网上购物网站--淘宝网打造的在线B2C购物平台(B2C,Business to Customer).在淘宝商城购物,享受100%正品保障.7天退换货.提供发票的服务. Q1>按 ...

  3. Python如何快速爬取淘宝MM呢?教你一招

    本篇目标 1.抓取淘宝MM的姓名,头像,年龄 2.抓取每一个MM的资料简介以及写真图片 3.把每一个MM的写真图片按照文件夹保存到本地 4.熟悉文件保存的过程 1.URL的格式 在这里我们用到的URL ...

  4. 淘宝自动回复机器人配置手册——禁用语设置(敏感词关键词屏蔽)

    配售前模板的时候顺带发现的一个不错的小功能 就是淘宝的禁用语,可以禁止客服发送一些敏感的关键词 比如(QQ,扣扣,微信) 马云爸爸和小马哥相爱相杀的故事 进入步骤见:https://blog.csdn ...

  5. 淘宝之外,最火爆的十个购物网站

           都说在这个时代,不会网购的人都OUT了!在这个购物网站遍地开花的年代,可千万别说你只知道淘宝!虽然我网购的时间也不是很长,还算是菜鸟,但我可是知道除了淘宝,最火爆的购物网站还有十家! 1 ...

  6. 淘宝网页显示不正常,其它网站正常显示---解决办法

    随便打开一个连接,进去后,网页就更加混乱了,其他网站都能正常显示的,就只有淘宝网这样.这是随便点击一个连接后的图片.. 旁边白白的一片... 个人电脑处于局域网,默认网关和DNS都为192.168.1 ...

  7. python + selenium实现自动登录操作(以淘宝为例)

    selenium操作不熟练的可以查看一下这篇文章:selenium操作大全 一.登录前准备操作 定位一下相对应html位置,输入一般为input标签.登录按钮一般为button. 输入账号密码那块: ...

  8. python制作购物秒杀脚本,以淘宝秒杀脚本为例!

    热爱python,请手动关注此微信公众号,大量实战干货,视频教程! 我们的目标是秒杀淘宝的订单,这里面有几个关键点: 首先需要登录淘宝 其次你需要准备好订单 最后要在指定时间快速提交订单 登录淘宝,这 ...

  9. 【淘宝开店教程】教你借618大促打造店铺爆款宝贝

    转载者: 商务ppt模板下载 搜索: 淘宝开店教程 教你借618大促打造店铺爆款宝贝 距离天猫618年中大促还有十多天,卖家与买家都是摩拳擦掌.而有经验的卖家们早已做好迎战准备,准备大赚一笔.机会总是 ...

最新文章

  1. 辩证看待 iostat
  2. 模块化数据中心成未来互联网企业首选
  3. Failed to install*.apk on device '': timeout
  4. 一个简单的Ajax开发框架
  5. 『PPYOLO tiny尝鲜』基于PaddleDetection的人脸疲劳检测
  6. Solr的安装步骤及增删改查代码示例
  7. Java ObjectStreamClass lookup()方法与示例
  8. 微信授权获取用户openid前端实现
  9. 第2节 storm实时看板案例:10、redis的安装使用回顾
  10. asp.net repeater控件
  11. weblogic对JSP预编译、weblogic读取JSP编译后的class文件、ant中weblogic.jspc预编译JSP
  12. java创建对象方法列表(转)
  13. 分享谷歌SEO的32个实用关键词拓展工具
  14. 特效字幕(ass)简易制作教程
  15. 如何使用Epicor Functions(一)
  16. 前端设计——音乐盒子
  17. 【ESP32_8266_WiFi (十四)】ESP8266多任务处理 – Ticker库使用说明
  18. oracle drop tablespace 恢复杀手锏
  19. new/delete与malloc/free的区别
  20. 如果通过股价均线分析股票

热门文章

  1. windows安装postgreSQL(超详细步骤)
  2. 【SQL】sqlzoo练习题Music Tutorial
  3. 【整理】双模双待、双卡双待、双模双待双通、双频手机
  4. ALB+EC2+MySQL
  5. [转]一个学中医的女生写出的保养大法
  6. Java程序员必读的入门进阶书单
  7. 简单的matlab程序实现单纯形法
  8. 【skLearn 分类、回归算法】DecisionTreeClassifier 分类树
  9. 稳定婚姻(tarjan)
  10. 微信平台之坐标系与位置