12306模拟登录


话不多说直接上代码

# 编写时间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,就像下边一样
code.png
那么接下来的填写数据也就是顺理成章的事情了,简直不要太简单
就是最后12306可能是发现用的是selenium登录的会给一个那个滑块去验证


文章作者: 毛豆不逗比
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 毛豆不逗比 !
  目录
{% include '_third-party/exturl.swig' %} {% include '_third-party/bookmark.swig' %} {% include '_third-party/copy-code.swig' %} + {% include '_custom/custom.swig' %}