当前位置 博文首页 > Elite-Wang:爬虫-selenium的使用
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,可以按指定的命令自动操作,但是他需要与第三方浏览器结合在一起才能使用。如果我们把 Selenium和第三方浏览器(比如Chrome)结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理 JavaScrip、Cookie、headers,以及任何我们真实用户需要做的事情。
sudo pip3 install selenium
from selenium import webdriver # 导入webdriver from selenium.webdriver.common.keys import Keys #Keys`类提供键盘按键的支持,比如:RETURN, F1, ALT等 from selenium.webdriver.chrome.options import Options #导入Chrome浏览器配置选项类
options = Options() options.add_argument('--headless')#无界面浏览器 options.add_argument('--disable-gpu')# 禁用gpu加速,规避bug driver = webdriver.Chrome(options=options) #创建浏览器对象 driver.get("https://www.baidu.com/") # get方法会打开一个页面 driver.implicitly_wait(10) # 通常打开页面后会等待一会,让页面加载 print (driver.title) # 打印页面标题 "百度一下,你就知道" driver.save_screenshot("baidu.png") # 生成当前页面快照并保存 elem = driver.find_element_by_id('kw') #根据id查找元素 elem.clear() #清空搜索框 elem.send_keys('中国') #搜索中国 elem.send_keys(Keys.RETURN) #按回车键 print(driver.page_source) # 打印网页渲染后的源代码 print(driver.get_cookies()) # 获取当前页面Cookie print(driver.current_url) # 获取当前url # driver.close() 关闭当前页面,如果只有一个页面,会关闭浏览器 driver.quit() # 关闭浏览器
login_form = driver.find_element_by_id('loginForm')
username = driver.find_element_by_name('username') password = driver.find_element_by_name('password')
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')
heading1 = driver.find_element_by_tag_name('h1')
content = driver.find_element_by_class_name('content')
content = driver.find_element_by_css_selector('p.content')
from selenium.webdriver.common.by import By driver.find_element(By.XPATH, '//button[text()="Some text"]') driver.find_elements(By.XPATH, '//button')
ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector"
有些时候,我们需要再页面上模拟一些鼠标操作,比如双击、右击、拖拽甚至按住不动等,我们可以通过导入ActionChains 类来做到。
from selenium.webdriver import ActionChains
ActionChains(driver).操作方法1.操作方法2.....perform()
ActionChains对象上的操作方法存储在对象的队列中,在调用perform()方法时,才会按照队列中的顺序去触发操作
我们已经知道了怎样向文本框中输入文字,但是有时候我们会碰到<select> </select>
标签的下拉框。直接点击下拉框中的选项不一定可行。
from selenium.webdriver.support.ui import Select select = Select(driver.find_element_by_name('name')) select.select_by_index(index) #index索引从0开始 select.select_by_visible_text("text") #text是在option标签文本的值,是显示在下拉框的值 select.select_by_value(value) #value是option标签的一个属性值,并不是显示在下拉框中的值
select.deselect_all()
Selenium WebDriver 内置了对处理弹出对话框的支持。在你的某些动作之后可能会触发弹出对话框,你可以像下面这样访问对话框:
alert = driver.switch_to.alert() # 切换进alert print(alert.text())# 打印alert文本内容 alert.accept()# 关闭弹框(接受) # alert.dismiss() 关闭弹窗(拒绝) # alert.send_keys('selenium') 向弹窗里输入内容
driver.switch_to.window("窗口名")
for handle in driver.window_handles: driver.switch_to_window(handle)
driver.forward()
driver.back()
driver.get_cookies()
driver.delete_cookie("CookieName")
driver.delete_all_cookies()
现在的大多数的Web应用程序是使用Ajax技术。当一个页面被加载到浏览器时,该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难,如果元素不再页面之中,会抛出ElementNotVisibleException异常。使用 waits, 我们可以解决这个问题。waits提供了一些操作之间的时间间隔,主要是定位元素或针对该元素的任何其他操作。
Selenium Webdriver 提供两种类型的waits:隐式和显式。显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。而隐式等待让Webdriver等待一定的时间后再才是查找某元素。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get("http://somedomain/url_that_delays_loading") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) ) finally: driver.quit()
在抛出TimeoutException异常之前将等待10秒。 WebDriverWait 默认情况下会每0.5秒调用一次ExpectedCondition直到结果成功返回。 ExpectedCondition成功的返回结果是一个布尔类型的true或是不为null的返回值。
title_is title_contains presence_of_element_located visibility_of_element_located visibility_of presence_of_all_elements_located text_to_be_present_in_element text_to_be_present_in_element_value frame_to_be_available_and_switch_to_it invisibility_of_element_located element_to_be_clickable – it is Displayed and Enabled. staleness_of element_to_be_selected element_located_to_be_selected element_selection_state_to_be element_located_selection_state_to_be alert_is_present
from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(10) # seconds driver.get("http://somedomain/url_that_delays_loading") myDynamicElement = driver.find_element_by_id("myDynamicElement")
可以在加载完成的页面上使用execute_script方法执行js。 比如调用javascript API滚动页面到底部或页面的任何位置
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
选择 <input type="file"> 元素并且调用 send_keys() 方法传入要上传文件的路径,可以 是对于测试脚本的相对路径,也可以是绝对路径。