html弹窗能进行复杂操作码,htmlunit —— 一个强大的模拟浏览器jar包,可在代码中实现浏览器操作(如填写表单,点击按钮)...

htmlunit —— 一个强大的模拟浏览器jar包,可在代码中实现浏览器操作(如填写表单,点击按钮)

今天爬数据真是爬的绝望,下午2点多开始写到下班,还主动加了一小时班,然后回到家又码到10点。终于爬出来了。

用java自带的 HttpURLConnection 模拟请求,返回的都是乱码。用Jsoup也是一样的。

用postman测了几下,结果一致。

应该是做了什么验证 ,导致代码伪装他的 ajax 请求是不会返回正确数据的。

还好 htmlunit 拯救了我。

htmlunit简介:

一个Java代码版浏览器,它没有图形界面。它可以允许使用网页的一些高级操作,如填写表单、点击链接。你只需要调用getPage(url)方法,然后找到一个超链接,调用click()方法点击它,你就可以得到点击后返回的页面。包括Javascript、Ajax、cookie等都是自动处理的。浏览器能做什么,它就能做什么。

导入jar包后直接用,我今天写的代码就贴在下面了。

注释大部分都是一点点敲的,从创建到使用,等待加载、获取节点、设置参数、点击事件等等都写了。应该算是比较详细

package top.yibobo.htmlunittest;

import com.gargoylesoftware.htmlunit.BrowserVersion;

import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;

import com.gargoylesoftware.htmlunit.WebClient;

import com.gargoylesoftware.htmlunit.html.*;

import java.io.IOException;

public class HtmlUnitTest {

public static void main(String[] args) {

WebClient webClient = new WebClient(BrowserVersion.CHROME);//模仿谷歌浏览器

webClient.getOptions().setThrowExceptionOnScriptError(false);//当JS执行出错的时候是否抛出异常, 这里选择不需要

webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//当HTTP的状态非200时是否抛出异常, 这里选择不需要

webClient.getOptions().setActiveXNative(false);

webClient.getOptions().setCssEnabled(false);//是否启用CSS, 因为不需要展现页面, 所以不需要启用

webClient.getOptions().setJavaScriptEnabled(true); //很重要,启用JS

webClient.setAjaxController(new NicelyResynchronizingAjaxController());//很重要,设置支持AJAX

try {

HtmlPage page = webClient.getPage("https://www.taodaxiang.com/credit2");

webClient.waitForBackgroundJavaScript(1000);//等待1秒,等页面加载完

//得到所有表单,得到第一个,得到该表单下name=‘ww’的input,最后设置他的value值

HtmlForm htmlForm = page.getForms().get(0);

HtmlInput ww = htmlForm.getInputByName("ww");

ww.setValueAttribute("koishipyb");

//这样好像也能设置焦点,但是很僵硬的是似乎不会去掉原有的参数

/*HtmlElement ww = (HtmlElement)page.getElementById("ww");

ww.focus();

ww.type("koishipyb");*/

//我这个点击按钮没id就算了,还没得name的,只有class,只能得到所有的input然后遍历咯

HtmlElement submit = null;

//得到所有的input

DomNodeList elementsByTagNameSubmit = page.getElementsByTagName("input");

for (DomElement domElement : elementsByTagNameSubmit) {

// 根据目标元素 class 属性循环匹配

if (domElement.getAttribute("class").equals("uc-button")) {

submit = (HtmlElement) domElement;

}

}

page = submit.click();//触发点击事件

webClient.waitForBackgroundJavaScript(150);//等0.1秒,让ajax跑完基本够了

System.out.println(page.asXml());//输出该页面的xml表现形式

//之后还可以使用jsoup对该xml进行别的操作

} catch (IOException e) {

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值