问题爬取亚马逊,元素无法滚动到视图中
Issue Crawling Amazon, Element Cannot Be Scrolled into View
我在亚马逊上抓取页面时遇到问题。
我试过使用:
- 正在执行 JS 脚本
- 动作链
- 显式等待
似乎没有任何效果。一切都会抛出一个异常或错误。
基本脚本
ff = create_webdriver_instance()
ff.get('https://www.amazon.ca/gp/goldbox/ref=gbps_ftr_s-3_4bc8_dct_10-?gb_f_c2xvdC0z=sortOrder:BY_SCORE,discountRanges:10-25%252C25-50%252C50-70%252C70-&pf_rd_p=f5836aee-0969-4c39-9720-4f0cacf64bc8&pf_rd_s=slot-3&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=A3DWYIK6Y9EEQB&pf_rd_r=CQ7KBNXT36G95190QJB1&ie=UTF8')
next_button = ff.find_element_by_xpath('(//li/a[contains(text(), "Next")])[1]')
尝试 #1:执行 JS
脚本
ff.execute_script('arguments[0].scrollIntoView()', next_button)
错误
Element could not be scrolled into view
尝试 #2:动作链
脚本
actions = ActionChains(ff)
actions.move_to_element(next_button)
actions.click(next_button)
actions.perform()
错误
TypeError: rect is undefined
尝试 #3:显式等待
next_button = WebDriverWait(ff, 60).until(
EC.visibility_of_element_located((By.XPATH, '(//li/a[contains(text(), "Next")])[1]'))
)
我也试过使用 element_to_be_clickable
。这两个最终都会超时。
那是因为您正在尝试处理隐藏的 link。试试下面的方法
next_button = ff.find_element_by_partial_link_text('Next')
next_button.click()
或
next _button = ff.find_element_by_link_text('Next→')
请注意,find_element_by_partial_link_text
/find_element_by_link_text
仅搜索 visible link。
您可能还需要致电
ff.implicitly_wait(10)
在你的脚本中一次(在你的 WebDriver 实例定义之后的某个地方)或使用如下的 ExplicitWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
next_button = WebDriverWait(ff, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Next→')))
确保即使有渲染延迟也能找到所需的元素
我在亚马逊上抓取页面时遇到问题。
我试过使用:
- 正在执行 JS 脚本
- 动作链
- 显式等待
似乎没有任何效果。一切都会抛出一个异常或错误。
基本脚本
ff = create_webdriver_instance()
ff.get('https://www.amazon.ca/gp/goldbox/ref=gbps_ftr_s-3_4bc8_dct_10-?gb_f_c2xvdC0z=sortOrder:BY_SCORE,discountRanges:10-25%252C25-50%252C50-70%252C70-&pf_rd_p=f5836aee-0969-4c39-9720-4f0cacf64bc8&pf_rd_s=slot-3&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=A3DWYIK6Y9EEQB&pf_rd_r=CQ7KBNXT36G95190QJB1&ie=UTF8')
next_button = ff.find_element_by_xpath('(//li/a[contains(text(), "Next")])[1]')
尝试 #1:执行 JS
脚本
ff.execute_script('arguments[0].scrollIntoView()', next_button)
错误
Element could not be scrolled into view
尝试 #2:动作链
脚本
actions = ActionChains(ff)
actions.move_to_element(next_button)
actions.click(next_button)
actions.perform()
错误
TypeError: rect is undefined
尝试 #3:显式等待
next_button = WebDriverWait(ff, 60).until(
EC.visibility_of_element_located((By.XPATH, '(//li/a[contains(text(), "Next")])[1]'))
)
我也试过使用 element_to_be_clickable
。这两个最终都会超时。
那是因为您正在尝试处理隐藏的 link。试试下面的方法
next_button = ff.find_element_by_partial_link_text('Next')
next_button.click()
或
next _button = ff.find_element_by_link_text('Next→')
请注意,find_element_by_partial_link_text
/find_element_by_link_text
仅搜索 visible link。
您可能还需要致电
ff.implicitly_wait(10)
在你的脚本中一次(在你的 WebDriver 实例定义之后的某个地方)或使用如下的 ExplicitWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
next_button = WebDriverWait(ff, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Next→')))
确保即使有渲染延迟也能找到所需的元素