我可以强制HtmlUnit返回JavaScript想要重定向到的URL,而不是自动遵循JavaScript重定向吗?
//上下文:
如果连续有5个JavaScript重定向,我只能看到它停止的页面的URL - 我无法查看它运行的5个URL.
也许我可以将记录器连接到回调方法以查找重定向?不确定这是否可行,或者它是如何工作的..
我不能,为了我的生活,装备HtmlUnit来抓住这个网站:
我确信它与后台运行的大量脚本有关.也许这些脚本没有足够的时间来完全加载?
我也尝试过简单地抓住bing.com/travel,也没有成功.它打破了新HtmlPage客户端的getPage函数.
输出提供了大量的runtimeErrors("完成此操作所需的数据尚不可用"),全部用于相同的sourceName(" http://www.bing.com/travel/jsxc.vjs?a=common&v=5.5" .0-1278007084280 ")
然后在bing.com上的几个脚本中丢失了一些"(").
然后它调用javascript,然后突然结束.
我意识到这可能是其他人可能无法看到的一些问题,所以如果没有建议,有人会介意通过他们自己的HtmlUnit使用的测试实现来抽取这两个站点,看看他们是否可以获得基本输出XML或文本结果?我不是想在这里做任何事情,只是得到结果的一些基本文本或XML输出.
知道其他人的实施是否有效是很方便的,所以我可以让陪审团操纵我的工作完成.
码:
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.WebClient;
public class test {
public static void main(String[] args) throws Exception {
        WebClient client = new WebClient();
        System.out.println("webclient loaded");
        HtmlPage currentPage = client.getPage("http://www.bing.com/travel/flight/flightSearch?form=FORMTRVLGENERIC&q=flights+from+SLC+to+BKK+leave+07%2F30%2F2010+return+08%2F11%2F2010+adults%3A1+class%3ACOACH&stoc=0&vo1=Salt+Lake+City%2C+UT+%28SLC%29+-+Salt+Lake+City+International+Airport&o=SLC&ve1=Bangkok%2C+Thailand+%28BKK%29+-+Suvarnabhumi+International&e=BKK&d1=07%2F30%2F2010&r1=08%2F11%2F2010&p=1&b=COACH&baf=true");
        client.waitForBackgroundJavaScript(10000);
        System.out.println("htmlpage init'd");
        //System.out.println(currentPage.getTitleText());
        String textSource = currentPage.asXml();
        System.out.println(textSource);
}
}
谢谢!
HtmlUnit是一个很棒的Java库,允许您以编程方式填写和提交Web表单.我目前正在维护一个用ASP编写的旧系统,而不是按照我的要求每月手动填写这一个Web表单,我试图找到一种方法来自动完成整个任务,因为我保持忘了它.它是一种用于检索一个月内收集的数据的表单.这是我到目前为止编码的内容:
WebClient client = new WebClient();
HtmlPage page = client.getPage("http://urlOfTheWebsite.com/search.aspx");
HtmlForm form = page.getFormByName("aspnetForm");       
HtmlSelect frMonth = form.getSelectByName("ctl00$cphContent$ddlStartMonth");
HtmlSelect frDay = form.getSelectByName("ctl00$cphContent$ddlStartDay");
HtmlSelect frYear = form.getSelectByName("ctl00$cphContent$ddlStartYear");
HtmlSelect toMonth = form.getSelectByName("ctl00$cphContent$ddlEndMonth");
HtmlSelect toDay = form.getSelectByName("ctl00$cphContent$ddlEndDay");
HtmlSelect toYear = form.getSelectByName("ctl00$cphContent$ddlEndYear");
HtmlCheckBoxInput games = form.getInputByName("ctl00$cphContent$chkListLottoGame$0");
HtmlSubmitInput submit = form.getInputByName("ctl00$cphContent$btnSearch");
frMonth.setSelectedAttribute("1", true);
frDay.setSelectedAttribute("1", true);
frYear.setSelectedAttribute("2012", true);
toMonth.setSelectedAttribute("1", true);
toDay.setSelectedAttribute("31", true);
toYear.setSelectedAttribute("2012", true);
games.setChecked(true);
submit.click();
之后click(),我应该等待同一个网页完成重新加载,因为某处有一个表格显示我的搜索结果.然后,当页面加载完成后,我需要将其作为HTML文件下载(非常类似于您最喜爱的浏览器中的"保存页面..."),因为我将清除数据以计算总数,而且我已经使用Jsoup库完成了.
我的问题是:1.如何以编程方式等待网页在HtmlUnit中完成加载?2.如何以编程方式将生成的网页下载为HTML文件?
我已经查看了HtmlUnit文档,但找不到能满足我需求的类.
我正在开展一些项目,我需要从不同的网站上删除一些信息.我正在使用HtmlUnit这个目的,但问题是我无法遍历一页上的元素.
例:
  <div id="some_id">
      <div>
        <div>
           <div>
              ......
                       many divs in between
              ......
               <div id="my_target_div"> some information </div>
                ........
                ........
                 </div>
