Selenium是一个自动化测试工具,支持驱动多种浏览器,爬虫中主要用来解决JavaScript渲染问题,跳转,输入啦,点击,下拉等等操作。当无法从网页中静态获取内容时,则可以用这个工具。可以用pip完成安装。

代码实例:


from selenium import webdriver
from  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((,"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()



python 爬qq好友ip_Chrome


常用的查找方法还有:


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  import By
browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
input_first = browser.find_element(,'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()

那么,它得到的就是淘宝网首页的导航条的一个列表,如下:


python 爬qq好友ip_Chrome_02


常用的查找方法还有:


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   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()








但是,在处理大量数据时,建议使用lxml,效率会高很多!!!

元素交互操作


对获取的元素调用交互方法:


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://")
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跟踪而储存在用户本地终端上的数据