模拟登陆12306
.对12306进行模拟登陆.
需使用到超级鹰. 以对超级鹰板块截切。。。
http://www.chaojiying.com/user/mysoft/
import time
from PIL import Image
from base64 import b64decode
from selenium.webdriver import ActionChains
#对12306界面发请求
bro=webdriver.Chrome(executable_path=chromedriver路径')
bro.get('https://kyfw.12306.cn/')
bro.maximize_window()#网页最大化
time.sleep(3)
#点击到账号登陆
#find_elements_by_xpath无法点击
a=bro.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
a.click()
time.sleep(3)
#对整个界面截图
bro.save_screenshot('screen.png')
#用xpath找到验证码位置 定位图片位置,获取 src 的属性值
#get_attribute(‘src’) 会把换行符替换为"%0A",因此解码的时候要替换回去。
code_img_ele=bro.find_element_by_xpath('//*[@id="J-loginImg"]').get_attribute('src')
code_img_name= code_img_ele.split(",")[-1] # 删除前面的 “data:image/jpeg;base64,”
img_str = code_img_name.replace("%0A", '\n') # 将"%0A"替换为换行符
img_data = b64decode(img_str) # b64decode 解码
#保存图片
with open('./captcha.jpeg', 'wb') as fout:
fout.write(img_data)
fout.close()
```chaojiying = Chaojiying_Client('xxxx', 'xxxxx', '******') #用户中心>>软件ID 生成一个替换 96001
im = open('./captcha.jpeg', 'rb').read()
#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print (chaojiying.PostPic(im, 9004)['pic_str'])
result=chaojiying.PostPic(im, 9004)['pic_str']
time.sleep(0.5)
all_list=[]#存储坐标
#定位到验证码的区域
if '|' in result:
list_1 = result.split('|')#将超级鹰返回的坐标用‘|’分割列表
count_1=len(list_1)#list_1的长度
for i in range(count_1):
xy_list=[]
x=int(list_1[i].split(',')[0])
y = int(list_1[i].split(',')[1])
xy_list.append(x)
xy_list.append(y)
all_list.append(xy_list)
else:
xy_list = []
x = int(result.split(',')[0])
y = int(result.split(',')[1])
xy_list.append(x)
xy_list.append(y)
all_list.append(xy_list)
for loc in all_list:
x=loc[0]
y=loc[1]
#实例化动作链,并且定位到验证码图片里进行点击正确的图片
code_img_eles = bro.find_element_by_xpath('//*[@id="J-loginImg"]')
ActionChains(bro).move_to_element_with_offset(code_img_eles, x, y).click().perform()
time.sleep(0.5)
#输入账号与密码
bro.find_element_by_id('J-userName').send_keys('*******')
time.sleep(1)
bro.find_element_by_id('J-password').send_keys('*******')
time.sleep(1)
bro.find_element_by_id('J-login').click()
time.sleep(1)
#出现滑块,并对滑块进行处理
span=bro.find_element_by_id('nc_1_n1z')
action=ActionChains(bro)
action.click_and_hold(span)
action.drag_and_drop_by_offset(span,400,0).perform()
while True:
try:
info=bro.find_element_by_xpath('//*[@id="J-slide-passcode"]/div/span').text
print(info)
if info=='哎呀,出错了,点击刷新再来一次':
#点击刷新
bro.find_element_by_xpath('//*[@id="J-slide-passcode"]/div/span/a').click()
time.sleep(0.2)
#重新移动滑块
span = bro.find_element_by_xpath('//*[@id="nc_1_n1z"]')
action = ActionChains(bro)
# 点击长按指定的标签
action.click_and_hold(span).perform()
action.drag_and_drop_by_offset(span, 400, 0).perform()
time.sleep(5)
except:
print('ok!')
break
action.release()
time.sleep(50)
bro.quit()
本文仅做供学习交流,内容仅做参考