2017-05-29 84 views
0

我想刮一頁並收集所有鏈接。該頁面顯示30個條目並查看完整列表,點擊全部加載按鈕是必要的。點擊按鈕加載完整的HTML後,使用Selenium加載其他元素

我使用下面的代碼:

from selenium import webdriver 
from bs4 import BeautifulSoup 

driver = webdriver.PhantomJS() 
driver.get('http://www.christies.com/lotfinder/searchresults.aspx?&searchfrom=header&lid=1&entry=edgar%20degas&searchtype=p&action=paging&pg=all') 

labtn = driver.find_element_by_css_selector('a.load-all') 
labtn.click() 

elem = driver.find_element_by_xpath("//*") 
source_code = elem.get_attribute("outerHTML") 
soup = BeautifulSoup(source_code, 'lxml') 

url_list = [] 
for div in soup.find_all(class_ ='image-container'): 
      for childdiv in div.find_all('a'): 
       url_list.append(childdiv['href']) 
print(url_list) 

這裏的HTML標記

<div class="loadAllbtn"> 
    <a class="load-all" id="loadAllUpcomingPast" href="javascript:void(0);">Load all</a> 
</div> 

我仍然得到原來的30個鏈接和初始密碼。看來我沒有正確使用硒,並想知道我做錯了什麼。

硒到目前爲止工作。節點JS已安裝,我設法做出截圖並將其保存到文件中。

回答

1

當您點擊「全部加載」時,您發出額外的請求來接收所有項目。你需要等待一段時間,服務器響應:

from selenium.webdriver.support.ui import WebDriverWait as wait 

driver = webdriver.PhantomJS() 
driver.get('http://www.christies.com/lotfinder/searchresults.aspx?&searchfrom=header&lid=1&entry=edgar%20degas&searchtype=p&action=paging&pg=all') 

labtn = driver.find_element_by_css_selector('a.load-all') 
labtn.click() 

wait(driver, 15).until(lambda x: len(driver.find_elements_by_css_selector("div.detailscontainer")) > 30) 

上面的代碼應該讓你等待15秒,直到數項超過30。那麼你可以刮頁面源與項目的完整列表

P.S.請注意,您不需要使用這些代碼行

elem = driver.find_element_by_xpath("//*") 
source_code = elem.get_attribute("outerHTML") 

獲取頁面源代碼。試試

source_code = driver.page_source 

P.P.S.您也不需要使用BeautifulSoup來獲取每個項目的鏈接。你可以這樣做

links = [link.get_attribute('href') for link in driver.find_elements_by_css_selector('div.image-container>a')] 
+0

我試過你的代碼。它第一次工作,然後它沒有。然後我增加了秒數,現在沒關係。謝謝 – zinyosrim