selenium
一 安装与准备
1 pip install selenium
2 安装浏览器,下载浏览器对应的驱动
https://registry.npmmirror.com/binary.html?path=chromedriver
3 相关资料:
http://www.python3.vip/tut/auto/selenium/01/
https://www.bilibili.com/video/BV1Z4411o7TA?p=4
二 基本操作
1 浏览器
from selenium import webdriver
wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
wd.implicitly_wait(10)
wd.get('https://www.baidu.com')
wd.page_source
wd.title
wd.current_url
wd.set_window_position(300, 200)
wd.refresh()
wd.quit()
无界面浏览器
from selenium import webdriver
opt = webdriver.ChromeOptions()
opt.add_argument('--headless')
opt.add_argument('--disable-gpu')
driver = webdriver.Chrome(executable_path=r'd:\chromedriver.exe', options=opt)
2 选择元素的基本方法
1) 根据元素id属性选择元素
element = wd.find_element_by_id('kw')
2) 根据元素的class属性获取元素
wd.find_elements_by_class_name('animal')
wd.find_element_by_class_name('animal')
例子
from selenium import webdriver
wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
wd.get('http://cdn1.python3.vip/files/selenium/sample1.html')
elements = wd.find_elements_by_class_name('animal')
for element in elements:
print(element.text)
3)通过标签名获取元素
elements = wd.find_elements_by_tag_name('div')
element = wd.find_element_by_tag_name('div')
4) 在获取完的元素基础上继续调用前面获取元素的方法,仅查询范围有变化,用法不变
5) 获取a链接元素
wd.find_element_by_link_text('登录').click()
wd.find_element_by_partial_link_text('a标签包含的文本内容')
6) 通过名字获取元素
wd.find_element_by_name('name')
7) 其他表现形式
from selenium.webdriver.common.by import By
wd.find_element(By.CLASS_NAME, 'classname')
wd.find_element(By.LINK_TEXT, 'text')
wd.find_element(By.TAG_NAME, 'div')
...
3 操作元素
1) 点击元素
element.click()
2) 获取元素内文本内容
element.text
3) 获取元素属性
element.get_attribute(属性名)
4) 获取元素包含的所有html内容
element.get_attribute('outerHTML')
5)获取元素内部的所有html内容
element.get_attribute('innerHTML')
6) 获取input输入框里面的文字
element.get_attribute('value')
7) 获取元素文本内容(无法用text获取时)
element.get_attribute('innerText')
element.get_attribute('textContent')
8) 清除输入框中的内容
element.clear()
9) 输入框中输入内容
element.send_keys('内容')
4 CSS Selector语法选择元素
1) 基本语法
find_element_by_css_selector(CSS Selector参数)
find_elements_by_css_selector(CSS Selector参数)
通过标签获取
elements = wd.find_elements_by_css_selector('div')
elements = wd.find_elements_by_tag_name('div')
通过class
elements = wd.find_elements_by_css_selector('.类名')
通过id
elements = wd.find_elements_by_css_selector('#ID名')
2) 选择子元素和后代元素
wd.find_elements_by_css_selector('.类名1 > 标签2')
wd.find_elements_by_css_selector('#ID1 标签2')
wd.find_elements_by_css_selector('#ID1 .类名2 > 标签3')
3) 根据属性选择
wd.find_elements_by_css_selector('[href="http...."]')
wd.find_elements_by_css_selector('div[href="http...."]')
wd.find_elements_by_css_selector('div [href="http...."]')
4) 混合使用
div
div
div, .class
.class div, .class span
5) 按照次序选择
div:nth-child(2)
div:nth-last-child(1)
span:nth-of-type(2)
span:nth-last-of-type(2)
span:nth-child(odd)
span:nth-child(even)
.ID div:nth-of-type(even)
6)兄弟节点
.ID + span
.ID ~ span
5 frame或iframe元素,操作嵌套的html
wd.switch_to.frame(ID或name或element对象)
wd.switch_to.default_content()
wd.switch_to.window(wd.window_handles[0])
6 切换窗口
current_windows = driver.window_handles
wd.switch_to.window(current_windows[1])
wd.switch_to.window(句柄)
for handle in wd.window_handles:
wd.switch_to.window(handle)
if 需要的字段 in wd.title:
break
mainWindow = wd.current_window_handle
wd.switch_to.window(mainWindow)
7 select下拉框选择元素
from selenium.webdriver.support.ui import Select
select = Select('传入操作的元素element')
select.select_by_visible_text('文本')
select.select_by_value('属性值')
select.select_by_index('次序')
8 其他操作 ActionChains
例如:鼠标移动到元素上
from selenium import webdriver
driver = webdriver.Chrome(r'f:\chromedriver.exe')
driver.implicitly_wait(5)
driver.get('https://www.baidu.com/')
from selenium.webdriver.common.action_chains import ActionChains
ac = ActionChains(driver)
ac.move_to_element(
driver.find_element_by_css_selector('[name="tj_briicon"]')
).perform()
9 冻结页面
setTimeout(function(){debugger}, 5000)
10 xpath
/ 从根节点选取,或元素之间的过渡,一级一级关系 /html/body/div
// 元素之间过渡,可以不是一层的上下级关系 //div
.. 当前节点的父节点 //div/p/../
@ 选取属性 //div[@class='class_name']/@class 获取含class_name的标签的class名,在selenium不能写/@class,应该用get_attribute获取属性
text() 选取文本 //p[test()='哈哈']/text() # 只返回标签对象自己的内容,不会返回子级的,//p[test()='哈哈']//text() 返回所有text,包括子级的。在selenium中只能使用element.text
//div[1] # 所有div标签的第一个,从1开始
//div[last()] # 最后一个, last()-1倒数第二个
//div[position()>1] # 从第二个开始
//*[@*="user"] # 第一个*表示任意节点,第二个*表示任意属性
//div/node() # 匹配任意节点,包含注释属性等 //div/node()/text()
示例
/html/body//div/../a[@href='uer']/test()
//*[text()='嘿嘿']/div[last()-1]/p[2]/@id
//div[1]/./../p
11 执行js
wd.execute_script('window.scrollTo(0, {})'.format(500))
12 获取cookie,删除
wd.get_cookies()
wd.delete_cookie('cookiename')
wd.delete_all_cookies()
13 显示等待
from selenium.webdrive.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdrive.common.by import By
WebDriverWait(wd, 20, 0.5).until(
expected_conditions.presence_of_element_located(
(By.CLASS_NAME, 'classname')
)
)
14 使用代理ip
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=http://202.2016.82:9527')
driver = wevdriver.Chrome(chrome_options=options)
15 替换user-agent
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--user-agent=Mozillia/5.0 HAHA')
|