现在如何获取  内部的divid my_target_div和信息div
我编写了一个程序,用于在单击按钮后从网页中删除源代码.我无法抓住正确的页面,因为我相信正在发送一个AJAX请求,而我不等待这个响应发生.我的代码目前是:
public class Htmlunitscraper { 
  private static String s = "http://cpdocket.cp.cuyahogacounty.us/SheriffSearch/results.aspx?q=searchType%3dSaleDate%26searchString%3d10%2f21%2f2013%26foreclosureType%3d%27NONT%27%2c+%27PAR%27%2c+%27COMM%27%2c+%27TXLN%27";
  public static String scrapeWebsite() throws IOException {
    java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF); 
System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");
    final WebClient webClient = new WebClient();
    final HtmlPage page = webClient.getPage(s);
    final HtmlForm form = page.getForms().get(2);
    final HtmlSubmitInput button = form.getInputByValue(">");
    final HtmlPage page2 = button.click();
    String originalHtml = page2.refresh().getWebResponse().getContentAsString();
    return originalHtml;
  }
}
在引用此链接后,我相信要解决此问题,我可以实现方法"webClient.waitForBackgroundJavaScript(10000)".唯一的问题是我不明白该怎么做,因为每次单击按钮我都会创建一个HtmlPage对象,而不是WebClient对象.我怎样才能使用这种方法来解决问题呢?
我想调用的函数showPage('3');的这个页面,为以后使用页面的源代码.我试着htmlUnit这样做:
WebClient webClient = new WebClient();
webClient.waitForBackgroundJavaScriptStartingBefore(10000);
HtmlPage page = webClient.getPage("http://www.visittrentino.it/it/cosa_fare/eventi/risultati?minEventDate=09012014&maxEventDate=31012014&tp=searchForm.thismonth<p=gennaio");
String javaScriptCode = "showPage('3');";
ScriptResult result = page.executeJavaScript(javaScriptCode);
result.getJavaScriptResult();
System.out.println("result: "+ result);
但它不起作用.打印出来:
结果:net.sourceforge.htmlunit.corejs.javascript.Undefined@a303147
和其他10000警告.我究竟做错了什么?我需要更改此站点的页面以对源代码进行一些爬行.是否有另一种方式(也许更容易)从Java代码调用jsp-function然后在页面源中导航?谢谢你的帮助,祝你有个愉快的一天.
是否有通用的方法来检测selenium浏览器何时打开错误页面?例如,禁用您的互联网连接并执行此操作
driver.get("http://google.com")
在Firefox中,Selenium将加载"再试一次"错误页面,其中包含"Firefox无法与www.google.com上的服务器建立连接"等文本.Selenium不会抛出任何错误.
是否有与浏览器无关的方法来检测这些案例?对于firefox(python),我可以做到
if "errorPageContainer" in [ elem.get_attribute("id") for elem in driver.find_elements_by_css_selector("body > div") ]
但是(1)这看似计算过度(见下面的下一点)和(2)我必须为每个浏览器创建自定义代码.
如果您禁用互联网并使用htmlunit作为浏览器,您将获得一个包含以下html的页面
<html>
    <head></head>
    <body>Unknown host</body>
</html>
如何在不做的情况下检测到这一点
if driver.find_element_by_css_selector("body").text == "Unknown host"
看起来这将是检查每一个页面加载因为通常会是一吨在正文的非常昂贵的.
如果您还知道检测负载问题类型的方法,例如没有互联网连接,无法访问的主机等,则可以获得奖励积分.
我想使用Java API HTMLUnit来检测JavaScript程序在网页上调用的eval()调用的数量.但是,HTMLUnit没有此类JavaScript函数的内置处理程序.如何才能做到这一点?
谢谢.
我写了一个简单的网络刮刀来抓expedia.com.使用Java Selenium HtmlUnitDriver,如果我在本地运行它,我能够成功从网站上抓取数据.
然而,当我上到EC2服务器部署此,它总是返回我在哪里Expedia的检测它作为一个机器人的页面,因此,它会显示这个验证码,以证明人类正在访问它.
我认为它可能与ecpedia服务器的IP地址有关,这些服务器被expedia.com以某种方式列入黑名单?
我试过抓不同的网站,他们不关心/不做人体测试.
知道如何解决这个问题吗?
我尝试但仍被检测为机器人的东西:
更新:实际设置代理服务器给我一个不同的错误:
当前网址为https://www.expedia.com/things-to-do/search?location=Paris&pageNumber=1
htmlString:
<!--?xml version="1.0" encoding="ISO-8859-1"?-->
<html>
 <head> 
  <title>
      500 Internal Server Error
    </title> 
 </head> 
 <body> 
  <h1> Internal Server Error </h1> 
  <p> The server encountered an internal error or misconfiguration and was unable to complete your request. </p> 
  <p> Please contact the server administrator at [no address given] to inform them of the time this error occurred, and the actions you performed just before this error. </p> 
  <p> More …selenium htmlunit web-scraping selenium-webdriver htmlunit-driver
htmlunit ×10
java ×6
javascript ×4
ajax ×2
selenium ×2
web-scraping ×2
firefox ×1
html ×1
performance ×1