selenium的各种使用,以及模拟12306登录

  • selenium 与 爬虫有何关系?
    - 便捷的获取网站中动态加载的数据
    - 便捷的进行模拟登陆
  • 什么是selenium?
    • 基于浏览器自动化的模块
  • selenium使用流程:
    • 安装selenium

    • 下载一个浏览器的安装驱动(例如谷歌)

      • 下载路径:http://chromedriver.storage.googleapis.com/index.html
      • 驱动程序和浏览器的映射关系:http://blog.csdn.net/huilan_same/article/details/51896672
      • 编写基于浏览器自动化的操作代码
        可以百度输入路飞学城查找。
    • selenium处理iframe(一种作用域)

      • 如果定位标签存在于iframe标签之中,则必须使用bro.switch_to.iframe(id)
      • 动作链(拖动):from selenium.webdriver import ActionChins
        • 实例化对象:ActionChins(bro)
        • click_and_hold(div):长按并点击操作
        • move_by_offset(x,y)
        • perform() 立即执行动态链
        • action.release() 释放动作链对象
    • 12306模拟登陆
      -超级鹰(前面文章介绍过了,不做过多叙述)

      • 使用流程 官网:http://www.chaojiying.com/about.html
        • 注册
        • 登录
          • 题分查询充值
          • 创建软件(id)
          • 开发文档下载示例代码
    • 12306模拟登陆编码流程

      • 使用selenium打开登陆页面
      • 对当前selenium打开的页面进行截图
      • 对当前图片局部区域即验证码区域进行裁剪
        • 好处:将验证码图片和模拟登陆进行一一对应
      • 使用超级鹰进行验证码识别(返回相关坐标)
      • 对相关坐标进行点击
      • 操作验证码图片的相关代码
        首先先放一个senleium的基本使用代码。
from selenium import  webdriver
from lxml import etree
from time import sleep
#实例化浏览器兑现,传入浏览器的驱动程序
bro = webdriver.Chrome(executable_path='./chromedriver')
#让浏览器发起一个指定url对应请求
bro.get('http://125.35.6.84:81/xk/')
page_text = bro.page_source

#解析企业名称
tree = etree.HTML(page_text)
li_list = tree.xpath('//ul[@id="gzlist"]/li')
for li in li_list:
    name = li.xpath('./dl/@title')[0]
    print(name)
sleep(5)
bro.quit()

代码运行结果部分图片:
在这里插入图片描述
接下来看一下senleium的一些自动化操作,这些都可以百度查找到。

from selenium import webdriver
from time import sleep
#设置驱动程序
bro = webdriver.Chrome('./chromedriver')
bro.get('http://taobao.com/')
#标签定位
serach_input = bro.find_element_by_id('q')
#标签交互
serach_input.send_keys('Ipone')
#执行一组js程序
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(3)
#点击按钮
btn = bro.find_element_by_class_name('btn-search')
btn.click()

bro.get('http://www.baidu.com/')
bro.back()
sleep(2)
bro.forward()
sleep(2)
bro.quit()

可以自己运行一下看一下效果,我就不再放运行的结果了。
接下来是模拟QQ登陆的一个代码,当然我就不放我的QQ,最后结果肯定是登陆失败,大家可以输入自己的QQ和密码然后进行测试。

from selenium import webdriver
from time import sleep
#设置驱动程序
bro = webdriver.Chrome('./chromedriver')
bro.get('http://taobao.com/')
#标签定位
serach_input = bro.find_element_by_id('q')
#标签交互
serach_input.send_keys('Ipone')
#执行一组js程序
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(3)
#点击按钮
btn = bro.find_element_by_class_name('btn-search')
btn.click()

bro.get('http://www.baidu.com/')
bro.back()
sleep(2)
bro.forward()
sleep(2)
bro.quit()

最后就是我们的重头戏,12306的模拟登陆,因为这个的验证码识别是一个比较复杂的东西。

from selenium import webdriver
from time import sleep
from PIL import Image
from selenium.webdriver import ActionChains
#超级鹰下载示例代码
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()
#设置驱动
bro = webdriver.Chrome('./chromedriver')
#获取网页url
bro.get('https://kyfw.12306.cn/otn/resources/login.html')
sleep(1)
#标签定位到账号登陆,输入账号密码
login_in = bro.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
login_in.click()
sleep(2)
#下载验证码图片并保存
#使用bro.save_screenshot('./12306.jpg')进行整张页面的截取并存到本地
bro.save_screenshot('./12306.png')
#确定验证码图片的左上角和右下角坐标(确定裁剪区域)
code_img_ele = bro.find_element_by_xpath('//*[@id="J-loginImg"]')#定位图片
location = code_img_ele.location #验证码图片的左上角坐标下x,y
print(location)
size = code_img_ele.size    #验证码图片的长和宽
print(size)
#确定左上角和右下角坐标
rangle =(int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))
#验证码图片区域确定下来了
#进行分割
i = Image.open('./12306.png')
code_ing_name = ('./12306yanzhengma.png')
#crop根据指定区域进行裁剪
frame = i.crop(rangle)
frame.save(code_ing_name)
#识别验证码图片
chaojiying = Chaojiying_Client('a1372431588', '970110yy', '905838')	#用户中心>>软件ID 生成一个替换 96001
im = open('./12306yanzhengma.png', 'rb').read()													#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print(chaojiying.PostPic(im, 9004)['pic_str'])
sleep(2)
result = chaojiying.PostPic(im, 9004)['pic_str']
all_list =[]#要存储即将被点击的点的坐标[[x1,y1],[x2,y2]]
if '|' in result:
    list_1 = result.split('|')
    print(list_1)
    count_1=len(list_1)
    print(count_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)
print(all_list)
code_img = bro.find_element_by_xpath('//*[@id="J-loginImg"]')
action = ActionChains(bro)
for l in all_list:
    x = l[0]
    y = l[1]
    ActionChains(bro).move_to_element_with_offset(code_img,x,y).click().perform()
username = bro.find_element_by_id('J-userName')
username.send_keys('a1372431588')
sleep(2)
passward = bro.find_element_by_id('J-password')
passward.send_keys('970110yy')
sleep(2)
#点击登录按钮
login = bro.find_element_by_id('J-login')
login.click()

sleep(5)
bro.quit()

代码中的注释非常清晰,相信大家是可以看懂的,超级鹰的使用大家可以参考前面文章,此处的验证码图片的获取主要是进行截图操作,整张页面截图后,然后划定验证码图片所在区域,分割出来,然后进行读取,并进行点击操作,即可完成验证码图片的识别。

猜你喜欢

转载自blog.csdn.net/qwerty1372431588/article/details/106735934