Selenium是一个自动化测试工具,支持驱动多种浏览器,爬虫中主要用来解决JavaScript渲染问题,跳转,输入啦,点击,下拉等等操作。当无法从网页中静态获取内容时,则可以用这个工具。可以用pip完成安装。
代码实例:
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
browser = webdriver.Chrome() #定义一个浏览器驱动
try:
browser.get("http://www.baidu.com") #模拟输入一个url
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_all_elements_located((By.ID,"content_left"))) #等待id为
content_left的元素被加载进来
print(browser.current_url)
print(browser.get_cookie())
print(browser.page_source)
finally:
browser.close() #关闭浏览器,若不关闭,浏览器则会在后台一直运行下去
接下来,让我们对Selenium来一波彻底的认知~~~
声明浏览器对象:
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.PhantomJS
访问页面:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com')
browser.close()
查找元素:
单个元素:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
#以下的三种方式将会得到同样的结果,都是根据id得到的淘宝网搜索框
input_first = browser.find_element_by_id('q')
input_second = browser.find_element_by_css_selector('#q')
input_third = browser.find_element_by_xpath('//*[@id="q"]')
browser.close()
常用的查找方法还有:
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
还有一种通用的查找方式:
例如:
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
input_first = browser.find_element(By.ID,'q')
print(input_first)
browser.close()
节省了代码,且将得到与前者同样的效果
多个元素:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
lis = browser.find_elements_by_css_selector('.service-bd li')
print(lis)
browser.close()
那么,它得到的就是淘宝网首页的导航条的一个列表,如下:
常用的查找方法还有:
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
当然,查找多个元素的操作也有其简化的通用写法,即
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')
print(lis)
browser.close()
元素交互操作
对获取的元素调用交互方法:
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
input = browser.find_element_by_id('q')
input.send_keys('iPhone')
time.sleep(1)
input.clear()
input.send_keys("iPid")
button = browser.find_element_by_class_name('btn-search')
button.click()
browser.close()
这样就可以释放你的双手,让程序自动驱动浏览器去查找淘宝商品咯
交互动作
这个交互动作与元素的交互动作是不同的,它是将动作附加到动作链中串行执行,需要引入一个ActionChains库
下面的实例用于切换frame
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
browser.switch_to_frame('ifameResult')
source = browser.find_elements_by_css_selector('#draggable')
target = browser.find_elements_by_css_selector('#droppable')
actions = ActionChains(browser) #声明一个交互动作
actions.drag_and_drop(source,target) #执行拖拽
actions.perform()
除了drag_and_drop,常用的交互动作还有,
click_and_hold(on_element=None) 按住不动
double_click(on_element-None)双击
执行JavaScript
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.zhihu.com/explore")
#将动作拖拽到窗口底部
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")
browser.execute_script('alert("To Buttom")')
获取元素信息
获取属性:
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = "http://www.zhihu.com/explore"
browser.get(url)
logo = browser.find_element_by_id('zhihu-top-link-logo')
print(logo)
print(logo.get_attribute('class'))
获取文本值:
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = "http://www.zhihu.com/explore"
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.text)
获取id,位置,标签名,大小
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = "http://www.zhihu.com/explore"
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)
output:
0.5051284357419945-1
{'x': 758, 'y': 7} 在浏览器中的位置
button
{'height': 32, 'width': 66} 浏览器占的像素大小
Frame
frame即碎片,组成整张网页的一部分,是网页中常见的一种组件,通常可以看作是一个独立网页,下面用一个例子来说明如何切换frame,即怎样切换到子元素的frame,然后再切换回来
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
browser = webdriver.Chrome()
url = "http://www.runoob.com/try/try/try.php?filename=jueryui-api-droppable"
browser.get(url)
browser.switch_to_frame("iframeResult")
sourse = browser.find_elements_by_css_selector("#draggable")
print(sourse)
try:
logo = browser.find_element_by_class_name("logo")
except NoSuchElementException:
print('No logo')
browser.switch_to_parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo.text)
前进后退
例
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.get("http://www.taobao.com")
browser.get("http://www.python.com")
browser.back()
time.sleep(1)
browser.forward()
browser.close()
依次请求三个页面,然后后退一步,前进一步
Cookies
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.zhihu.com/explore")
print(browser.get_cookie())
browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'germey'})
print(browser.get_cookie())
browser.delete_all_cookies()
print(browser.get_cookie())
选项卡管理
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get("http://www.taobao.com")
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('http://python.org')
PhantomJS是一个基于Webkit的Headless的web引擎,即相当于一个没有界面的浏览器,在做爬虫时比Chrome更节省内存,且运行较快。
关于Cookies的使用
Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据