我想抓一页并收集所有链接。该页面显示30个条目,并查看单击加载全部按钮所需的完整列表。
我使用以下代码:
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个链接和初始代码。我似乎没有正确使用Selenium并且想知道我做错了什么。
到目前为止,硒工作。安装了Node JS,我设法制作了截图并将其保存到文件中。
答案 0 :(得分: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')]