Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。对于一些 JavaScript动态渲染的页面来说,此种抓取方式非常有效。
简单示例
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
#声明浏览器对象,需要配置对应浏览器的驱动器(Driver),比如谷歌的驱动器为ChromeDriver
browser = webdriver.Chrome()
try:
#访问百度页面
browser.get("https://www.baidu.com")
# 查找id为"kw"的节点(百度搜索输入框)
input = browser.find_element_by_id("kw")
#向输入框输入文本
input.send_keys('python')
#输入框内按回车键
input.send_keys(Keys.ENTER)
#显式等待
wait = WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,'content_left')))
#打印相关信息
print(browser.current_url)
print(browser.get_cookies())
print(browser.page_source)
finally:
browser.close()
selenium中可以使用属性,Xpath,CSS选择器等获取方式
它需要传入两个参数:查找方式By和值
下列这些函数都由这个函数衍生而来:
find_element_by_id()
find_element_by_name()
find_element_by_xpath()
find_element_by_link_text()
find_element_by_class_name()
find_element_by_css_selector()
…
示例
browser.get("https://taobao.com")
#通过四种方式获取输入框
input_1 = browser.find_element_by_id('q') #属性选择
input_2 = browser.find_element_by_css_selector('#q') #CSS选择
input_3 = browser.find_element_by_xpath("//*[@id='q']") #Xpath 选择
input_4 = browser.find_element(By.ID,'q') # 通用函数选择
print(input_1,input_2,input_3,input_4)
browser.close()
ps:比获取单个节点的方法多了一个s,其他的都差不多,注意区分
返回值为列表(list)
browser.get("https://taobao.com")
lis = browser.find_elements_by_css_selector('.service-bd li')
print(type(lis),lis)
browser.close()
常见用法有:输入文本时用send_keys()方法,清空文本时用clear()方法,点击按钮时用click()方法
#访问淘宝
browser.get("https://taobao.com")
#选择淘宝搜索框
input = browser.find_element_by_id('q')
#搜索框输入文本“python”
input.send_keys("python")
#选择搜索按钮
button = browser.find_element_by_class_name('btn-search')
#点击按钮
button.click()
#程序停止10s,目的是让浏览器停止,看看效果
time.sleep(10)
动作链为没有特定对象的操作,比如鼠标拖拽,键盘按键
#鼠标拖拽示例
from selenium.webdriver import ActionChains
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
#切换到子页面
browser.switch_to_frame('iframeResult')
#定义需要拖拽的节点
source = browser.find_element_by_css_selector('#draggable')
#定义拖拽到的目标节点
target = browser.find_element_by_css_selector('#droppable')
#声明动作链对象
action = ActionChains(browser)
#调用鼠标拖拽方法
action.drag_and_drop(source,target)
#执行动作
action.perform()
time.sleep(10)
对于某些Selenium API没有提供的操作,比如下拉进度条,可以直接模拟运行Javascript,使用方法execute_script()即可实现
browser.get("https://zhihu.com/explore")
#执行JavaScript将进度条拉到最底部
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
#弹窗显示
browser.execute_script('alert("到底了")')
time.sleep(10)
selenium 已经提供了选择节点的方法,那么它也有相关的方法和属性提取节点信息,前提是先选中这个节点
browser.get("https://zhihu.com/explore")
input = browser.find_element_by_class_name('zu-top-add-question')
#使用get_attribute() 方法获取属性,传入想要获取的属性名即可得到它的值
print(input.get_attribute('id'))
#获取文本值
print(input.text)
#获取id属性
print(input.id)
#获取locati属性(可以获取该节点在页面中的先对位置
print(input.location)
#获取标签名称
print(input.tag_name)
#获取节点的大小,也就是宽高
print(input.size)