我正在尝试抓取以下网站:https://angel.co/companies
底部有一个“更多”按钮,单击该按钮可以加载更多记录。
我需要通过硒单击按钮。
我尝试了以下操作:
python_button = driver.find_elements_by_class_name("more")
python_button.click()
但是找不到合适的按钮,即我的python_button
返回一个空列表。
我尝试了以下操作:
python_button = driver.find_element_by_class_name("more")
这会导致以下错误:
消息:否这样的元素:无法找到元素:{“ method”:“ class 名称”,“选择器”:“更多”}
有什么想法可以解决这个问题吗?
答案 0 :(得分:2)
点击更多按钮越多,将加载更多数据。您需要为按钮上的更多 文本诱导 WebDriverWait 以便单击,并且可以使用以下解决方案:
代码块:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument('disable-infobars')
driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
driver.get("https://angel.co/companies")
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='more' and contains(.,'More')]")))
while True:
try:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='more' and contains(.,'More')]"))).click()
print("MORE button clicked")
except TimeoutException:
break
driver.quit()
控制台输出:
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
MORE button clicked
答案 1 :(得分:1)
我已经使用Java尝试过相同的方法。请添加明确/流利的等待时间,然后再检查列表大小。请在代码下方找到。
driver.get("https://angel.co/companies");
new WebDriverWait(driver, 30).pollingEvery(Duration.ofMillis(100)).withTimeout(Duration.ofSeconds(30))
.until(ExpectedConditions.elementToBeClickable(By.cssSelector("div.more")));
List<WebElement> elements = driver.findElements(By.cssSelector("div.more"));
System.out.println(elements.size());
答案 2 :(得分:0)
您做得对,请稍等。 Ajax在硒回调之后触发。 您可以编写类似这样的内容或使用“声明”:
button = None
while not button:
button = driver.find_element_by_class_name("more")
if button:
break
您还可以尝试使用ajax代替硒。尝试使用此网址更改页面参数:
https://angel.co/companies/startups?ids[]=81494&ids[]=3322647&ids[]=98145&ids[]=32119&ids[]=21604&ids[]=19935&ids[]=480579&ids[]=3062473&ids[]=431924&ids[]=395542&ids[]=154&ids[]=948481&ids[]=197974&ids[]=891681&ids[]=972236&ids[]=686564&ids[]=115616&ids[]=515341&ids[]=1856&ids[]=477880&total=4381226&page=3&sort=signal&new=false&hexdigest=be1927797c1b88f79ae42efd4180ea78d3e9e711
看起来,网站返回了带有一键字典的json文件-“ html”,这是htmlcode服务器返回的信息。