htmlunit 模拟登录 数字验证码

使用htmlunit的好处有两点,相比httpclient,htmlunit是对浏览器的模拟,比如你定位一个按钮,就可以执行click()方法,此外不需要象在httpclient中一样编写复杂的代码,如一堆request header还有一大堆请求参数,你只需要填写用户名,密码,验证码即可,就象在使用一个没有界面的浏览器,当然更重要的是htmlunit对js的支持设置极其简单

1.添加maven的htmlunit(标红)依赖

 1  <dependencies>
 2     <dependency>
 3         <groupId>junit</groupId>
 4         <artifactId>junit</artifactId>
 5         <version>${junit.version}</version>
 6         <scope>test</scope>
 7     </dependency>
 8     <dependency>
 9         <groupId>com.alibaba</groupId>
10         <artifactId>fastjson</artifactId>
11         <version>1.2.47</version>
12     </dependency>
13     <dependency>
14         <groupId>org.jsoup</groupId>
15         <artifactId>jsoup</artifactId>
16         <version>1.11.3</version>
17     </dependency>
18     <dependency>
19         <groupId>net.sourceforge.htmlunit</groupId>
20         <artifactId>htmlunit</artifactId>
21         <version>2.18</version>
22     </dependency>
23
24   </dependencies>

2.思路

定位用户名,密码,验证码框等元素,填写即可,验证码可以先把图片下载下来然后手动输入,也可以使用tess4j进行图片识别,这里是手动输入

测试的网站,是一个伪ajaxsubmit,测试多次发现需要二次输入验证码才能正确登录,但令人疑惑的是两次生成的验证码一样(如果不一样说明你第一次输入错误)

 1 public static void main(String[] args) throws Exception {
 2         WebClient webClient = new WebClient(BrowserVersion.CHROME);
 3         webClient.getOptions().setJavaScriptEnabled(true);
 4         webClient.getOptions().setCssEnabled(true);
 5         webClient.getOptions().setThrowExceptionOnScriptError(false);
 6     //    webClient.getOptions().setThrowExceptionOnFailingStatusCode(true);
 7         webClient.getOptions().setActiveXNative(true);
 8
 9
10         //ajax
11         webClient.setAjaxController(new NicelyResynchronizingAjaxController());
12         webClient.getOptions().setUseInsecureSSL(false);
13
14
15         //允许重定向
16         webClient.getOptions().setRedirectEnabled(true);
17
18
19         //连接超时
20         webClient.getOptions().setTimeout(5000);
21
22         //js执行超时
23         webClient.setJavaScriptTimeout(10000*3);
24
25         //对于此网站务必开启
26         webClient.getCookieManager().setCookiesEnabled(true);
27
28         String url = "https://www.zuhaowan.com/login/";
29         HtmlPage page = webClient.getPage(url);
30         webClient.waitForBackgroundJavaScript(5000);
31
32
33
34
35         HtmlPage newPage = readyPage(page, webClient);
36     //    String content1 = newPage.asXml();
37     //    IOUtils.write(content1.getBytes(),new FileWriter(new File("f:/content1.txt")));
38
39         //如果页面url没有变化重新进行一次登录
40         if(newPage.getUrl().toString().equals(url)) {
41             System.out.println("出现错误请重新登录-------------");
42             HtmlPage result = readyPage(newPage,webClient);
43             System.out.println("url----------------"+result.getUrl());
44             System.out.println("页面----" + result.asXml());
45         //    IOUtils.write(result.asXml(),new FileWriter(new File("f:/content2.txt")));
46
47         }
48
49         webClient.close();
50     }
51
52
53
54     public static HtmlPage readyPage(HtmlPage page,WebClient webClient) throws Exception {
55         //封装页面元素
56         HtmlForm form  = page.getHtmlElementById("form2");
57         HtmlTextInput loginname = form.getInputByName("loginname");
58         loginname.setValueAttribute("用户名");
59         HtmlPasswordInput loginpwd = form.getInputByName("loginpwd");
60         loginpwd.setValueAttribute("密码");
61
62         //验证码输入框
63         HtmlTextInput verify_code = form.getInputByName("verify_code");
64
65         //验证码图片
66         HtmlImage verify_img = (HtmlImage) page.getElementById("verify_img");
67         UUID randomUUID = UUID.randomUUID();
68         //保存
69         verify_img.saveAs(new File("./src/main/resources/image/verifyimg"+ randomUUID.toString() +".png"));
70
71         System.out.println("验证码图片已保存!");
72         System.out.println("请输入验证码");
73         //手动输入验证码
74         Scanner scanner = new Scanner(System.in);
75         String code = scanner.nextLine();
76         System.out.println("验证码-------------" + code);
77         verify_code.setValueAttribute(code);
78
79
80         //登录按钮
81         HtmlAnchor login = page.getHtmlElementById("loginsubmit");
82         HtmlPage newPage = login.click();
83
84         //等待js加载
85         webClient.waitForBackgroundJavaScript(5000);
86         return newPage;
87
88     }
89     

