2017-05-29 75 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