当前位置: 首页 > 知识库问答 >
问题:

HtmlUnit WebClient方法getPage总是返回相同的页面

仉俊能
2023-03-14

我目前正在研究一种从特定网站中提取数据的解决方案(使用css选择器从网站的html表中返回价格列表)。为了做到这一点,我决定使用HtmlUnit库,因为我看到它支持很多特性。在我完成代码并针对同一页面(使用相同的搜索参数)进行测试后,我认为我已经完成了,但在为多个页面启动多个线程后,一切都发生了变化。问题是,基本上下面的代码总是为所有线程返回相同的旧页面,我根本不理解这种行为:

page = client.getPage(webPageURL); // always returns the same old page source

我使用同一个网站,我只是改变了一些搜索参数。

这些是我的代码的一部分:

final WebClient client = new WebClient(BrowserVersion.CHROME);  
            client.getOptions().setCssEnabled(false);  
            client.getOptions().setJavaScriptEnabled(true);
            client.setAjaxController(new com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController());
            client.getOptions().setThrowExceptionOnFailingStatusCode(false);
            client.getOptions().setThrowExceptionOnScriptError(false);
            client.addRequestHeader("Cache-Control", "no-cache, no-store, must-revalidate");
            client.addRequestHeader("Pragma", "no-cache");
            client.addRequestHeader("Expires", "0"); //
            client.getCache().clear();
            client.getCache().clearOutdated();
            client.getCache().setMaxSize(0);
            
            // enable sessions
            client.getCookieManager().setCookiesEnabled(true);

检索页面的地方:

HtmlPage page = null;
            
            try{
                //client.closeAllWindows();
                page = client.getPage(webPageURL);
                WebResponse response = page.getWebResponse();
                pageAsString= response.getContentAsString();

正如您所注意到的,我尝试了大量使用缓存(因为我认为这就是问题所在?)并通过将页面打印为字符串(pageAsString)进行了一些调试。无论我在页面url中更改了多少次搜索参数,都没有任何更改。我总是得到相同的旧页。

我还尝试了一些删除所有作业或清理页面的方法。不用说,没有一个奏效:

finally {
                client.getCurrentWindow().getJobManager().removeAllJobs();
                page.cleanUp();
                client.close();
                client.getCurrentWindow().getJobManager().shutdown();
                //client.closeAllWindows();
                //System.gc();
                }

你知道我是怎么搞砸代码的吗,我总是得到相同的缓存页面?

提前谢谢你,n23

共有1个答案

柯栋
2023-03-14

似乎是与HtmlUnit无关的代理问题(有关更多详细信息,请参阅https://github.com/HtmlUnit/htmlunit/issues/327)

 类似资料:
  • 我正在尝试使用equals方法与对象进行比较,但它总是返回false

  • 本文向大家介绍jQuery中页面返回顶部的方法总结,包括了jQuery中页面返回顶部的方法总结的使用技巧和注意事项,需要的朋友参考一下 当页面过长时,通常会在页面下方有一个返回顶部的button,总结一下,大概三种实现方法,下面说下各方法及优缺点。 方法一 锚点定位 这种方法设置方便,但缺点是会刷新页面(我是在同事的乐视手机上发现的)。 方法二 window.scrollTo(x,y) 这种方法也

  • 问题内容: 我在某处读到,函数应始终仅返回一种类型,因此以下代码被视为错误代码: 我想更好的解决方案是 返回None然后创建一个新的空元组不是更便宜的内存明智的选择吗?或者即使在较大的项目中,这种时差也太小而无法引起注意? 问题答案: 为什么函数应该返回一致类型的值?满足以下两个规则。 规则1-函数具有“类型”-输入映射到输出。它必须返回一致的结果类型,否则它不是函数。一团糟。 从数学上讲,我们说

  • 我正在解析一个文件,其中有城市名和到其他城市的距离,格式如下: 我认为问题在于,当我分割字符串时,它创建了不同的对象,并且由于某种原因,string.equals和/或hashcode()给出了不同的结果。因此,map.get(key)返回空值。但我不知道如何解决这个问题。 }

  • 然后mocked repository返回传递给它的内容,我可以轻松地测试它。 有什么想法吗?如何强制mockito返回?

  • 在.NET Framework 4.5中,由Trim()方法调用的专用TrimHelper()方法使用以下条件来确定是否需要修剪字符:(由.NET Reflector反编译的代码) 我想知道为什么IsBOMWhitesspace方法总是返回false?? 这是微软计划在未来改变/扩展的吗?例如,通过检查char是否为‘u efff’并在这种情况下返回true?