我在这个问题上通过网络搜索了几个小时,我找到的答案都没有真正适合我的问题,所以这就是我,在SOF中问我的第一个问题.
所以,我正在尝试使用htmlunit库从java程序打开Web浏览器.我需要连接的网站需要SSL连接,证书存储在USB密钥中.它的iKey2023产品.
系统曾经工作(我没有写),但USB密钥中的一个证书已过期,因此它自动转移到下一个(共有4个证书),它突然停止工作.
它给了我javax.net.ssl.SSLPeerUnverifiedException:peer not authenticated error.
我现在回到家了,我忘记了方法的确切名称,但我记得以下内容.
使用IE8创建浏览器实例
调用了browser.setWebConnection方法.根据API,此方法是内部API.
通过传递URL作为参数来建立与网站的连接
它在第3步抛出异常.
更多细节.小细节可能不正确,但我试图描述一幅大图.在步骤2,该方法将WebConnection对象作为参数,并且存在该接口的实现.在此实现中,使用sun.security.pkcs11.SunPKCS11(configFileInputStream)创建密钥库(我拼写正确吗?)
它是这样的.
Provider p = new sun.security.pkcs11.SunPKCS11(configFileInputStream); Security.addProvider(P);
并从此提供程序创建密钥库.
在WebConnection实现中使用此密钥库,它会创建一个SSLSocket.
因此,在证书切换到新证书后,它没有正确地获取证书.
这是我尝试过的.
我试图在htmlunit库中使用不同的方法,比如setSecurityProvider,我试图将Provider对象创建在上面的代码片段中.我得到了阶级演员异常.
我试图手动设置系统属性(trustStore,trustStorePassword,keyStore等).为了做到这一点,我想从USB密钥导出证书,但它不允许我从中导出私钥,所以我无法真正创建一个有效的PKCS12文件(openSSL想要私有)密钥文件和.pem文件进行转换,我没有那个密钥文件).
他们没有工作,我现在很困难.
我在Java中遇到了HtmlUnit这个奇怪的问题.我用它来从网站下载一些数据,过程是这样的:
1 - 登录
2 - 每个元素(汽车)
----- 3搜索汽车
----- 4从链接下载zip文件
代码:
创建webclient:
webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
webClient.setJavaScriptEnabled(true);
webClient.setThrowExceptionOnScriptError(false);
DefaultCredentialsProvider provider = new DefaultCredentialsProvider();
provider.addCredentials(USERNAME, PASSWORD);
webClient.setCredentialsProvider(provider);
webClient.setRefreshHandler(new ImmediateRefreshHandler());
Run Code Online (Sandbox Code Playgroud)
登录:
public void login() throws IOException
{
page = (HtmlPage) webClient.getPage(URL);
HtmlForm form = page.getFormByName("formLogin");
String user = USERNAME;
String password = PASSWORD;
// Enter login and password
form.getInputByName("LoginSteps$UserName").setValueAttribute(user);
form.getInputByName("LoginSteps$Password").setValueAttribute(password);
// Click Login Button
page = (HtmlPage) form.getInputByName("LoginSteps$LoginButton").click();
webClient.waitForBackgroundJavaScript(3000);
// Click on Campa area
HtmlAnchor link = (HtmlAnchor) page.getElementById("ctl00_linkCampaNoiH");
page = …Run Code Online (Sandbox Code Playgroud) 我试图使用http单元为我的应用程序读取响应标头 -
WebClient webClient = new WebClient();
WebClient.setThrowExceptionOnScriptError(false);
HtmlPage currentPage = webClient.getPage("http://myapp.com");
WebResponse response = currentPage.getWebResponse();
System.out.println(response.getResponseHeaders());
Run Code Online (Sandbox Code Playgroud)
我确实看到了响应头但它们仅限于第一个http get请求.当我使用LiveHTTPHeaders插件for firefox插件时,我得到了所有获取请求和相应的标头响应.
有没有办法为所有后续请求获取http标头,而不仅限于第一次获取?
我正试图从历史书的网站上搜集练习测验,这样我就可以将它们组合成一个大的测试来学习.
页面在这里.
这一切都是由javascript,所以我试图HtmlUnit用来刮页.
我更像是一个Python人,因此我将初始代码设置为非常接近HtmlUnit的入门部分:
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class HelloWorld {
public static void main(String[] args) throws Exception {
homePage();
System.out.println("Done.");
}
public static void homePage() throws Exception {
final WebClient webClient = new WebClient();
String url = "http://www.wwnorton.com/college/polisci/we-the-people8/shorter/ch/15/quiz.aspx";
final HtmlPage page = webClient.getPage(url);
System.out.println(page.asText());
webClient.closeAllWindows();
}
}
Run Code Online (Sandbox Code Playgroud)
在运行时,我得到以下打印输出:2013年4月27日下午12:50:16
com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.
Apr 27, 2013 12:50:16 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.
Apr …Run Code Online (Sandbox Code Playgroud) 我是HtmlUnit的新手,我正在尝试抓取一个使用Javascript编辑代码的网站。我听说HtmlUnit是最好的方法,因为它使用无头浏览器返回最终代码。
但是,正如您将看到的那样,我什至无法创建一个HtmlPage对象,而不会抛出一个巨大且无法理解的异常(至少考虑到我对HtmlUnit几乎为空的经验)。
这是我的代码:
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class Main {
public static void main(String[] args) {
Main scraper = new Main();
scraper.testingGargoyle();
}
private void testingGargoyle() {
String myUrl = "https://www.wearvr.com/#game_id=game_4";
WebClient webClient = new WebClient();
try {
HtmlPage myPage = ((HtmlPage) webClient.getPage(myUrl));
} catch (FailingHttpStatusCodeException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是抛出的异常:
Apr 30, 2015 5:43:50 PM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.
Apr 30, …Run Code Online (Sandbox Code Playgroud) 我使用HtmlUnit填写表单.我有一个选择SELECT_A.选择选项后,其他元素必须出现在页面中.但它不起作用!我模拟Firefox 3.6.
你怎么看?
我尝试使用,NicelyResynchronizingAjaxController()但它没有帮助.
谢谢!
我知道你可能认为这个问题很愚蠢,但我需要使用HtmlUnit.但是,它以XML或文本形式返回页面.
我不知道如何获得纯HTML(与浏览器返回的源代码相同)
我需要这个,因为我需要使用一些书面模块.有任何想法吗?
我试图用htmlunit模拟登录.虽然我根据例子编写了我的代码,但我遇到了一个无聊的问题.以下是我从控制台中获取的一些消息.
runtimeError: message=[An invalid or illegal selector was specified (selector: '*,:x' error: Invalid selector: *:x).] sourceName=[http://user.mofangge.com/Scripts/inc/jquery-1.10.2.js] line=[1640] lineSource=[null] lineOffset=[0]
WARNING: Obsolete content type encountered: 'application/x-javascript'.
CSS error: 'http://user.mofangge.com/Content/Css/Style1/Main.css' [1:1] Error in style sheet. (Invalid token "\u9518". Was expecting one of: <EOF>, <S>, <IDENT>, "<!--", "-->", <HASH>, <IMPORT_SYM>, <PAGE_SYM>, <MEDIA_SYM>, <FONT_FACE_SYM>, <CHARSET_SYM>, ".", ":", "*", "[", <ATKEYWORD>.)
Aug 11, 2014 1:43:27 ?? com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error
CSS error: 'http://user.mofangge.com/Content/Css/Style1/Login.css' [1:1] Error in style sheet. (Invalid token "\u9518". Was expecting one of: <EOF>, <S>, …Run Code Online (Sandbox Code Playgroud) 我试图解析一个网站,但我遇到了一个Too much redirect例外.这是我的代码:
WebClient client = new WebClient(BrowserVersion.FIREFOX_24);
HtmlPage homePage = null;
String url = "http://www.freelake.org/pages/Freetown-Lakeville_RSD/Departments/Director_of_Financial_Operatio";
try {
client.getOptions().setUseInsecureSSL(true);
client.setAjaxController(new NicelyResynchronizingAjaxController());
client.getOptions().setThrowExceptionOnFailingStatusCode(false);
client.getOptions().setThrowExceptionOnScriptError(false);
client.waitForBackgroundJavaScript(30000);
client.waitForBackgroundJavaScriptStartingBefore(30000);
client.getOptions().setCssEnabled(false);
client.getOptions().setJavaScriptEnabled(true);
client.getOptions().setRedirectEnabled(true);
homePage = client.getPage(url);
synchronized (homePage) {
homePage.wait(25000);
}
System.out.println(homePage.asXml());
} catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
以下提到例外情况
com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException: Too much redirect for http://www.freelake.org/resolver/2345183424.20480.0000/route.00/pages/Freetown-Lakeville_RSD/Departments/Director_of_Financial_Operatio
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1353)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1371)
Run Code Online (Sandbox Code Playgroud)
有什么方法可以解决这个问题吗?
我正在尝试访问某个网站,但我无法将收集的"Cookie"添加到传出的POST请求标头中.我已经能够验证它们是否存在于CookieManager中.
任何替代HtmlUnit的方法也将受到赞赏.
public static void main( String[] args )
{
// Turn off logging to prevent polluting the output.
Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF);
try {
final WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setCssEnabled(false);
CookieManager cookieManager = webClient.getCookieManager();
out.println(cookieManager.getCookies().toString());
out.println("start");
final HtmlPage loginPage = webClient.getPage("my_url");
Map<?, ?> additionalRequest1 = loginPage.getWebResponse().getWebRequest().getAdditionalHeaders();
Iterator<?> ite0 = additionalRequest1.entrySet().iterator();
while(ite0.hasNext()){
out.println(ite0.next());
}
out.println("\n");
out.println("after loginPage");
out.println(cookieManager.getCookies().toString());
Set<Cookie> cookies = new HashSet<Cookie>();
cookies.addAll(webClient.getCookieManager().getCookies());
StringBuilder cookieHeader = new StringBuilder();
Iterator<Cookie> ite = cookies.iterator();
while (ite.hasNext()){
Cookie cookie = ite.next();
cookie.getDomain().substring(1);
String name …Run Code Online (Sandbox Code Playgroud) htmlunit ×10
java ×8
javascript ×2
certificate ×1
css ×1
dom-events ×1
html ×1
ssl ×1
web-crawler ×1
web-scraping ×1