python爬虫selenium滑块验证出错(selenium处理滑动验证码)
为什么用脚本刷网页过两天会出现滑块验证
是因为网站识别出你是使用selenium 。
滑块验证码是在网站、APP等应用中常见的一种验证方式,通过按照一定规则滑动滑块到指定位置完成验证,才可以进行下一步操作。滑块验证码有两种设计,一种是在滑动框内“一滑到底”即完成验证的,还有一种是滑动滑块拼合拼图完成验证的。
由于拼图式的滑块验证码安全性更高,趣味性更强,所以多数网站或APP都选择了拼图式的滑块验证码。
安全事项:
浏览器是用来检索、展示以及传递Web信息资源的应用程序
。Web信息资源由统一资源标识符(Uniform Resource Identifier,URI)所标记,它是一张网页、一张图片、一段视频或者任何在Web上所呈现的内容。浏览器是我们上网必备的工具。
而在我们使用浏览器的过程中有可能因为操作失误造成一些安全隐患
,所以如何保证浏览器的安全就非常重要了。下面以IE8浏览器为例来对浏览器进行安全管理
python+Selenium之自动滑块破解滑块验证码
头大系列:以虎嗅网注册页面的滑块验证码为例:
打开浏览器调试工具,点击左上角按钮进行页面元素跟踪,然后将鼠标移动到滑块验证码的图像上,就发现问题了,这也是关键所在:
验证码的图像是由很多个这样的10x58(宽10高58)的小方块拼接而成的。再检查一下元素标签,发现每一个小方块的元素标签里面都有background-image:url以及background-position这两个关键的信息。
既然是url,就不妨打开链接来观察。发现打开的链接是一张图片,但却是一张乱七八糟的图片。
得到这张乱七八糟的图片,第一感觉是重影。试猜想,会不会将每一个小方块的url链接图片都重叠在一起或拼接在一起就能组成我们所看到的验证码图片。
但经打开每一张图片发现,每个小方块后面的url链接的图片是一样的。
这就说明不可能是将图片进行重叠或拼接了。那就有可能是另外一种可能:将这张完整的验证码图片的部分区域切割然后打乱排序,形成一张新的图片,而这张新的图片就是我们现在所看到的乱七八糟的图片。
再观察发现,每个小方块后面还有background-position这个重要的信息。发现里面正是-157px -58px; -145px -58px;这种形式,是不是很像坐标的形式了。而进一步猜想,将我们刚刚的乱七八糟的图按每一个小方块的坐标进行切割,然后再进行排序,是不是就能得到原来完整的验证码图片了。
进行实践:
运用PIL模块的切割crop()以及粘贴paste(),重新将图片进行整合。效果神奇出现:
先不管其他了的。先把两张完整的图片拼接出来再进行下一步吧。
按照相同的方法,找到页面元素中鼠标点击后的出现缺口的验证码图片位置,找到缺口图片乱七八糟的url链接。
通过相同方法拼接:
已经得到两张关键的验证码图片,那接下来就是PIL大显身手的时候了,对比两张图片的像素点,缺口位置明显黑了一块,也就是RGB三色必然与周围的像素RGB三色差别明显。
将两张图片的每个像素点进行遍历对比,RGB三色任意一色差距大于一定的范围即视为是滑块的缺口。
找到缺口之后返回遍历的像素点的x坐标值(因为滑块只能X轴左右移动,所以y轴可以不需要用到),而x坐标就是滑块需要移动的距离。
完美拼接。但被吃了,也是美中不足:
快速,匀速,准确,所谓的“快,准,稳”,一样不差。
那就认定你是机器人来滑动的吧,把你吃掉!
使用selenium+python中爬取页面点击下一页时出现该错误应该如何解决
Element a href="javascript:fornextpage()".../a is not clickable at point (939, 560). Other element would receive the click: div class="tc experience" style="left: 13px; display: block;".../div
英文不是很好,不过大概意思是元素所在的点point (939, 560)不可点击,其他元素接收到点击信号了
Python爬虫 用selenium时遇到了问题,如下:
class后面是两个分开的属性,你只要写一个就行了。写俩就不能用空格。
rs = web.find_element_by_class_name('rate-count').text
Selenium自动化时滑块验证处理
Selenium中对滑块的操作基本是采用元素拖拽的方式,而这种方式需要用到Selenium的Actionchains功能模块的drag_and_drop_by_offset方法
drag_and_drop_by_offset(source,xoffset,yoffset)
source:鼠标拖动的原始元素
xoffset:鼠标把元素拖动到另一个位置的x坐标
yoffset:鼠标把元素拖动到另一个位置的y坐标
思路 :1. 获取滑块元素,求出滑块的长度和宽度?
? ? ? ? ? ? ? 获取滑块区域元素,求出其长度和宽度
? ? ? ? ? ?2. 使用drag_and_drop_by_offset方法移动滑块到滑块区域的最大长度及宽度
以携程网登录页面举例
"""实现携程网站的登录功能"""
from seleniumimport webdriver
import time
from selenium.webdriver.common.action_chainsimport ActionChains
driver = webdriver.Chrome("C:/Users/Administrator/PycharmProjects/untitled/chromedriver.exe")
driver.implicitly_wait(30)
driver.get(";allianceid=4897ouid=index")
driver.maximize_window()
# 点击登录
driver.find_element_by_css_selector("#nav-bar-set-login a span").click()
# 登录账号
account =123
driver.find_element_by_id('nloginname').send_keys(account)
# 登录密码
password ="***"
driver.find_element_by_id('npwd').send_keys(password)
# 拖动滑块
slider = driver.find_element_by_css_selector("#sliderddnormal div.cpt-drop-box div.cpt-drop-btn")
# print(slider.size['width'])? ? 方便理解,打印出来40px
# print(slider.size['height'])? ?打印出来40px
slider_area = driver.find_element_by_css_selector("#sliderddnormal div.cpt-drop-box div.cpt-bg-bar")
# print(slider_area.size['width'])??打印出来288px
# print(slider_area.size['height'])? 打印出来40px
ActionChains(driver).drag_and_drop_by_offset(slider,slider_area.size['width'],slider.size['height']).perform()
time.sleep(3)