我正在尝试加载一个网页并从中获取一些元素。所以我要做的第一件事就是使用“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或任何其他方法来解决这个问题吗?
答案 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上自行编译。