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

最近要弄一个爬虫程序,想着先来个简单的模拟登陆, 在权衡JxBrowserHtmlUnit 两种技术,  JxBowser有界面呈现效果,但是对于某些js跳转之后的效果获取比较繁琐。

随后考虑用HtmlUnit, 想着借用咱们CSND的登陆练练手。谁知道CSDN的登陆,js加载时间超长,不设置长一点的加载时间,按钮提交根本没效果,js没生效。 具体看代码注释吧。 奉劝做爬虫的同志们,千万别用CSDN登陆练手,坑死我了。

maven配置如下:

 <dependencies>
 <!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit -->
 <dependency>
 <groupId>net.sourceforge.htmlunit</groupId>
 <artifactId>htmlunit</artifactId>
 <version>2.18</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
 <dependency>
 <groupId>org.jsoup</groupId>
 <artifactId>jsoup</artifactId>
 <version>1.9.2</version>
 </dependency>
 </dependencies>

代码如下:

package com.test;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.SilentCssErrorHandler;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlButtonInput;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
import com.gargoylesoftware.htmlunit.util.Cookie;
public class SimulateLogin
{
 //访问的目标网址(CSDN)
 private static String TARGET_URL = "https://passport.csdn.net/account/login?from=http://www.csdn.net";
 public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException
 {
  // 模拟一个浏览器
  WebClient webClient = new WebClient(BrowserVersion.CHROME);
  // 设置webClient的相关参数
  webClient.setCssErrorHandler(new SilentCssErrorHandler());
  //设置ajax
  webClient.setAjaxController(new NicelyResynchronizingAjaxController());
  //设置支持js
  webClient.getOptions().setJavaScriptEnabled(true);
  //CSS渲染禁止
  webClient.getOptions().setCssEnabled(false);
  //超时时间
  webClient.getOptions().setTimeout(50000);
  //设置js抛出异常:false
  webClient.getOptions().setThrowExceptionOnScriptError(false);
  //允许重定向
  webClient.getOptions().setRedirectEnabled(true);
  //允许cookie
  webClient.getCookieManager().setCookiesEnabled(true);
  // 模拟浏览器打开一个目标网址
  HtmlPage page = webClient.getPage(TARGET_URL);
  /**等待js加载完全,CSDN这点 特别坑,js加载时间超长!!!!!!! 后人切记不要用CSDN模拟登陆!!!!!!!**/
  webClient.waitForBackgroundJavaScript(10000*3);
  // 根据form的名字获取页面表单,也可以通过索引来获取:page.getForms().get(0)
  HtmlForm form = (HtmlForm) page.getElementById("fm1");
  HtmlTextInput username = (HtmlTextInput) form.getInputByName("username");
  HtmlPasswordInput password = (HtmlPasswordInput) form.getInputByName("password");
  username.setValueAttribute("********"); //用户名
  password.setValueAttribute("********"); //密码
  HtmlButtonInput button = (HtmlButtonInput) page.getByXPath("//input[contains(@class, 'logging')]").get(0);
//  ScriptResult result = page.executeJavaScript("javascript:document.getElementsByClassName('logging')[0].click()");
//  HtmlPage retPage = (HtmlPage) result.getNewPage();
  HtmlPage retPage = button.click();
  // 等待JS驱动dom完成获得还原后的网页
  webClient.waitForBackgroundJavaScript(1000);
  //输出跳转网页的地址
  System.out.println(retPage.getUrl().toString());
  //输出跳转网页的内容
  System.out.println(retPage.asXml());
  //获取cookie
  Set<Cookie> cookies = webClient.getCookieManager().getCookies();
  Map<String, String> responseCookies = new HashMap<String, String>();
  for (Cookie c : cookies) {
   responseCookies.put(c.getName(), c.getValue());
   System.out.print(c.getName()+":"+c.getValue());
  }
  webClient.close();
  System.out.println("Success!");
 }
}

