我试图加载一个网页并从中获取一些元素;检查元件";。当我搜索我要查找的标签时,我可以看到它们(在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上自己编译它。