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,所以需要調(diào)用:
webdriver.Chrome('ChromeDriver的路徑')
其中,ChromeDriver的路徑如果和代碼在一起,那么就需要寫為:./chromedriver
在OS X下的這個ChromeDriver沒有后綴名,而如果大家是在Windows下面,ChromeDriver是一個exe的可執(zhí)行程序,大家就需要把 .exe 加上。另外需要特別注意斜杠的問題,在Windows下面路徑中的反斜杠需要使用特殊處理,例如:
webdriver.Chrome(r'D:\test\chromedriver.exe')
注意這里的“r”不能少。
2. 等待信息出現(xiàn)
由于被動態(tài)加載的內(nèi)容會延遲出現(xiàn),因此我們需要等待它出現(xiàn)以后才開始抓取。需要使用到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秒檢查一次網(wǎng)頁源代碼,看我們需要的內(nèi)容是否已經(jīng)出現(xiàn)。如果沒有出現(xiàn)就繼續(xù)等待。
在上面的代碼中,設(shè)定了超時時間為300秒。在300秒內(nèi),如果有某個元素出現(xiàn),那么就解除阻塞,繼續(xù)運行后面的代碼;如果等待的內(nèi)容始終不出現(xiàn),那么就會拋出一個超時的Exception。
我們來看一下:
EC.presence_of_element_located((By.CLASS_NAME, "con"))
這里的EC其實就是expected_conditions,也就是期望的條件。Python接近英語的語法讓我們可以非常輕松的看懂這一段代碼:
期望的條件.元素出現(xiàn)
而這里的元素就是一個class="con"的元素。
這里除了指定class以外,還可以指定很多其他的屬性,例如:
By.IDBy.NAMEBy.XPATH
通過元組的形式傳遞給presence_of_element_located方法。
在網(wǎng)頁中尋找我們需要的內(nèi)容,可以使用類似與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("http://input[@id='passwd-id']")#如果有多個符合條件的,返回第一個element = driver.find_element_by_xpath("http://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