3.控制台部分输出截图

原文地址:https://www.cnblogs.com/tele-share/p/9445075.html

时间: 2024-07-30 06:46:01

htmlunit 模拟登录 数字验证码的相关文章

C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站

原文:C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站 我们经常会碰到需要程序模拟登录一个网站,那如果网站需要填写验证码的要怎样模拟登录呢?这篇文章利用了 HttpWebRequest 和 HttpWebResponse 模拟登录了有验证码的网站. 程序设计的界面很简单,三个TextBox分别输入用户名.密码和验证码,一个Image控件显示从网站请求到的验证码图片,还有两个按钮,一个换验证码,一个登录. 写程序前,先用浏览器的开发者工具观察下登

利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站

需要用程序模拟登录一个网站,登录的时候需要填写验证码. 设计的界面很简单: 写程序前,先用浏览器的开发者工具观察下登录页面有什么请求,我这里用的是 FireBug,下面两个图是在 FireBug 的网络面板中截的. 可以看到打开登录页面时有个 GET 请求验证码的,在 FireBug 中可以看到: 上面的图上可以看到这一句: Set-Cookie GUID=c89eabb62d9d4f35b491a8afd371b4ad; path=/ 这里请求的验证码页面保存了一个Cookie. 然后我们输入

Python爬虫模拟登录带验证码网站

问题分析: 1.爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 2.首先得明白cookie的作用,cookie是某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据.因此我们需要用Cookielib模块来保持网站的cookie. 3.这个是要登陆的地址 http://202.115.80.153/ 和验证码地址 http://202.115.80.15

php_curl模拟登录有验证码实例

<?php /** * @author 追逐__something * @version $id */ define('SCRIPT_ROOT',dirname(__FILE__).'/'); $act = trim($_REQUEST['act']); switch($act) { case 'login': // 获取验证码 $code = trim($_REQUEST['code']); // $loginParams为curl模拟登录时post的参数 $loginParams['act'

php使用curl模拟登录带验证码的网站

需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\Controller; use Think\Controller; class LoginController extends Controller { protected $cookieName = array('cookie_verify', 'cookie_verify'); protected $

C#使用tesseract3.02识别验证码模拟登录

一.前言 使用tesseract3.02识别有验证码的网站 安装tesseract3.02 在VS nuget 搜索Tesseract即可. 二.项目结构图 三.项目主要代码 1 using System; 2 using System.Collections.Concurrent; 3 using System.Collections.Generic; 4 using System.Diagnostics; 5 using System.Drawing; 6 using System.IO;

curl 模拟登录微信公众平台带验证码

这段时间一直写个项目, 从切图到前端到后台都要搞定,真tm累. 今天下午手残,不停用错误的密码去模拟登录微信公众平台,结果后来出现验证码,瞬间悲剧(菜鸟从来没搞过带验证码的). 研究了一下,发现其实很简单,直接把生成的二维码图片拉过来,让用户自己输入,再提交一遍表单即可.其实中间还是有些坑,比如生成验证码的时候,要把cookie保存下,登录的时候要带上这个cookie,要不然会总是提示需要验证码. 客户端: 1 <body> 2 <form> 3 <p><inpu

php通过curl扩展进行模拟登录(含验证码)

以下为本人工作中遇到的需要做的事情,之前也没怎么用过curl,查了好多资料,才稍微弄明白一点:本文所有内容只是自己平日工作的记录,仅供大家参考: <?php/*** 模拟登录*/header("Content-type: text/html; charset=UTF-8");//初始化变量$cookie_file = "valid.tmp";$login_url = "http://v3.gds.org.cn/login.aspx";$ve

PHP使用CURL实现对带有验证码的网站进行模拟登录的方法

网上的很多模拟登录程序,大都是通过服务程序apache之类的运行,获取到验证码之后显示在网页上,然后填上再POST出去,这样虽然看起来很友 好,但是既然模拟登录,登录后所干的事情就不一定是短时间完成的,所以这就要受到php最大执行时间的限制,而且有些操作还有可能权限不足. 本文提供了一个程序实例,思路就是获取到验证码之后把验证码存储为一个图片,然后程序休眠20秒,在20秒之后由用户手动查看图片,并把验证码填写 到code.txt文件中,20秒休眠完成后,程序会读code.txt的验证码,这样再带