超级鹰(更简单的操作验证)
- 超级鹰 - 注册:普通用户 - 登陆: - 创建一个软件(id) - 下载示例代码
1.12306自动登录
# Author: studybrother sun from selenium import webdriver import time from selenium.webdriver import ActionChains from PIL import Image #截图用到的模块 bro = webdriver.Chrome(executable_path=r'./chromedriver.exe') bro.get('https://kyfw.12306.cn/otn/login/init') #这个网址和其他是有区别的 time.sleep(2) #img标签 code_img_ele = bro.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img') time.sleep(2) #验证码图片的左上角的坐标 location = code_img_ele.location # x,y print('验证码图片的左上角的坐标location:', location) size = code_img_ele.size # 验证码图片的长和宽 print('验证码图片的长和宽size:', size) #验证码左上角和右下角这两个点的坐标 rangle = ( int(location['x']), int(location['y']), int(location['x'] + size['width']), int(location['y'] + size['height']) ) #截取当前浏览器打开的这张页面对应的图像 bro.save_screenshot('aa.png') i = Image.open('./aa.png') #即将被截取下来验证码图片的名称 code_img_name = './code.png' #crop就可以根据左上角和右下角的坐标进行指定区域的截取 frame = i.crop(rangle) frame.save(code_img_name) 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 # 898175 self.base_params = { 'user': self.username, 'pass2': self.password, 'softid': self.soft_id, # 898175 } 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() chaojiying = Chaojiying_Client('xuebaohua', '123456xbh', '898175') # 用户中心>>软件ID 生成一个替换 96001 im = open('./code.png', 'rb').read() result = chaojiying.PostPic(im, 9004)['pic_str'] # 9004验证码类型 print("***************", result) # result = result['pic_str'] all_list = [] #[[x1,y1],[x2,y2],[x3,y3]] #,这里办存储的是小列表 if '|' in result: # 117,75|188,146|117,75 list_1 = result.split('|') count_1 = len(list_1) for i in range(count_1): xy_list = [] x = int(list_1[i].split(',')[0]) #[[x,y],[]] 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]) #[[x,y]] 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="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img') 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() bro.find_element_by_id('username').send_keys('13436427103') time.sleep(2) bro.find_element_by_id('password').send_keys('asdf1234') time.sleep(2) bro.find_element_by_id('loginSub').click() time.sleep(4) bro.find_element_by_xpath('//*[@id="J-index"]/a').click() time.sleep(4) # bro.find_element_by_id('fromStationText').send_keys('北京') # 出发地 输入拼音大小写或汉字 # time.sleep(0.2) # bro.find_element_by_id('toStationText').send_keys('天津') # 到达地 输入拼音大小写或汉字 # time.sleep(0.2) # bro.find_element_by_id('train_date').send_keys('2019-5-6') # 出发日期 # time.sleep(1) # bro.find_element_by_id('search_one').click() # time.sleep(3) # bro.quit()
注意:这部分代码可能会存在一些问题
2.pyppeteer基本使用
参考blog:
基于浏览器自动化的模块
测试网站:http://quotes.toscrape.com/js/全部是动态加载出来的数据
安装这个模块: pip install pyppeteer
下面的程序运行之后,可以装谷歌的测试版本,运行之后的下载,可能会慢一些,没有关系
from pyppeteer import launch import asyncio #实例化一个浏览器对象(谷歌浏览器测试版本) async def main(): bro=await launch(headless=False) page=await bro.newPage() c=main() loop=asyncio.get_event_loop() loop.run_until_complete(c)
升级pyppeteer的测试程序:
from pyppeteer import launch import asyncio from lxml import etree #进行解析的模块 async def main(): # 实例化一个浏览器对象(谷歌浏览器测试版本) bro=await launch(headless=False) #新建一个空白页 page=await bro.newPage() await page.goto('http://quotes.toscrape.com/js/') #针对上边的url进行动态爬取 #获取page当前显示页面的源码数据 page_text=await page.content() #注意:page或者launch的内部代码都是需要加上await的 return page_text def parse(task): page_text=task.result() tree=etree.HTML(page_text) div_list=tree.xpath('//div[@class="quote"]') for div in div_list: content=div.xpath('./span[1]/text')[0] print(content) c=main() taks=asyncio.ensure_future(c) taks.add_done_callback(parse)#回调函数
目前到这,未完待续,浏览器没有安装完