PhantomJS加载的HTML比其他驱动程序少得多

时间:2015-08-31 18:07:16

标签: python selenium-webdriver phantomjs

我正在尝试加载一个网页并从中获取一些元素。所以我要做的第一件事就是使用“inspect element”检查页面。当我搜索我正在寻找的标签时,我可以看到它们(在Chrome中)。

但是当我尝试driver.get(url)然后driver.find_element_by_...时,它找不到这些元素,因为它们不在源代码中。

我认为这可能是因为它不会加载整个页面而只加载一部分。

以下是一个例子:

我正在尝试在网页上找到广告。

PREPARED_TABOOLA_BLOCK = """//div[contains(@id,'taboola') and not(ancestor::div[contains(@id,'taboola')])]"""

driver = webdriver.PhantomJS(service_args=["--load-images=false"])
# driver = webdriver.Chrome()

driver.maximize_window()

def find_taboola_blocks_selenium(url):
    driver.get(url)
    taboola_blocks = driver.find_elements_by_xpath(PREPARED_TABOOLA_BLOCK)
    return taboola_blocks


print len(find_taboola_blocks_selenium('http://www.breastfeeding-problems.com/breastfeeding-a-sick-baby.html'))
driver.get('http://www.breastfeeding-problems.com/breastfeeding-a-sick-baby.html')
print len(driver.page_source)

输出:

使用PhantomJS:

  

0

     

85103

使用ChromeDriver:

  

3

     

420869

你知道如何让PhantomJS加载尽可能多的Html或任何其他方法来解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

您能否比较ChromeDriver正在制作的请求与您在PhantomJS中提出的请求?由于您只对指定的URL进行GET,因此您可能不会包含获取广告所需的其他请求参数。

open()方法可以让您更好地表达您在这里寻找的内容:http://phantomjs.org/api/webpage/method/open.html

答案 1 :(得分:0)

原因是因为默认情况下,PhantomJS会在一个非常小的窗口中呈现,这会使其加载该站点的移动版本。使用PhantomJSDriver,调用maximizeWindow()(或python中的maximize_window())绝对没有任何作用,因为没有渲染窗口可以最大化。您必须使用以下方法显式设置窗口的渲染大小:

编辑:下面是Java解决方案。我不完全确定在设置窗口大小时Python解决方案是什么,但它应该是类似的。

driver.manage().window().setSize(new Dimension(1920, 1200));

再次编辑:找到python版本:

driver.set_window_size(1920, 1200)

希望有所帮助!

答案 2 :(得分:0)

PhantomJS 1.x是一款非常古老的浏览器。它默认仅使用SSLv3(现在在大多数站点上禁用),并且不实现最前沿的功能。

广告脚本通常通过HTTPS(SSLv3 / TLS)提供,并且通常使用JavaScript的一些模糊功能,这些功能在PhantomJS中未经过充分测试或未实现。

如果您使用PhantomJS< v1.9.8然后你应该使用那些命令行选项(service_args):--ignore-ssl-errors=true --ssl-protocol=any

如果页面/广告必须使用iframe或奇怪的跨域请求,请将--web-security=false添加到service_args

如果仍然无法解决问题,请尝试升级到PhantomJS 2.0.0。您可能需要在Linux上自行编译。