使用selenium自动滑动滑块
一些网站中存在一些图片验证码,例如12306,如下图 还会存在一些滑块操作,如下图。 如何自动实现? 使用selenium+超级鹰。 1、调库
from selenium.webdriver import Chrome from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.chrome.options import Options import time
2、selenium做爬虫能解决很多反爬问题,但是selenium也有很多特征可以被识别,比如用selenium驱动浏览器后window.navigator.webdriver值是true,而正常运行浏览器该值是未定义的(undefined)。 故需要覆盖window.navigator.webdriver的值。 使用语句
option = Options() option.add_argument(disable-blink-features=AutomationControlled)
3、打开网页
option = Options()
option.add_argument(disable-blink-features=AutomationControlled)
web = Chrome(options=option)
web.get("https://kyfw.12306.cn/otn/resources/login.html")
time.sleep(2)
web.find_element_by_xpath(/html/body/div[2]/div[2]/ul/li[2]/a).click()
time.sleep(5)
3、输入验证码和用户名
web.find_element_by_xpath(//*[@id="J-userName"]).send_keys("账号")
web.find_element_by_xpath(//*[@id="J-password"]).send_keys("密码")
verify_img_element = web.find_element_by_xpath(//*[@id="J-loginImg"])
4、引入超级鹰
import requests
from hashlib import md5
class Chaojiying_Client(object):
def __init__(self, username, password, soft_id):
self.username = username
password = password.encode(utf8)
self.password = md5(password).hexdigest()
self.soft_id = soft_id
self.base_params = {
user: self.username,
pass2: self.password,
softid: self.soft_id,
}
self.headers = {
Connection: Keep-Alive,
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0),
}
def PostPic(self, im, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
codetype: codetype,
}
params.update(self.base_params)
files = {
userfile: (ccc.jpg, im)}
r = requests.post(http://upload.chaojiying.net/Upload/Processing.php, data=params, files=files, headers=self.headers)
return r.json()
def ReportError(self, im_id):
"""
im_id:报错题目的图片ID
"""
params = {
id: im_id,
}
params.update(self.base_params)
r = requests.post(http://upload.chaojiying.net/Upload/ReportError.php, data=params, headers=self.headers)
return r.json()
5、验证
#超级鹰识别验证码
chaojiying = Chaojiying_Client(账号, 密码, id)#用户中心>>软件ID 生成一个替换 96001
dic = chaojiying.PostPic(verify_img_element.screenshot_as_png, 9004)
result = dic[pic_str]
print(result)
rs_list = result.split("|")
for rs in rs_list:
temp = rs.split(",")
x = int(temp[0])
y = int(temp[1])
ActionChains(web).move_to_element_with_offset(verify_img_element,x,y).click().perform()
web.find_element_by_xpath(//*[@id="J-login"]).click()
time.sleep(5)
验证图片验证码获取的坐标,即上边的result输出的是坐标
241,81
根据坐标来实现鼠标点击的位置 6、拖拽滑块
#完成拖拽 btn = web.find_element_by_xpath(//*[@id="nc_1__scale_text"]/span) ActionChains(web).drag_and_drop_by_offset(btn,520,0).perform()
完成
