安装
1.导入selenium模块
2.安装与浏览器版本对应的自动化测试工具 谷歌浏览器从ChromeDriver网站中找
基本使用
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_experimental_option('excludeSwitches', ['enable-automation'])#取消浏览器驱动提示
#如果将浏览器驱动的路径设置到环境变量,可以不用传参数
#options 表示配置项
driver = Chrome(options=chrome_options)
driver.get('https://sports.qq.com/nba/') #访问腾讯体育
text = driver.page_source #获取页面的源代码 可以从中获取数据
print(text)
解析数据
# selenium提供了很多用于解析数据的函数
from selenium.webdriver import Chrome
driver = Chrome()
driver.get('http://www.baidu.com') #访问百度
tag = driver.find_element_by_class_name('index-logo-src') #通过类名拿到标签
# tag = driver.find_element_by_css_selector('.index-logo-src')
#标签的相关内容
print(tag.text) #标签内容
print(tag.parent) #得到的是driver对象,不是父标签
print(tag.get_attribute('src'))#拿到标签中src属性
print(tag.tag_name) #标签名
#一些特别的查找方式
#根据连接的文本查找
tag1 = driver.find_element_by_link_text('学术') #文本完全匹配
tag2 = driver.find_element_by_partial_link_text('术') #文本部分匹配
tag3 = driver.find_element_by_name('tj_trhao123') #属性名name=tj_trhao123
tag4 = driver.find_element_by_tag_name('body') #标签名称为body
#所有方法都带有s的版本,用来获取查找所有匹配,返回一个列表
res = driver.find_elements_by_class_name("mnav")
print(res)
#嵌套查找
tag5 = driver.find_element_by_class_name("tools")
tag6 = tag5.find_element_by_css_selector("#mHolder")
#与显示相关的属性
tag7 = driver.find_element_by_class_name("index-logo-src")
print(tag7.location) #位置信息
print(tag7.size) #大小信息
#打开浏览器10s后自动关闭
import time
time.sleep(10)
driver.close()
#注意:通过class查找,driver.find_element_by_class_name() ()里面只能有一个值,不能存在空格隔开的多个值
等待元素加载
#完成百度搜索,先搜索redvelvet 1s 后搜索wendy
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = Chrome()
driver.get('https://www.baidu.com')
#隐式等待
driver.implicitly_wait(10) #当要查找的某个元素不存在时 会等一会查找一次(轮询)直到找到该元素 如果超时,则会报错
#找到输入框
key_input = driver.find_element_by_id('kw')
#发送搜索信息
key_input.send_keys('redvelvet')
#回车
key_input.send_keys(Keys.ENTER)
#显示等待 明确等待某一个元素 满足某个条件
#等到页面上出现一个id为content_left 的元素为止,最长等待时间为10s
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'content_left')))
#获取搜索结果 如果直接获取元素,可能因为页面没有加载完毕 导致获取失败,需要完成等待元素加载的操作
div = driver.find_element_by_id('content_left')
print(div)
import time
time.sleep(1)
key_input = driver.find_element_by_id('kw')
key_input.clear() #清空输入框
key_input.send_keys('wendy')
key_input.send_keys(Keys.ENTER)
动作链
from selenium.webdriver import Chrome
#创建动作链对象要导入的模块
from selenium.webdriver import ActionChains
driver = Chrome()
driver.get("http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
#隐式加载
driver.implicitly_wait(5)
#切换fream 页面分了好几个fream 我们要切换到标签所在的fream
driver.switch_to.frame("iframeResult")
#获取要拖动的标签
tag = driver.find_element_by_id('draggable')
#要拖动标签的位置
print(tag.location)
#获取目标位置标签
tag2 = driver.find_element_by_id('droppable')
#目标标签的位置
print(tag2.location)
#创建一个动作对象
asc = ActionChains(driver)
#x移动的距离
# dis = tag2.location['x'] - tag.location['x']
# asc.click_and_hold(tag).perform() #点击并且按住,perform表示执行这一动作
# asc.move_to_element(tag2).perform() #移动到指定标签位置
# asc.release().perform() #松手
#上述方式 线性移动 几乎瞬移 很容易被判断为机器人(程序)
#解决方法
asc.click_and_hold(tag).perform()
#循环逐渐移动
while tag.location['x'] < tag2.location['x']:
ActionChains(driver).move_by_offset(1,0).perform() #每次朝x移动1
asc.release().perform()
#==============================================================================
#切换到当前fream的父辈fream
driver.switch_to.parent_frame()
#拿到父辈fream中的标签
driver.find_element_by_id('textareaCode')
补充
from selenium.webdriver import Chrome
driver = Chrome()
driver.get("https://www.baidu.com")
#1.执行js
driver.execute_script("alert('小电影')")
#2.导航前进后退
driver.get("https://www.baidu.com")
driver.get("https://www.qq.com")
driver.get("https://www.sina.com")
driver.back() #后退
driver.forward() #前进
#3.切换选项卡
#创建选项卡
driver.execute_script('window.open()')
#切换到指定选项卡
driver.switch_to.window(driver.window_handles[1])
#在新的选项卡中加载下面页面
driver.get('https://www.qq.com')
#再次切换选型卡
driver.switch_to.window(driver.window_handles[0])
案例:爬取天猫汽车
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time
# 创建配置对象
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') #不加载图片, 可以提升速度
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://pages.tmall.com/wow/car/act/zhizu")
driver.implicitly_wait(10)
# 天猫汽车是懒加载 需要滑动屏幕显示出对应数据再获取
# 这种方式 无法预知到底要按多少次下
# for i in range(1000):
# driver.find_element_by_tag_name("body").send_keys(Keys.DOWN)
#平滑到底部 加载所有数据到页面 滑动速度太快,无法加载完善
#scrollTo可以把内容滚动到指定的坐标 ({})里面包含top和behavior两个参数
#document.body.clientHeight 获取页面高度
# driver.execute_script("""
# window.scrollTo({
# top: document.body.clientHeight,
# behavior:'smooth'
# })
# """)
# 慢慢滑动
# 执行js获取总高度
height = driver.execute_script("return document.body.clientHeight")
# 已经滑动的距离
dis = 0
while dis < height:
driver.execute_script("""
window.scrollTo({
top: %s,
behavior: "smooth"
});""" % dis)
dis += 200
#防止均匀加速
time.sleep(0.2)
# 获取页头 四个推荐数据
big_div = driver.find_element_by_class_name("zebra-car-goods-1x1")
item_div = big_div.find_element_by_css_selector("div")
res = item_div.find_elements_by_css_selector(".item")
for i in res:
print(i.find_element_by_tag_name("a").get_attribute("href"))
print(i.find_element_by_css_selector(".img").get_attribute("src"))
print(i.find_element_by_css_selector(".info .title").text)
infos = i.find_elements_by_css_selector(".interest")
print([k.text for k in infos])
# 获取汽车列表
sections = driver.find_elements_by_class_name("zebra-car-goods-1x2")
for s in sections:
bloks = s.find_elements_by_css_selector(".block")
for b in bloks:
print(b.find_element_by_css_selector("a").get_attribute("href"))
print(b.find_element_by_css_selector(".main").get_attribute("src"))
print(b.find_element_by_css_selector(".title").text)
infos = b.find_elements_by_css_selector(".interest")
print([k.text for k in infos])
driver.close()