python selenium 自动化登录12306
1.下载依赖包
pip install selenium # 自动化必须的包
2.下载驱动
# 下载驱动 https://npm.taobao.org/mirrors/chromedriver
小编这儿用的是chrome浏览器,下载对应自己浏览器版本的驱动包
我是windows电脑(根据个人情况适当下载)
把下载到的驱动放到python的安装目录
3.开始代码编程
- 第一步 : 访问12306首页,获取到登录按钮(copy xpath路径)
# 打开浏览器
browser = Chrome()
# 设置浏览器窗口大小
browser.set_window_size(1400, 1000)
# 访问12306首页
browser.get("https://www.12306.cn/index/")
# 获取[登录]按钮
login_button = browser.find_element_by_xpath('//*[@id="J-header-login"]/a[1]')
# 点击登录
login_button.click()
- 第二步 : 到登录页面之后, 获取账号登录按钮并点击
# 等待账号登录按钮加载出来
element = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "login-hd-account"))
)
# 或者直接睡眠2s钟
time.sleep(2)
# 账号登录按钮
account_button = browser.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
account_button.click()
-
第三步 : 识别验证码,使用超级鹰注册一个账号,可以免费识别(有分数限制);有不懂得小伙伴可以私聊或者查看超级鹰的api
# 图片验证码 img_by_xpath = browser.find_element_by_xpath('//*[@id="J-loginImg"]') # 超级鹰识别验证码 # 注册之后会有自己的软件id 和 key # 软件ID: 123456 # 软件KEY: ****************** chaojiying = Chaojiying_Client('12312337866', '123456', '9197123') # 用户中心>>软件ID 生成一个替换 96001 # {'err_no': 0, 'err_str': 'OK', 'pic_id': '1147221486687400002', 'pic_str': '180,125|125,132', 'md5': 'e6060d7b4b8a01cb261074cb15c2401e'} coordinate_dic = chaojiying.PostPic(img_by_xpath.screenshot_as_png, 9004) print(coordinate_dic) # 点击两个相同的动物或物品,返回:x1,y1|x2,y2 dic_pic_str_ = coordinate_dic['pic_str'] str__split = dic_pic_str_.split("|") for rs in str__split: temp = rs.split(',') x = int(temp[0]) y = int(temp[1]) # 点击选中图片 # 事件链 # 点击返回的坐标即可 # 这儿必须有perform()提交事件链操作哦,不要忘了 ActionChains(browser).move_to_element_with_offset(img_by_xpath,x, y).click().perform()
-
第四步 : 输入用户名和密码 ,点击登录
# 输入用户名 密码 点击登录
login_account = browser.find_element_by_xpath('//*[@id="J-userName"]')
login_password = browser.find_element_by_xpath('//*[@id="J-password"]')
# 输入自己的用户名密码
login_account.send_keys('1234567890')
login_password.send_keys('123123123')
time.sleep(2)
submit_button = browser.find_element_by_xpath('//*[@id="J-login"]')
submit_button.click()
-
第五步 : 滑块校验
# 拖动滑块校验
drag_button = browser.find_element_by_xpath('//*[@id="nc_1_n1z"]')
# 鼠标点击滑块拖动300像素
ActionChains(browser).drag_and_drop_by_offset(drag_button, 300, 0).perform()
-
各位小伙伴到这儿可能发现还是登录不上,原因就是12306网站(中国最牛逼的网站,怎么可能那么容易哦)
登录不上是因为网站已经识别出来是自动化登录的,所以我们需要关闭掉自动化标识
chrome 88版本以后的浏览器
#chrome 版本88以后,用下面这种方法 options = Options() options.add_argument('--disable-blink-features=AutomationControlled') # 打开浏览器 browser = Chrome(options=options)
chrome 88版本以前的浏览器
options = Options() options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) browser = Chrome(options=options, executable_path='./chromedriver') browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ })
到这儿就到此结束了,可以登录上了.
4.完整代码
附上完整代码,亲测可以运行的哦(需要修改为自己的用户名密码哦)
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time
from pyfile.chaojiying import Chaojiying_Client
if __name__ == '__main__':
# 12306 登录测试
# 防止服务器识别出是自动化控制 window.navigator.webdriver
# chrome 版本88以前用这种方法
'''
options = Options()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
browser = Chrome(options=options, executable_path='./chromedriver')
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
'''
#chrome 版本88以后,用下面这种方法
options = Options()
options.add_argument('--disable-blink-features=AutomationControlled')
# 打开浏览器
browser = Chrome(options=options)
# 设置浏览器窗口大小
browser.set_window_size(1400, 1000)
# 访问12306首页
browser.get("https://www.12306.cn/index/")
# 获取[登录]按钮
login_button = browser.find_element_by_xpath('//*[@id="J-header-login"]/a[1]')
# 点击登录
login_button.click()
try:
element = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "login-hd-account"))
)
print(element)
time.sleep(2)
# 账号登录按钮
account_button = browser.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
account_button.click()
time.sleep(3)
# 图片验证码
img_by_xpath = browser.find_element_by_xpath('//*[@id="J-loginImg"]')
# 超级鹰识别验证码
# 软件ID: 919703
# 软件KEY: ce58a05f244fa7eb31dc6309186d9b72
chaojiying = Chaojiying_Client('18512345678', '12345678', '999999') # 用户中心>>软件ID 生成一个替换 96001
# {'err_no': 0, 'err_str': 'OK', 'pic_id': '1147221486687400002', 'pic_str': '180,125|125,132', 'md5': 'e6060d7b4b8a01cb261074cb15c2401e'}
coordinate_dic = chaojiying.PostPic(img_by_xpath.screenshot_as_png, 9004)
print(coordinate_dic) # 点击两个相同的动物或物品,返回:x1,y1|x2,y2
dic_pic_str_ = coordinate_dic['pic_str']
str__split = dic_pic_str_.split("|")
for rs in str__split:
temp = rs.split(',')
x = int(temp[0])
y = int(temp[1])
# 点击选中图片
# 事件链
ActionChains(browser).move_to_element_with_offset(img_by_xpath,x, y).click().perform()
time.sleep(2)
# 输入用户名 密码 点击登录
login_account = browser.find_element_by_xpath('//*[@id="J-userName"]')
login_password = browser.find_element_by_xpath('//*[@id="J-password"]')
login_account.send_keys('13612345678')
login_password.send_keys('13612345678')
time.sleep(2)
submit_button = browser.find_element_by_xpath('//*[@id="J-login"]')
submit_button.click()
time.sleep(2)
# 拖动滑块校验
drag_button = browser.find_element_by_xpath('//*[@id="nc_1_n1z"]')
ActionChains(browser).drag_and_drop_by_offset(drag_button, 300, 0).perform()
except Exception as e:
print(e)
有想交流的小伙伴可以关注公众号哦