htmlunit抓取动态网页(Java爬取博客阅读文章最多)

优采云 发布时间: 2022-02-19 03:29

  htmlunit抓取动态网页(Java爬取博客阅读文章最多)

  更新,这很尴尬,这个文章博客是阅读最多的文章,但也是最被践踏的。

  爬取思路:

  所谓动态,就是通过请求后台,可以动态改变对应的html页面,开始时页面并不是全部显示出来的。

  大多数操作都是通过请求完成的,一个请求,一个返回。在大多数网页中,请求往往被开发者隐藏在 js 代码中。

  因此,将爬取动态网页的思路转化为找到对应的js代码并执行对应的js代码,从而可以通过java代码动态改变页面。

  而当页面能够正确显示的时候,我们就可以像爬静态网页一样爬取数据了!

  首先,可以使用htmlunit来模拟鼠标点击事件,很容易实现:

   /**

* 通过htmlunit来获得一些搜狗的网址。

* 通过模拟鼠标点击事件来实现

* @param key

* @return

* @throws Exception

*/

public String getNextUrl(String key){

String page = new String();

try {

WebClient webClient = new WebClient();

webClient.getOptions().setCssEnabled(false);

webClient.getOptions().setJavaScriptEnabled(false);

//去拿网页

HtmlPage htmlPage = webClient.getPage("http://pic.sogou.com/");

//得到表单

HtmlForm form = htmlPage.getFormByName("searchForm");

//得到提交按钮

HtmlSubmitInput button = form.getInputByValue("搜狗搜索");

//得到输入框

HtmlTextInput textField = form.getInputByName("query");

//输入内容

textField.setValueAttribute(key);

//点一下按钮

HtmlPage nextPage = button.click();

String str = nextPage.toString();

page = cutString(str);

webClient.close();

} catch (Exception e) {

e.printStackTrace();

}

return page;

}

  如上图,我只是通过java代码将关键字填入搜索我的,然后通过getInputByValue方法得到按钮控件,最后直接button.click(),

  即可以模拟点击,将点击后返回的http请求解析成html页面。

  

  这个功能其实很强大。比如你可以使用这个功能来模拟抢票,或者使用点击事件,加上搜索相关知识,将整个系统下线,并以html的形式保存。

  接下来就是使用强大的htmlunit来执行js代码了。

  先写一个简单的jsp页面:

  

Insert title here

原数字

function change(value) {

document.getElementById("test").innerHTML = value;

return "hello htmlUnit";

}

  从上面可以看出,jsp页面很简单,只是一个函数变化,用来调用htmlUnit。

  接下来是一个使用 htmlunit 的类。此类通过支持 JavaScript 解释器来工作,

  然后将自己编写的JavaScript代码嵌入到页面中执行,获取执行后的返回结果并返回页面。

  package com.blog.anla;

import com.gargoylesoftware.htmlunit.ScriptResult;

import com.gargoylesoftware.htmlunit.WebClient;

import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class TestMyOwnPage {

private void action() {

WebClient webClient = new WebClient();

try {

webClient.getOptions().setCssEnabled(false);

webClient.getOptions().setJavaScriptEnabled(true); // 设置支持JavaScript。

// 去拿网页

HtmlPage htmlPage = webClient

.getPage("http://localhost:8989/testHtmlScrop/index.jsp");

String s = "更改后的数字";

ScriptResult t = htmlPage.executeJavaScript("change(\"" + s

+ "\");", "injected script", 500);

// 这里是在500行插入这一小行JavaScript代码段,因为如果在默认的1行,那不会有结果

// 因为js是顺序执行的,当你执行第一行js代码时,可能还没有渲染body里面的标签。

HtmlPage myPage = (HtmlPage) t.getNewPage();

String nextPage = myPage.asXml().toString();

String nextPage2 = myPage.asText().toString();

} catch (Exception e) {

e.printStackTrace();

} finally {

webClient.close();

}

}

public static void main(String[] args) {

TestMyOwnPage tmop = new TestMyOwnPage();

tmop.action();

}

}

  t.getNewPage()中有两个属性,一个是

  javaScriptResult:执行这段代码后返回的结果,如果有(我上面写的,返回hello htmlunit),如果没有(返回Undefined)。

  newPage_:执行此代码后返回的整个页面。

  结果如下:

  

  这段代码执行的最终结果如下:

  asXml():将整个页面的html代码返回给我们:

  

  而asText()只返回页面上可以显示的值,即head标签和label标签:

  

  这种执行思路还可以动态执行相应的js代码,从而爬取需要的数据。

  -------------------------------------------------- --------------------------------------2017 年 7 月更新---------- -------------------------------------- -------------------------------------------------- -----

  这两天一直在做一个关于网络爬虫的系统

  然而,当我开始攀爬时,我发现了一个问题。js的动态页面爬不下来。

  网上找了很多方法,google也问了,主要是指htmlunit,下面是核心代码,

  使用htmlunit的主要目的是模拟浏览器操作,因为有些链接点击无法直接通过src获取url,一般使用JavaScript。

  简单拼接后的URL,所以用htmlunit直接模拟浏览器点击比较简单。

   WebClient webClient = new WebClient();

webClient.getOptions().setJavaScriptEnabled(true); //启用JS解释器,默认为true

webClient.getOptions().setCssEnabled(false); //禁用css支持

webClient.getOptions().setThrowExceptionOnScriptError(false); //js运行错误时,是否抛出异常

webClient.getOptions().setTimeout(20000);

HtmlPage page = wc.getPage("http://www.hao123.com");

//我认为这个最重要

String pageXml = page.asXml(); //以xml的形式获取响应文本

/**jsoup解析文档*/

Document doc = Jsoup.parse(pageXml, "http://cq.qq.com");

  这个时候,就可以得到jsoup中的document对象了,接下来就好写了,就像爬普通静态网页一样了。

  不过,webclient解析是还是会出现一些问题,js的问题,

  主要是由于目标url的js写的有些问题,但在实际的浏览器中却会忽略,eclipse中会报异常。

  今天看,好多人踩了,可能我当时没认真写博客吧。如果想找java爬虫项目,可以去我的专栏

  图片搜索包括使用jsoup爬取图片,以及lire索引和搜索图片。

  玫瑰会在你的手中留下挥之不去的芬芳。有什么问题可以多多讨论!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线