from selenium.webdriver import Chrome
导入自定义配置模块
from selenium.webdriver.chrome.options import Options
创建配置对象
chrome_options = Options()
chrome_options.add_argument('window-size=1920x3000')#指定浏览器分辨率
chrome_options.add_argument('--disable--gpu')#谷歌文档提高需要使用这个属性来规避bug
chrome_options.add_argument('--hide-scrollbars')隐藏滚动条,应对一些特殊界面
chrome_options.add_argument('blink-settings=imagesEnabled=false')不加载图片,可以提升速度
chrome_options.add_argument('--headless')浏览器不再提供可视化界面
linux下如果系统无界面不加这条便会启动失败
chrome_options.add_exeprimental_option('excludeSwitches',['enable-automation'])取消浏览器驱动提示
如果将驱动的路径设置到环境变量中,可以不用传参数options表示配置项
driver=Chrome(r''D:jerryspiderDay3selenium模块chromedriver.exe",options=chrome_options)
driver.get("http://www.baidu.com")访问百度
text = driver.page_source 获取页面源代码可以从中提取数据
driver.close()关闭浏览器
selenium提供了很多用于解析数据的函数
tag = driver.find_element_by_class_name("index-logo-src")
tag = driver.find_element_by_css_selector(".index-logo-src")
标签相关内容
tag.text文本 tag.parent得到的是driver对象不是父标签
tag.get_attrbute("src")
tag.tag_name
一些特别的查找方式
根据链接的文本查找
tag = driver.find_element_by_link_text("学术")#文本完全匹配
tag=driver.find_element_by_partial_link_text("数")文本部分匹配
tag = driver.find_element_by_name("tj_trjao123") 查找第一个name属性为tj_trjao123的标签
tag=driver.find_element_by_tag_name("body")查找标签名称等于body的标签
print(tag.tag_name,tag.getattrbute(""href"),tag.text)
所有方法都能带s,用来查找所有匹配的标签,返回值类型为列表
嵌套查找
tag = driver.find_element_by_name("sb")
tag2= tag.find_element_by_tag_name("a")
与显示有关的属性
tag = driver.find_element_by_class_name("index-logo-src")
print(tag.location)打印标签的布局为字典格式如{"x":123,"y":345}
print(tag.size)不知道
等待元素加载
from selenium.wendriver import Chrome
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_contions as EC
from selenium.webdriver.common.by import By
当腰查找的元素不存在时,汇过一会再查找一次(轮询)知道找到为止,一旦超过10秒就会报错
driver.implicity_wait(10)隐士等待
key_input=driver.find_element(By.ID,"kw")等同于下面的
key_input=driver.find_element_by_id("kw") #找到输入框
key_input.send_keys("基佬") #向输入框发送数据
key_input.send_keys(Keys.ENTER) 执行回车键
显式等待 明确的等待某一个元素 满足某个条件传入要等待的driver和等待超时时间,等待页面出现了一个id为content_left的元素位为止,最长等10秒否则报错
WebDriverWait(driver,10).until(EC.presence_of_element_located(By.ID,"content_left"))
获取搜索结果 如果直接获取元素,可能因为页面没有加载完毕,导致获取失败
div = driver.find_element_by_id("conten_left")
清空输入框:找到指定输入框
key_input=driver.find_element_by_id("kw")
key_input.clear()$清空输入框
动作练
指的是一系列动作的集合,例如滑动验证1.点击并按住2.移动鼠标3.移到指定位置释放
from selenium.wendriver import Chrome
from selenium.webdriver import ActionChains
driver=Chrome()
driver.get(url)
driver.implicitly_wait(5)
切换frame(指定找到当前frame的内容,如果需要找到其他frame的标签,需要切换框架)
driver.switch_to.frame("imframeResult")
#获取需要拖拽的标签
tag=driver.find_element_by_id("draggable")
#获取目标位置的标签
tag2 = driver.find_element_by_id("froppable")
确定移动距离
dis=tag2.location.get('x')-tag.location.get('x')
创建一个动作对象
asc=ActionChains(driver)
asc.click_and_hold(tag).perform()#点击并按住指定标签perform表示执行该动作
asc.move_to_element(tag2).perform()移动到指定标签
asc.release().perform()松手
由于上述动作实在太快可能被认定为机器人
线性移动
asc=ActionChains(driver)
asc.click_and_hold(tag).perform()
#循环逐渐移动
while tag.location['x'] < tag2.location[''x']:
ActionChains(driver).move_by_offset(1,0).perform() #需要新创建一个对象原因不知道
asc.release().perform()
如果需要访问当前frame之上(父辈的内容)需要回到父级frame
driver.switch_to.parent_frame()
driver.find_element_by_id("textareaCode")
执行js代码
driver = Chrome()
driver.get("fhuiewuhf123")
driver.execute_script("alert("sb")")
导航(前进后退)
# driver.get("https://www.baidu.com")
# driver.get("https://www.qq.com")
# driver.get("https://www.sina.com")
# driver.get("https://www.4399.com")
#
#
# driver.back()# 后退
# driver.forward() # 前进
切换选项卡
driver.execute_script("window.open()")
print(driver.window_handles)#获取所有windows对象
driver.switch_to.window(driver.window_handles[1])#根据索引切换