Selenium的使用

1.初始化webdriver

from selenium importwebdriver

driver =webdriver.Chrome('./chromedriver')

driver.get("http://v.youku.com/v_show/id_XMTY2NTk5ODAwMA==.html?from=y1.3-idx-beta-1519-23042.223465.3-3")

这里需要初始化 selenium 的WebDriver, 由于我们使用的是Chrome,所以需要调用:

webdriver.Chrome('ChromeDriver的路径')

其中,ChromeDriver的路径如果和代码在一起,那么就需要写为:./chromedriver

在OS X下的这个ChromeDriver没有后缀名,而如果大家是在Windows下面,ChromeDriver是一个exe的可执行程序,大家就需要把 .exe 加上。另外需要特别注意斜杠的问题,在Windows下面路径中的反斜杠需要使用特殊处理,例如:

webdriver.Chrome(r'D:\test\chromedriver.exe')

注意这里的“r”不能少。

2. 等待信息出现

由于被动态加载的内容会延迟出现,因此我们需要等待它出现以后才开始抓取。需要使用到WebDriverWait,By 和 expected_conditions

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.common.byimportBy

from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(driver, 300).until(EC.presence_of_element_located((By.CLASS_NAME, "con")))

WebDriverWait会阻塞程序的运行,并每0.5秒检查一次网页源代码,看我们需要的内容是否已经出现。如果没有出现就继续等待。

在上面的代码中,设定了超时时间为300秒。在300秒内,如果有某个元素出现,那么就解除阻塞,继续运行后面的代码;如果等待的内容始终不出现,那么就会抛出一个超时的Exception。

我们来看一下:

EC.presence_of_element_located((By.CLASS_NAME, "con"))

这里的EC其实就是expected_conditions,也就是期望的条件。Python接近英语的语法让我们可以非常轻松的看懂这一段代码:

期望的条件.元素出现

而这里的元素就是一个class="con"的元素。

这里除了指定class以外,还可以指定很多其他的属性,例如:

By.IDBy.NAMEBy.XPATH

通过元组的形式传递给presence_of_element_located方法。

在网页中寻找我们需要的内容,可以使用类似与Beautiful Soup4 的语法:

element= driver.find_element_by_id("passwd-id") #如果有多个符合条件的,返回第一个

element= driver.find_element_by_name("passwd") #如果有多个符合条件的,返回第一个

element_list= driver.find_elements_by_id("passwd-id") #以列表形式返回所有的符合条件的element 

element_list= driver.find_elements_by_name("passwd") #以列表形式返回所有的符合条件的element

也可以使用XPath:

element= driver.find_element_by_xpath("//input[@id='passwd-id']")#如果有多个符合条件的,返回第一个element = driver.find_element_by_xpath("//input[@id='passwd-id']")#以列表形式返回所有的符合条件的element

但是有一点需要特别注意:这些名字都是find_element开头的,因此他们返回的都是element对象。这些方法他们的目的是寻找element,而不是提取里面的值。

所以当我们使用find_element_by_xpath的时候,不能使用text()这个语句。如果我们想获取里面的文本信息,需要在获取到element以后,再使用element.text。例如:

comment = driver.find_elements_by_xpath('//p[starts-with(@id, "content_")]')

foreachincomment:print(each.text)

更多Selenium的使用方法,可以参阅它的Python文档:http://selenium-python.readthedocs.io/getting-started.html

你可能感兴趣的:(Selenium的使用)