1.防止浏览器闪退
driver=webdriver.Chrome()
替换成
drive = webdriver.ChromeOptions()
drive.add_experimental_option('detach', True)
driver = webdriver.Chrome(options=drive)
2.避免selenium被识别
selenium做爬虫能解决很多反爬问题,但是selenium也有很多特征可以被识别,比如用selenium驱动浏览器后window.navigator.webdriver值是true,而正常运行浏览器该值是未定义的(undefined)
# 使用chrome开发者模式
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 禁用启用Blink运行时的功能
options.add_argument("--disable-blink-features=AutomationControlled")
# Selenium执行cdp命令 再次覆盖window.navigator.webdriver的值
driver = webdriver.Chrome(options=options)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
driver.get('https://www.baidu.com/')
3.滚动条滑到底
静态页面
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
动态页面
def func():
# 初始滚动条距离顶部的距离
temp_height = 0
while True:
# 滑动滚动条1000像素
driver.execute_script("window.scrollBy(0,1000)")
# sleep一下让滚动条反应一下
time.sleep(5)
# 获取当前滚动条距离顶部的距离
check_height = driver.execute_script(
"return document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;")
# 如果两者相等说明到底了
if check_height == temp_height:
break
temp_height = check_height
4.窗口操作
切换窗口
# 切换界面 0代表的第一个最开始打开的窗口 1代表的第二个 -1切换到最新打开的窗口
driver.switch_to.window(driver.window_handles[1])
打开多窗口
# 打开多窗口
driver.execute_script("window.open('https://www.douban.com')")
5.下拉列表操作
from selenium.webdriver.support.select import Select
# 首先定位到下拉列表
sele=driver.find_element(By.XPATH,'xpath路径')
# 然后对元素进行包装,包装成下拉菜单
sel=Select(sele)
# 让浏览器在下拉列表进行选择,len(sel)是下拉列表中的数据数量,i就是每一个下拉框选项的索引位置
for i in range(len(sel)):
# 按照索引进行切换
sel.select_by_index(i)
time.sleep(1)
6.iframe操作
selenium是拿不到iframe里的数据的,如果想要拿到首先定位iframe然后再切换视角到iframe,最后再拿想要的数据。
# 定位iframe标签
iframe=driver.find_element(By.XPATH,'xpath路径')
# 切换到指定的iframe
driver.switch_to.frame(iframe)
# 在进入到指定的iframe后开始拿想要的数据
text=driver.find_element(By.XPATH,'xpath路径').text
# 回到默认的界面,也就是退出iframe
driver.switch_to.default_content()
7.鼠标操作(动作链)
click(on_element=None)--单击鼠标左键
click_and_hold(on_element=None)--单击鼠标左键,不松开
context_click(on_element=None)--单击鼠标右键
double_click(on_element=None)--双击鼠标左键
drag_and_drop(source,target)--拖拽到某个元素然后松开
key_down(value,element=None)--按下某个键盘上的键
key_up(value,element=None)--松开某个键
move_to_element(to_element)--鼠标移动到某个元素
perform()--执行链中所有的动作
release(on_element=None)--在某个元素位置松开鼠标左键
send_keys(*key_to_send)--发送某个键到当前焦点的元素
send_keys_to_element(element,*key_to_send)--发送某个键到指定元素
move_by_offset(x,y) --鼠标从当前位置移动到某个坐标
move_to_element_with_offset(to_element, x, y) --移动到距某个元素(左上角坐标)多少距离的位置
8.键盘操作
send_keys(Keys.Back_SPACE):删除键
send_keys(Keys.SPACE):空格键
send_keys(Keys.ENTER):回车键
send_keys(Keys.TAB):制表键
send_keys(Keys.CONTROL,'a'):全选
send_keys(Keys.CONTROL,'c'):复制
send_keys(Keys.CONTROL,'x'):剪切
send_keys(Keys.CONTROL,'v'):粘贴