话不多说直接上代码
# 编写时间2021/6/8;19:57
# 编写 :刘钰琢
from selenium import webdriver
import time
from chaojiying import Chaojiying_Client
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
from PIL import Image
from selenium.webdriver import ActionChains
chaojiying_path='C:\爬虫文件\Chaojiying_Python'
chrome_path='C:\爬虫文件\chromedriver.exe'
def get_code(filename):
chaojiying = Chaojiying_Client('userlyz', '20010509liu', '917379') # 用户中心>>软件ID 生成一个替换 96001
im = open(filename, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
result=chaojiying.PostPic(im, 9004) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
#print(result)
return(result)
option=ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])
drive=Chrome(options=option)
bor=webdriver.Chrome(executable_path='chromedriver.exe',options=option)
bor.maximize_window()
# bor.execute_script("document.body.style.zoom='0.8'")
#打开登录界面
bor.get('https://kyfw.12306.cn/otn/resources/login.html')
#进入网页
login=bor.find_element_by_class_name("login-hd-account")
login.click()
time.sleep(1)
#save_screenshot就是将当期那页面进行截图保存
code_img=bor.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div[2]/div[3]/div/div[4]/img')
code_img_ele=code_img.screenshot('code.png')
location_all=code_img.location
print('location',location_all)
file='code.png'
result=get_code(file)#将验证码提交超级鹰
data=result["pic_str"]
location=[]
if '|'in data:
items=data.split("|")
count_items=len(items)
for i in range(count_items):
xy_list=[]
x=int(items[i].split(',')[0])
y=int(items[i].split(',')[1])
xy_list.append(x)
xy_list.append(y)
location.append(xy_list)
else:
xy_list = []
x = int(data.split(',')[0])
y = int(data.split(',')[1])
xy_list.append(x)
xy_list.append(y)
location.append(xy_list)
print(location)
#遍历列表
for loca in location:
x=loca[0]
y=loca[1]
ActionChains(bor).move_to_element_with_offset(code_img,x,y).click().perform()
time.sleep(0.5)
time.sleep(1)
login_user=bor.find_element_by_id("J-userName")
login_user.send_keys('用户名')
login_password=bor.find_element_by_id("J-password")
login_password.send_keys('密码')
login_button=bor.find_element_by_id("J-login")
login_button.click()
time.sleep(100)
bor.quit()
中间有很多插曲,比如说
找不到验证码区域
刚开始按照老师那个方法就是线截取全屏,之后在寻找那个验证码区域在进行二次截取
后来发现不太行,怎么该就是在左边左上角那一片区域
就看评论发现竟然可以直接截取验证码哪一个区域,然后我就在出阿宝工具里边找到验证码区域的一个xpath位置
对他直接进行截取
code_img=bor.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div[2]/div[3]/div/div[4]/img')
code_img_ele=code_img.screenshot('code.png')
location_all=code_img.location
这一个代码既可以得到他的位置也可以直接通过他进行截屏处理,真的是太nice,就像下边一样
那么接下来的填写数据也就是顺理成章的事情了,简直不要太简单
就是最后12306可能是发现用的是selenium登录的会给一个那个滑块去验证