另外,CSDN的JS总是莫名其妙的报一堆错,如果不想看,想忽略的话,在创建WebClient前加上如下代码:

  //设置日志级别,原页面js异常不打印
  LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); 

  java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit")
   .setLevel(Level.OFF); 

  java.util.logging.Logger.getLogger("org.apache.commons.httpclient")
   .setLevel(Level.OFF); 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • springboot+webmagic实现java爬虫jdbc及mysql的方法

    前段时间需要爬取网页上的信息,自己对于爬虫没有任何了解,就了解了一下webmagic,写了个简单的爬虫. 一.首先介绍一下webmagic: webmagic采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取.页面下载.内容抽取.持久化),支持多线程抓取,分布式抓取,并支持自动重试.自定义UA/cookie等功能. 实现理念: Maven依赖: <dependency> <groupId>us.codecraft</groupId> <artifactId

  • Java 爬虫工具Jsoup详解

    Java 爬虫工具Jsoup详解 Jsoup是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据. jsoup 的主要功能如下: 1. 从一个 URL,文件或字符串中解析 HTML: 2. 使用 DOM 或 CSS 选择器来查找.取出数据: 3. 可操作 HTML 元素.属性.文本: jsoup 是基于 MIT 协议发布的,可放心使用于商业项目. js

  • Java爬虫Jsoup+httpclient获取动态生成的数据

    Java爬虫Jsoup+httpclient获取动态生成的数据 前面我们详细讲了一下Jsoup发现这玩意其实也就那样,只要是可以访问到的静态资源页面都可以直接用他来获取你所需要的数据,详情情跳转-Jsoup爬虫详解,但是很多时候网站为了防止数据被恶意爬取做了很多遮掩,比如说加密啊动态加载啊,这无形中给我们写的爬虫程序造成了很大的困扰,那么我们如何来突破这个梗获取我们急需的数据呢, 下面我们来详细讲解一下如何获取 String startPage="https://item.jd.com/1147

  • java实现爬虫爬网站图片的实例代码

    第一步,实现 LinkQueue,对url进行过滤和存储的操作 import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; public class LinkQueue { // 已访问的 url 集合 private static Set<String> visitedUrl = Collecti

  • Java实现的爬虫抓取图片并保存操作示例

    本文实例讲述了Java实现的爬虫抓取图片并保存操作.分享给大家供大家参考,具体如下: 这是我参考了网上一些资料写的第一个java爬虫程序 本来是想获取煎蛋网无聊图的图片,但是网络返回码一直是503,所以换了网站 import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStre

  • JAVA爬虫实现自动登录淘宝

    目的 想通过JAVA代码实现淘宝网的自动登录,通过获取设置的登录信息自动填写并提交.目前这个代码是小编测试过的,可以通过,后期不知道淘宝会不会有相应的封堵策略. 代码分享: package util; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.fi

  • JAVA超级简单的爬虫实例讲解

    爬取整个页面的数据,并进行有效的提取信息,注释都有就不废话了: public class Reptile { public static void main(String[] args) { String url1=""; //传入你所要爬取的页面地址 InputStream is=null; //创建输入流用于读取流 BufferedReader br=null; //包装流,加快读取速度 StringBuffer html=new StringBuffer(); //用来保存读取页

  • 分享一个简单的java爬虫框架

    反复给网站编写不同的爬虫逻辑太麻烦了,自己实现了一个小框架 可以自定义的部分有: 请求方式(默认为Getuser-agent为谷歌浏览器的设置),可以通过实现RequestSet接口来自定义请求方式 储存方式(默认储存在f盘的html文件夹下),可以通过SaveUtil接口来自定义保存方式 需要保存的资源(默认为整个html页面) 筛选方式(默认所有url都符合要求),通过实现ResourseChooser接口来自定义需要保存的url和资源页面 实现的部分有: html页面的下载方式,通过Htt

  • java 爬虫详解及简单实例

    Java爬虫 一.代码 爬虫的实质就是打开网页源代码进行匹配查找,然后获取查找到的结果. 打开网页: URL url = new URL(http://www.cnblogs.com/Renyi-Fan/p/6896901.html); 读取网页内容: BufferedReader bufr = new BufferedReader(new InputStreamReader(url.openStream())); 正则表达式进行匹配: tring mail_regex = "\\w+@\\w+

  • java实现一个简单的网络爬虫代码示例

    目前市面上流行的爬虫以python居多,简单了解之后,觉得简单的一些页面的爬虫,主要就是去解析目标页面(html).那么就在想,java有没有用户方便解析html页面呢?找到了一个jsoup包,一个非常方便解析html的工具呢. 使用方式也非常简单,引入jar包: <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.8.

随机推荐