zoukankan      html  css  js  c++  java
  • 12306 模拟登陆

    超级鹰:

    #!/usr/bin/env python
    # coding:utf-8
    
    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()
    
    
    def codecjy():
        chaojiying = Chaojiying_Client('xxxx', 'xxxxxxx', '902590')#用户中心>>软件ID 生成一个替换 96001							用户名        密码        软件id
        im = open('./code.png', 'rb').read()#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        code=chaojiying.PostPic(im,9004)['pic_str']#1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()
        return code





    爬虫程序:

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from time import sleep
    from PIL import Image #安装PIL或者是Pillow
    from CJY import Chaojiying_Client
    
    #封装一个识别验证码的函数
    def transformCode(imgPath,imgType):
        chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰密码', '899370')
        im = open(imgPath, 'rb').read()
        return chaojiying.PostPic(im, imgType)['pic_str']
    
    
    bro = webdriver.Chrome(executable_path='./chromedriver.exe')
    
    bro.get('https://kyfw.12306.cn/otn/login/init')
    sleep(2)
    #将当前浏览器页面进行图片保存
    bro.save_screenshot('./main.png')
    #将验证码的局部区域进行裁剪
    #捕获标签在页面中的位置信息
    img_tag = bro.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')
    location = img_tag.location#标签的起始位置坐标(左下角坐标)
    size = img_tag.size#标签的尺寸
    #裁剪范围对应的矩形区域
    rangle = (int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))
    #使用Image工具进行指定区域的裁剪
    i = Image.open('./main.png')
    frame = i.crop(rangle)#crop就是根据指定的裁剪范围进行图片的截取
    frame.save('code.png')
    
    #调用打码平台进行验证码的识别
    result = transformCode('./code.png',9004)
    print(result) #x1,y1|x2,y2|x3,y3
    
    #x1,y1|x2,y2|x3,y3 ==>[[x1,y1],[x2,y2],[x3,y3]]
    all_list = []#[[x1,y1],[x2,y2],[x3,y3]]    验证码中图片中的点击内容的坐标
    if '|' in result:
        list_1 = result.split('|')
        count_1 = len(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:
        x = int(result.split(',')[0])
        y = int(result.split(',')[1])
        xy_list = []
        xy_list.append(x)
        xy_list.append(y)
        all_list.append(xy_list)
    
    
    for point in all_list:
        x = point[0]
        y = point[1]
        ActionChains(bro).move_to_element_with_offset(img_tag,x,y).click().perform()
        sleep(1)
    
    
    bro.find_element_by_id('username').send_keys('xxxxxx')  #12306用户名
    sleep(1)
    bro.find_element_by_id('password').send_keys('xxxx')   #密码
    sleep(1)
    
    bro.find_element_by_id('loginSub').click()  #点击事件,登录
    
    sleep(10)
    print(bro.page_source)
    bro.quit()
  • 相关阅读:
    spring二级缓存的ehcache 的 配置文件
    C/C++联合(Union)浅谈
    C++技巧之名字空间namespace
    VC动态调用DLL的调试方法
    在C++中调用DLL中的函数
    VS编译debug模式静态库(lib)的结尾_d修改
    bash: chkconfig: command not found
    Linux在防火墙中开放SVN端口
    VIM选择文本块/复制/粘贴
    svnserve.conf:12: Option expected的问题解决方法[SVN]
  • 原文地址:https://www.cnblogs.com/plyc/p/14502978.html
Copyright © 2011-2022 走看看