【问题标题】:Selenium PhantomJS webdriver failing to grab ajax contentSelenium PhantomJS webdriver 无法抓取 ajax 内容
【发布时间】:2014-11-15 17:26:49
【问题描述】:

我正在尝试抓取一个通过 ajax 加载其大部分内容的页面。

例如,我试图从this webpage 中获取所有具有data-section 属性的li 节点。响应 html 有六个我需要的必需节点,但其余大部分是通过 ajax 请求加载的,该请求返回包含剩余 li 节点的 html。

所以我从使用请求切换到使用带有 PhantomJS 驱动程序的 selenium,它应该是 xhr 友好的,但我没有得到额外的 ajax 加载内容。

可运行:

from selenium import webdriver
from lxml import html

br = webdriver.PhantomJS()
br.get(url)
tree = html.fromstring(br.page_source)
print tree.xpath('//li[@data-section]/a/text()')

简而言之,以上代码无法通过 xhr 将 html 注入网页。我怎样才能做到这一点?如果没有,我的其他无头选项是什么。

【问题讨论】:

  • @ArtjomB。谢谢,虽然在那个问题中,有一个可以检查预期条件的唯一表,但这里似乎有任意数量的相同 li 元素正在加载。你有任何提示如何检查吗? EC 解决方案听起来比隐式等待更好,因为它会减慢爬取速度
  • 由于以前不知道元素的数量,您应该尝试使用implicit wait。我不知道你的网站,如果没有什么可以用作条件,那么你需要使用隐式等待。
  • @ArtjomB。刚刚在我之前的评论中编辑过。我要爬几万页,隐式等待听起来不是很有吸引力。网络不稳定,所以我必须为隐式等待设置一个严重的值来解释慢速时段,这也会在良好的网络期间拖累爬网。

标签: python ajax selenium selenium-webdriver phantomjs


【解决方案1】:

链接页面突出显示加载微调器 (.archive_loading_bar),一旦加载数据,该微调器就会消失。您可以使用explicit waitinvisibility_of_element_located 的预期条件。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from lxml import html

driver = webdriver.PhantomJS()
driver.get(url)
wait = WebDriverWait(driver, 10)
wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, '.archive_loading_bar')))
tree = html.fromstring(driver.page_source)

这是改编自 this answer 并等待长达 10 秒或直到加载数据。

【讨论】:

  • 非常感谢。对于任何未来的观众 - 第 6 行的 driver 应替换为 br 并且 invisibility_of_element_located 中的参数应该是一个元组(只接受一个参数),因此必须添加一对额外的括号。
猜你喜欢
  • 2013-06-06
  • 2016-09-23
  • 2022-11-29
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多