- 便捷获取网站中动态加载的数据
- 便捷实现模拟登录
什么是selenium?
- 基于浏览器自动化的一个模块
使用:
pip3 install selenium
下载浏览器驱动程序 http://chromedriver.storage.googleapis.com/index.html (基于谷歌,对应版本)
- 实例化浏览器对象
- page_text = bro.page_source#页面源码数据
- bro.quit() #浏览器关闭
- bro.find系列.... element 单个节点 elements多个节点 返回列表
- xxx = bro.find...
xxx.send_keys('xxxxx') / clear()/
xxx.click()
- bro.execute_script('window.scrollTo(0,5000)') #滚轮滚动 document.body.scrollHeight #滚动一屏 #执行js代码
- bro.back()回退
- bro.forward()前进
- bro.save_screenshot(''文件保存路径“) 当前页面截屏
- -节点.get_attribute('xx')
- 节点.text .id ,size ,tag_name
selenium处理iframe
如果定位的标签处于iframe标签中则必须通过如下操作:
- bro.switch_to.frame('被定为的iframe标签id')
拖拽动作: 通过动作链
- from selenium.webdriver import ActionChains
action = ActionChains(bro)
action.click_and_hold(''brofind的标签 '')
for i in range(5):
action.move_by_offset(像素(数字,水平),像素(数字,竖直放心)).perform() #perform表示立即执行
action.release() #释放动作链
等待:
- 隐式
bro.implicitly_wait(时间)
-显式
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC
bro = webdriver.Chrome(executable_path='spider_tools/chromedriver.exe')
bro.get('https://www.taobao.com')
wait = WebDriverWait(bro,10)
input = wait.until(EC.presence_of_element_located((By.ID,'q')))
无可视化界面(无头浏览器)
from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('--headless') options.add_argument('--disable-gpu') bro = webdriver.Chrome(executable_path='spider_tools/chromedriver.exe',options=options)
cookies:
bro.get_cookies()
bro.add_cookie(字典)
bro.delete_all_cookies()
规避selenium被检测到风险
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
browser=webdriver.Chrome(executable_path=path,options=option)
验证码坐标:
code_img_ele = bro.find....()
location = code_img_ele.location#验证码左上角图标
size = code_img_ele.size #验证码对应的长和宽
rangle = (
int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height'])
)
#rangle为验证码区域 左上角图标, 右下角图标
from PIL import Image
i = Image.open('图片路径')
frame = i.crop(rangle) #指定区域图片的裁剪
code_img_name = 'code.png'
frame.save(code_img_name)#保存