模拟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()

版权声明:本文为tangjian219原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/tangjian219/p/12005183.html