Selenium的使用

作者: bb2eef9c6b14 | 来源:发表于2017-06-17 14:27 被阅读592次

    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的使用

        本文链接:https://www.haomeiwen.com/subject/rfzvqxtx.html