PhantomJS返回空网页(python、Selenium)
尝试在不必启动python脚本中的实际浏览器实例的情况下(使用Selenium)对网站进行屏幕扫描。我可以用Chrome或Firefox来实现这一点——我已经尝试过了,而且效果很好——但我想使用PhantomJS,所以它是无头的 代码如下所示:PhantomJS返回空网页(python、Selenium),python,selenium,selenium-webdriver,phantomjs,Python,Selenium,Selenium Webdriver,Phantomjs,尝试在不必启动python脚本中的实际浏览器实例的情况下(使用Selenium)对网站进行屏幕扫描。我可以用Chrome或Firefox来实现这一点——我已经尝试过了,而且效果很好——但我想使用PhantomJS,所以它是无头的 代码如下所示: import sys import traceback import time from selenium import webdriver from selenium.webdriver.common.keys import Keys from se
import sys
import traceback
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53 "
"(KHTML, like Gecko) Chrome/15.0.87"
)
try:
# Choose our browser
browser = webdriver.PhantomJS(desired_capabilities=dcap)
#browser = webdriver.PhantomJS()
#browser = webdriver.Firefox()
#browser = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver")
# Go to the login page
browser.get("https://www.whatever.com")
# For debug, see what we got back
html_source = browser.page_source
with open('out.html', 'w') as f:
f.write(html_source)
# PROCESS THE PAGE (code removed)
except Exception, e:
browser.save_screenshot('screenshot.png')
traceback.print_exc(file=sys.stdout)
finally:
browser.close()
输出仅仅是:
<html><head></head><body></body></html>
您需要等待页面加载。通常,通过使用to等待关键元素出现或在页面上可见来完成。例如:
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
# ...
browser.get("https://www.whatever.com")
wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.content")))
html_source = browser.page_source
# ...
在这里,我们将等待10秒钟,等待div
元素和class=“content”
在获取页面源代码之前变为可见
此外,您可能需要忽略SSL错误:
不过,我很确定这与
PhantomJS
中的重定向问题有关。在phantomjs
bugtracker中有一个未解决的问题:
问题是https网站上的SSL加密,忽略它们就可以了 将PhantomJS驱动程序调用为:
driver = webdriver.PhantomJS(service_args=['--ignore-ssl-errors=true', '--ssl-protocol=TLSv1'])
这为我解决了问题。driver=webdriver.PhantomJS(服务参数=['--ignore ssl errors=true','--ssl protocol=TLSv1'])
这对我很管用好吧,我试试。。。。但是如果“get”命令在返回之前不等待“pageloaded”完成,那么它有多有用呢??看起来应该是内置的。您是否可以使用非定时等待命令来等待“页面加载”事件(或其名称)?@cbp2否,selenium不会在浏览器中等待未完成的异步请求或异步代码执行。使用显式等待应该可以解决问题。我们正在接近,但仍然没有雪茄。我添加了等待,但等待ID出现-超时,尽管我知道ID应该在那里。代码输出和屏幕截图仍然为空<代码>回溯(最后一次调用):文件“scrape_CS.py”,第35行,在element=wait.until(EC.element_to_be_可点击((By.ID,'loginField'))文件“/Users/carey/anaconda/lib/python2.7/site packages/selenium/webdriver/support/wait.py”,第75行,直到引发TimeoutException(消息、屏幕、stacktrace)TimeoutException:Message:Screenshot:可通过screen@cbp2获得好的,谢谢您的试用。我已经更新了答案,请检查。不幸的是,结果是一样的。顺便问一下,我需要所有“dcap”的东西吗?如果没有,我就把它去掉。您能解释一下为什么您认为忽略ssl错误是问题所在吗?我确实在Chrome中看到了关于这一点的警告,但它仍然有效。它在PhantomJS中根本不起作用。这对我来说很有效,不同于另一个答案--ssl protocol=TLSv1'部分。你知道为什么会这样吗?我今天也遇到了这个问题。我的页面停止工作并返回ssl协议=TLSv1解决了它。惊人的发现。
browser = webdriver.PhantomJS(desired_capabilities=dcap, service_args=['--ignore-ssl-errors=true'])
driver = webdriver.PhantomJS(service_args=['--ignore-ssl-errors=true', '--ssl-protocol=TLSv1'])