07.Python浏览器⾃动化模块selenium简介
⼀.selenium简介
Selenium是⼀个⽤于测试⽹站的⾃动化测试⼯具,⽀持各种浏览器包括Chrome、Firefox、Safari等主流界⾯浏览器,同时也⽀持phantomJS⽆界⾯浏览器。
⼆.selenuum的使⽤
1.安装
pip install selenium
2.下载浏览器驱动程序
到⾃⼰的浏览器版本下载驱动程序
3.浏览器⾃动播放咪咕⾳乐周杰伦歌曲列表第⼆⾸歌曲
from selenium import webdriver
import time
bro = webdriver.Chrome(executable_path="./chromedriver")# 实例化浏览器对象,executable_path是刚下载的浏览器驱动
bro.maximize_window()#窗⼝最⼤化
<(url="music.migu/v3")# 浏览器访问咪咕⾳乐
bro.find_element_by_id("search_ipt").send_keys("周杰伦")# 在搜索框输⼊周杰伦
bro.find_element_by_xpath('//*[@id="header"]/div[1]/div/div[2]/div[1]/div/span').click()# 点击搜索按钮
bro.switch_to.window(bro.window_handles[1])# 切换到第⼆个tab栏
time.sleep(1)
bro.find_element_by_xpath('//*[@id="J_PageSonglist"]/div[2]/div[2]/div[3]/a').click()# 点击第⼆个歌曲
bro.switch_to.window(bro.window_handles[2])# 切换到第三个tab栏
time.sleep(1)
bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[2]/div[3]/div[1]').click()# 播放歌曲
while True:#页⾯跳转太慢,⽆法获得最新的标签,⽤个死循环夯住
if len(bro.window_handles)==4:
bro.switch_to.window(bro.window_handles[3])
break
bro.find_element_by_xpath('//*[@id="header"]/div/div[2]/div[1]/div').click()#点击沉浸模式按钮
time.sleep(240)# 播放4m
bro.quit()# 退出浏览器
4.控制浏览器操作的⼀些⽅法
⽅法说明
set_window_size()设置浏览器的⼤⼩
back()控制浏览器后退
forward()控制浏览器前进
refresh()刷新当前页⾯
clear()清除⽂本
send_keys (value)模拟按键输⼊
click()单击元素
submit()⽤于提交表单
⽅法说明
get_attribute(name)获取元素属性值
is_displayed()设置该元素是否⽤户可见
size返回元素的尺⼨
text获取元素的⽂本
5.⿏标事件
⽅法说明
ActionChains(driver)构造ActionChains对象
context_click()执⾏⿏标悬停操作
move_to_element(above)右击
double_click()双击
drag_and_drop()拖动
move_to_element(above)执⾏⿏标悬停操作
context_click()⽤于模拟⿏标右键操作, 在调⽤时需要指定元素定位perform()执⾏所有 ActionChains 中存储的⾏为,可以理解成是对整个操作的提交动作
6.动作链和iframe处理
i.动作链
模拟⿏标复杂动作,⽐如长按⿏标并拖动
ii.iframe处理
当前页⾯有iframe,则在iframe⾥的标签是爬不到的,只有先定位到此iframe,再获取标签
iii.代码
#导⼊动作链对应的类
from selenium.webdriver import ActionChains
bro = webdriver.Chrome(executable_path='./chromedriver')
<('www.runoob/try/try.php?filename=jqueryui-api-droppable')
#如果定位的标签是存在于iframe标签之中的则必须通过如下操作在进⾏标签定位
bro.switch_to.frame('iframeResult')#切换浏览器标签定位的作⽤域
div = bro.find_element_by_id('draggable')
#动作链
action = ActionChains(bro)
#点击长按指定的标签
action.click_and_hold(div)html自动弹出公告代码
for i in range(5):
#perform()⽴即执⾏动作链操作
#move_by_offset(x,y):x⽔平⽅向 y竖直⽅向
sleep(0.5)
#释放动作链
bro.quit()
7. ⽆头浏览器和反检测⼿段
i.⽆头浏览器
我们发现,当我们做爬⾍爬取页⾯的时候,使⽤selenium总是弹出浏览器,然后⾃动运⾏,当我们更不想看到浏览器运⾏,只想看到数据时可以隐藏浏览器
ii.反检测⼿段
有的服务器检测到浏览器是selenium发送的,会屏蔽该请求的访问,就需要伪装selenuim
iii.代码
#实现⽆可视化界⾯
from selenium.webdriver.chrome.options import Options
#实现规避检测
from selenium.webdriver import ChromeOptions
#实现⽆可视化界⾯的操作
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#实现规避检测
option = ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])
#如何实现让selenium规避被检测到的风险
bro = webdriver.Chrome(executable_path='./chromedriver',chrome_options=chrome_options,options=option)
#⽆可视化界⾯(⽆头浏览器) phantomJs
<('www.baidu')
print(bro.page_source)
sleep(2)
bro.quit()
7.selenium实现⾃动登录12306
#下述代码为超级鹰提供的⽰例代码
import requests
from hashlib import md5
class Chaojiying_Client(object):
def__init__(self, username, password, soft_id):
self.username = username
password = de('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: 题⽬类型参考 www.chaojiying/price.html
"""
params ={
'codetype': codetype,
}
params.update(self.base_params)
files ={'userfile':('ccc.jpg', im)}
r = requests.post('upload.chaojiying/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('upload.chaojiying/Upload/ReportError.php', data=params, headers=self.headers) return r.json()
# chaojiying = Chaojiying_Client('bobo328410948', 'bobo328410948', '899370') #⽤户中⼼>>软件ID ⽣成⼀个替换 96001 # im = open('12306.jpg', 'rb').read() #本地图⽚⽂件路径来替换 a.jpg 有时WIN系统须要//
# print(chaojiying.PostPic(im, 9004)['pic_str'])
#上述代码为超级鹰提供的⽰例代码
#使⽤selenium打开登录页⾯
from selenium import webdriver
import time
from PIL import Image
from selenium.webdriver import ActionChains
bro = webdriver.Chrome(executable_path='./chromedriver')
<('kyfw.12306/otn/login/init')
time.sleep(1)
#save_screenshot就是将当前页⾯进⾏截图且保存
bro.save_screenshot('aa.png')
#确定验证码图⽚对应的左上⾓和右下⾓的坐标(裁剪的区域就确定)
code_img_ele = bro.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')
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']))
#⾄此验证码图⽚区域就确定下来了
i = Image.open('./aa.png')
code_img_name ='./code.png'
#crop根据指定区域进⾏图⽚裁剪
frame = i.crop(rangle)
frame.save(code_img_name)
#将验证码图⽚提交给超级鹰进⾏识别
chaojiying = Chaojiying_Client('bobo328410948','bobo328410948','899370')#⽤户中⼼>>软件ID ⽣成⼀个替换 96001 im =open('code.png','rb').read()#本地图⽚⽂件路径来替换 a.jpg 有时WIN系统须要//
print(chaojiying.PostPic(im,9004)['pic_str'])
result = chaojiying.PostPic(im,9004)['pic_str']
all_list =[]#要存储即将被点击的点的坐标 [[x1,y1],[x2,y2]]
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)
print(all_list)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论