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



我试图加载一个网页并从中获取一些元素;检查元件";。当我搜索我要查找的标签时,我可以看到它们(在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或任何其他方法来解决这个问题吗?

您能将ChromeDriver发出的请求与您在PhantomJS中发出的请求进行比较吗?由于您只对指定的url执行GET操作,因此可能没有包含获取广告所需的其他请求参数。

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

这是因为默认情况下,PhantomJS在一个非常小的窗口中渲染,这使得它可以加载网站的移动版本。使用PhantomJSDriver,调用maximizeWindow(((或python中的maximize_window(((绝对没有任何作用,因为没有要最大化的渲染窗口。您必须使用显式设置窗口的渲染大小

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

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

再次编辑:找到python版本:

driver.set_window_size(1920, 1200)

希望能有所帮助!

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上自己编译它。

相关内容

最新更新