`
Foxswily
  • 浏览: 77415 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HtmlUnit实现的网站登录

阅读更多

最近坛子里接连出现基于httpclient登录网站的帖子,也凑个热闹,分享一点基于htmlunit的登录经验

谨以此文祭奠我刚刚逝去的鼠标

----------------------------------------------分割线---------------------------------------------------
HtmlUnit 目前最新版本2.7(2010-04-15 Foxswily本人确认)
基于httpclient封装(甚至已经做好启用httpclient4的准备),模拟浏览器操作,JavaScript支持较全面,包括主流的jQuery类库,这也是它的强大之处,一般网站的JS屏蔽可以轻松突破。

举例说明

    //创建浏览器,可以选择IE、FF等等
    WebClient client = new WebClient(BrowserVersion.INTERNET_EXPLORER_7);
   
    //获取某网站页面
    HtmlPage page = client.getPage("http://xxx.com");
   
    //获取某页面元素,可通过id或name,(具体方式很多 --Foxswily)
    HtmlElement elmt = page.getElementById("someid");
    //HtmlElement elmt = page.getElementByName("somename");
   
    //此例以文本框为例,先点击,再输入,完全跟真浏览器行为一致
    elmt.click();
    elmt.type("somewords");
   
    //获取按钮
    HtmlButton loginBtn = (HtmlButton)page.getElementById("btnId");
    //点击并获得返回结果
    Page resultPage = loginBtn.click();
    //结果拿到了,想干啥您随意
    log.debug(resultPage.getWebResponse().getContentAsString());
    

 


沿着这个思路展开一下,模拟登录不再需要破解什么js逻辑,用户实际做什么代码就模拟什么,轻松多了   

额外的友情提示,Foxswily本人曾在登录用户量众多的discuz论坛时发现个小问题(已提交bug)

造成登录后跳转失效,如有雷同参照解决吧

问题描述
    HtmlPage.executeRefreshIfNeeded()
when html header has meta like "<META HTTP-EQUIV="Refresh" CONTENT="3 URL=h
ttp://www.some.org/some.html">" it throws NumberFormatException.
cause there is no ";" after "3" in the content.
some forum sites have this bad writting html page.

大意就是,自动跳转格式有问题,htmlunit解析不了,直接Exception了,改写HtmlPage的一个方法后通过。

    private void executeRefreshIfNeeded() throws IOException {
        // If this page is not in a frame then a refresh has already happened,
        // most likely through the JavaScript onload handler, so we don't do a
        // second refresh.
        final WebWindow window = getEnclosingWindow();
        if (window == null) {
            return;
        }

        final String refreshString = getRefreshStringOrNull();
        if (refreshString == null || refreshString.length() == 0) {
            return;
        }

        final double time;
        final URL url;

        int index = refreshString.indexOf(";");
        final boolean timeOnly = (index == -1);

        if (timeOnly && refreshString.indexOf(" ") == -1) {
            // Format: <meta http-equiv='refresh' content='10'>
            try {
                time = Double.parseDouble(refreshString);
            } catch (final NumberFormatException e) {
                if (LOG.isErrorEnabled()) {
                    LOG.error("Malformed refresh string (no ';' but not a number): "
                            + refreshString, e);
                }
                return;
            }
            url = getWebResponse().getRequestSettings().getUrl();
        } else {
            if (refreshString.indexOf(";") == -1) {
                index = refreshString.indexOf(" ");
            }
            // Format: <meta http-equiv='refresh'
            // content='10;url=http://www.blah.com'>
            try {
                time = Double.parseDouble(refreshString.substring(0, index).trim());
            } catch (final NumberFormatException e) {
                if (LOG.isErrorEnabled()) {
                    LOG.error("Malformed refresh string (no valid number before ';') "
                            + refreshString, e);
                }
                return;
            }
            index = refreshString.toLowerCase().indexOf("url=", index);
            if (index == -1) {
                if (LOG.isErrorEnabled()) {
                    LOG.error("Malformed refresh string (found ';' but no 'url='): "
                            + refreshString);
                }
                return;
            }
            final StringBuilder buffer = new StringBuilder(refreshString
                    .substring(index + 4));
            if (buffer.toString().trim().length() == 0) {
                // content='10; URL=' is treated as content='10'
                url = getWebResponse().getRequestSettings().getUrl();
            } else {
                if (buffer.charAt(0) == '"' || buffer.charAt(0) == 0x27) {
                    buffer.deleteCharAt(0);
                }
                if (buffer.charAt(buffer.length() - 1) == '"'
                        || buffer.charAt(buffer.length() - 1) == 0x27) {
                    buffer.deleteCharAt(buffer.length() - 1);
                }
                final String urlString = buffer.toString();
                try {
                    url = getFullyQualifiedUrl(urlString);
                } catch (final MalformedURLException e) {
                    if (LOG.isErrorEnabled()) {
                        LOG.error("Malformed URL in refresh string: " + refreshString, e);
                    }
                    throw e;
                }
            }
        }

        final int timeRounded = (int) time;
        getWebClient().getRefreshHandler().handleRefresh(this, url, timeRounded);
    }
 




分享到:
评论
7 楼 Foxswily 2010-04-16  
asialee 写道
我做的时候遇到一个问题,如何提交一个没有submit按钮的一个form,就是这个form没有提交按钮,我们不能调用它的click方法进行提交,有没有什么好的办法对form直接操作的,我用的也是htmlunit。


没有submit按钮总有某个链接调用js提交这个form的地方,找到这个链接不就好了?说白就是人操作怎么点,程序就怎么点
6 楼 asialee 2010-04-16  
我做的时候遇到一个问题,如何提交一个没有submit按钮的一个form,就是这个form没有提交按钮,我们不能调用它的click方法进行提交,有没有什么好的办法对form直接操作的,我用的也是htmlunit。
5 楼 Foxswily 2010-04-16  
caoyangx 写道
相比selenium有何优势?


先说说本帖内容以外的事,敢问阁下自己对这个问题有何领悟?
我来臆测一下提问的初衷吧
case 1. 提问者了解selenium而不了解htmlunit。ok,请先把你知道的selenium的优缺点列在这以便大家对比。

case 2.提问者了解htmlunit而不了解selenium。请恕我先问一句,您google过了么?

case 3.都不了解。 不说什么了。

闲话说完了,言归正传
----------------------------------------------------------------------------
简单了解了一下selenium,基于web的b/s测试框架,自身就是b/s服务,实现多浏览器验证,常规用法是面向测试人员编写测试case测试用的。支持其他语言通过http调用。

htmlunit本意也是测试用。但个人习惯把它当作是没有view的浏览器,可以完全程序控制。

工具是死的,人是活的,想怎么用就发挥想象力吧。
4 楼 caoyangx 2010-04-16  
相比selenium有何优势?
3 楼 robertliudeqiang 2010-04-15  
这么好的工具,晕,我找的是HTTPUnit,这个工具叫HTMLUnit,谢谢分享。
2 楼 gstarwd 2010-04-15  
呵呵  在支持下
1 楼 gstarwd 2010-04-15  
不错~~~有人写 htmlcleaner的 没  呵呵

相关推荐

    htmlunit java版无界面浏览器 网页自动登录

    htmlunit java版无界面浏览器 实现网页自动登录利器 官方最新下载 htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源...

    htmlunit-2.20.zip

    2. **JavaScript支持**:HTMLUnit可以解析和执行JavaScript代码,这对于现代Web应用来说是至关重要的,因为许多动态网页依赖JavaScript来加载内容和实现交互。 3. **DOM操作**:通过HTMLUnit提供的API,开发者可以...

    htmlunit2.8 + jsoup1.7网站数据抓取

    本项目重点介绍了如何利用htmlunit2.8和jsoup1.7这两个强大的库来实现这一目标。下面我们将深入探讨这两个工具以及它们在数据抓取中的应用。 **htmlunit2.8** HtmlUnit是一个Java库,模仿了一个无头浏览器,能够...

    htmlunit爬取网页并保存成Excel

    - 考虑网站的反爬策略,可能需要登录或使用代理IP。 - 数据清洗和格式化是必要的,以确保Excel文件的可读性。 8. **mainboard-project**: 这可能是项目的名字,可能包含了实现上述功能的源代码。如果需要进一步...

    htmlunit爬虫技术

    在“htmlunit爬虫技术”中,我们将深入探讨如何利用HTMLUnit来实现高效的网络爬虫。 HTMLUnit的核心特性包括: 1. **JavaScript支持**:HTMLUnit能够执行JavaScript代码,这对于许多动态加载内容的现代网站来说至...

    giant-htmlunit_test.rar

    通过查看这些文件,你可以更深入地了解HTMLUnit的用法,学习如何根据实际需求调整代码以实现特定的功能,比如抓取特定数据或进行更复杂的网页交互。 总结来说,HTMLUnit是Java环境下的一款强大工具,它可以用来进行...

    利用HtmlUnit操作DLP的用户新增和删除

    标题 "利用HtmlUnit操作DLP的用户新增和删除" 暗示了本文将探讨如何使用HtmlUnit库来实现对数据泄露防护(Data Loss Prevention,简称DLP)系统的用户管理功能,包括添加新用户和删除已有用户。HtmlUnit是一个无头...

    htmlunit-2.15.jar

    htmlunit java版无界面浏览器 实现网页自动登录利器 官方最新下载 htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源...

    java爬虫案例

    在这个"javahtmlunit爬虫案例入门"中,我们将深入探讨如何使用Java和HtmlUnit库来实现一个简单的电商网站爬虫,同时下载对应的图片。 首先,HtmlUnit是一个无头浏览器模拟器,它允许程序员在Java环境中执行...

    HttpClient4.1.2 & HtmlUnit2.9 处理文件下载

    这篇博客文章可能详细介绍了如何利用这两个库来实现文件的下载功能。 HttpClient 是Apache基金会的一个项目,提供了丰富的HTTP客户端API,用于执行各种HTTP协议操作,如GET、POST、PUT等。HttpClient4.1.2 版本是这...

    htmlunit jar包

    6. **性能优势**:由于HTMLUnit是纯Java实现,不需要依赖外部浏览器,因此它的执行速度比使用真实浏览器进行自动化测试快得多。这使得它成为大规模测试的理想选择。 7. **测试框架集成**:HTMLUnit可以方便地与...

    JAVA使用HtmlUnit爬虫工具模拟登陆CSDN案例

    HtmlUnit是一个基于JAVA的爬虫工具,能够模拟浏览器的行为,从而实现自动化的爬虫操作。 在本案例中,我们首先需要引入HtmlUnit和Jsoup的依赖项,使用Maven配置进行依赖项的管理。HtmlUnit提供了一个WebClient类,...

    webCrawl:使用HTMLUnit,PhantomJS和JBrowserDriver抓取网址

    本文将深入探讨如何使用HTMLUnit、PhantomJS和JBrowserDriver这三种无头浏览器技术来实现网页抓取。这些工具都基于Java语言,因此适合Java开发者进行网页抓取工作。 首先,HTMLUnit是一个强大的无头Java浏览器,它...

    Android利用爬虫实现模拟登录的实现实例

    在实现Android爬虫实现模拟登录的实现实例时,需要选择合适的爬虫库,HtmlUnit和Jsoup是两个常用的爬虫库。HtmlUnit是一个功能强大的爬虫库,可以模拟浏览器的行为,但是它不支持Android平台。Jsoup是一个轻量级的...

    淘宝登录java源码-ghost-login:幽灵登录

    模拟登录一些常见的网站 主要基于以下的 Java的第三 library HTTP请求以及响应 模拟自动登录 验证码识别 加密解密 Done (已经实现) (待实现) (已经实现) (还有点问题) (还有点问题) (已经实现) (待实现) (待实现) ...

    网络爬虫实现源码

    在这个“网络爬虫实现源码”中,我们主要关注的是利用Jsoup和HtmlUnit这两个Java库来构建爬虫引擎,以及如何从网站上获取图片地址信息。 Jsoup是一个流行的Java库,用于解析HTML文档。它的主要功能包括提取结构化...

    java实现后台打开网页存为截图

    总结来说,Java实现后台打开网页存为截图的过程涉及网络请求、网页渲染和图像处理技术,需要结合使用Java标准库和其他第三方工具,如HtmlUnit、Selenium WebDriver等。通过这些技术,我们可以构建出一个灵活且功能...

    通过URL地址获取网页生成jpg图片

    我们将主要使用Java语言来实现这一功能,因为它具有丰富的库和跨平台的特性。 首先,我们需要一个能够处理网络请求和网页解析的库。Apache HttpClient是一个广泛使用的HTTP客户端库,它可以让我们方便地从URL获取...

    腾讯新浪微博模拟登录最新源码(java版)

    这个“腾讯新浪微博模拟登录最新源码(java版)”提供了一种使用Java编程语言实现这一功能的方法。下面将详细介绍这个源码可能涉及的关键知识点。 1. **HTTP协议与网络请求**:模拟登录首先需要理解HTTP协议,包括...

    网络爬虫简单实现

    在网络爬虫的实现过程中,还可能涉及反爬策略的应对,如处理验证码、登录验证,以及IP代理池的使用。例如,使用Selenium库模拟浏览器行为,可以解决JavaScript动态加载和验证码问题。IP代理池则能帮助更换请求的IP...

Global site tag (gtag.js) - Google Analytics