使用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()

完成

经验分享 程序员 微信小程序 职场和发展